Temat: znów trasowanie

Cześć,

Chciałbym spytać, czy wie ktoś, jak nadać przypisać konkretnemu url'owi dane, dostępne dla kontrolera i modelu ?
Konkretnie chcę aby adres.pl/pl/pokaz - pierwszy człon pl tak odbierać, żeby dało się lepie kontrolować kodem, znaczy się:

public function index ($lang = null, $data = null) {} - w tym przypadku zawszę sprawdzę i lang i data.
Ale jak nie będzie $lang, reszta kodu nie zobaczy tego, $data zajmie miejsce 1 w funkcji i kod się wykona ale już inaczej niż chcę.

Dziękuję.
Kamil Kosiński

Kamil Kosiński CTO w
DobryMechanik.pl

Temat: znów trasowanie

Dwie opcje:

a) Musisz mieć jakiś default dla lang, np. "none" i w kontrolerze już decydować co ma się dziać przy braku języka. Musisz jednak pamięta, żeby we wszystkich linkach dawać "none" dla języka jeśli nie masz określonego języka

b) Użyć named params i mieć adresy tupu: adres.pl/lang:pl/data:pokaz. Wtedy pamiętaj, żeby w routes dodać Router::connectNamed(array('lang', 'data'), array('default' => true));

Temat: znów trasowanie

Dziękuję,
wertuję, podręcznik, już dużo mi się wyjaśniło.
Mam jednak pare krótkich pytań, proszę Was o objaśnienie, dzięki z góry.

1. Po co jest ta opcja:
you may want to have routed elements be passed arguments instead.

Router::connect(
'/blog/:id-:slug', // E.g. /blog/3-CakePHP_Rocks
array('controller' => 'blog', 'action' => 'view'),
array(
// order matters since this will simply map ":id" to
// $articleId in your action
'pass' => array('id', 'slug'),
'id' => '[0-9]+'
)
);

Inaczej, po co się stosuje to:
'pass' => array('id', 'slug'), jakie są korzyści ?

2. Po co korzystać z named w ten sposób, skoro reoute elements chyba też dadzą radę:

Router::connect(
'/:controller/:action/*',
array(),
array(
'named' => array(
'wibble',
'fish' => array('action' => 'index'),
'fizz' => array('controller' => array('comments', 'other')),
'buzz' => 'val-[\d]+'
)
)
);


3. To chyba nawiązanie do punktu 1

Passed arguments are additional arguments or path segments that are used when making a request. They are often used to pass parameters to your controller methods.:

http://localhost/calendars/view/recent/mark


debug($this->request->params['pass']);
debug($this->passedArgs);



Po co mi ten pass, ?
Dzięki za pomoc.
Pozdrawiam.
Kamil Kosiński

Kamil Kosiński CTO w
DobryMechanik.pl

Temat: znów trasowanie

1/3. Wygodniej. Parametry są przekazywane jako argumenty do funkcji: id -> $postId, slug -> $postSlug
public function view($postId, $postSlug) {
//masz je też dostępnę tutaj
if (!empty($this->request->params['pass'[0])) {
$id = $this->request->params['pass'][0];
}
if (!empty($this->request->params['pass'[1])) {
$slug = $this->request->params['pass'][1];
}
}

a) Najprościej. Brak kontroli nad tym ile i jakie parametry są akceptowane.
Router::connect('/blog/post/*', array('plugin' => 'blog', 'controller' => 'posts', 'action' => 'view'));

b) Dużo lepsza opcja. Kontrolujesz zarówno liczbę jak i typ parametrów.
Router::connect('/blog/post/:id/:slug', array('plugin' => 'blog', 'controller' => 'posts', 'action' => 'view'), array('pass' => array('id', 'slug'), 'id' => $ID, 'slug' => '[a-z]{3,10}'));


2. Tak jak opisany jest ten przykład w dokumentacji, możesz zdefiniować globalne (rozpoznawane przez wszystkie routes) named params np.
Router::connectNamed(array('category', 'tag'), array('default' => true));
lub zdefiniować je dla konkretnej ścieżki (przykład, który wkleiłeś).
To odnośnie samego definiowania named params.

Inna sprawa to gdzie warto wykorzystywać i dlaczego to może być lepsza od passed params.
Chyba najczęściej wykorzystywanym miejscem dla named params jest stronnicowanie z filtrowaniem.
Router::connectNamed(array('category' => '^[a-z]{5,10}$', 'tag'), array('default' => true, 'greedy' => false));
Router::connect('/blog/*', array('plugin' => 'blog', 'controller' => 'posts', 'action' => 'index'));
Powyższe obsłuży np:
/blog/category:gotowanie
/blog/tag:kolacja
/blog/category:gotowanie/tag:kolacja
/blog/tag:kolacja/page:2
ale już nie:
/blog/category:moje (w tym wypadku całe "category:moje" wpadnie do pass)

W kontrolerze robisz:
public function index() {
if (!empty($this->request->params['named']['category'])) {
$category = $this->request->params['named']['category'];
}
if (!empty($this->request->params['named']['tag'])) {
$tag = $this->request->params['named']['tag'];
}
//...
}

To samo można by osiągnąć za pomocą passed params, ale było by dużo mniej wygodnie. Trzeba by zadbać o odpowiednią kolejność i dla category i tag wykorzystywać jakieś domyślne wartości.

Zernij na Cake/Test/Case/Routing/RouterTest.php

Temat: znów trasowanie

Dziękuję Kamilu.
Wszystko stało się dla mnie jaśniejsze, teraz muszę praktycznie potestować te rzeczy na projekcie jakimś wyimaginowanym.

Jeszcze raz, DZIĘKUJĘ
Pozdrawiam.

Następna dyskusja:

Znów Route




Wyślij zaproszenie do