Jak ovládat správně routy?
- kokoumes
- Člen | 39
Měl bych dotaz ohledně rout. Je tady toho popsáno hodně ale nikde jsem nevyčetl jak vlkládat parametry do rout. mám tento případ.
<?php
$router[] = new Route('index.php', array(
'presenter' => 'Default',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<locality>/<presenter>/<action>/<id>', array(
'presenter' => 'Default',
'action' => 'default',
'locality' => 'aa',
'id' => NULL,
));
?>
a nevím jak nahrazovat nebo jak dosazovat proměnou(session) místo ‚aa‘
u parametru locality a kam umístit funkci, která bude tento parametr
generovat.
Předem díky za rady.
Editoval kokoumes (23. 2. 2011 13:21)
- bojovyletoun
- Člen | 667
Z dotazu nejsem moc moudrý. Pole parametrů jsou výchozí hodnoty.
Příklad na vygenerování odkazu s parametry: v presenteru
$this->link('Blog:default',array('locality'=>rand(1,100)));
V šabloně <a href="{plink Blog:default, locality=>rand(2,4)}">Klikni</a>
- kokoumes
- Člen | 39
A proč tam píšeš Blog:default
. Proč je tam ten Blog.
Funkce má být následující: Při prvním načtení stránky si člověk
zvolí lokalitu a ta pak bude po celou dobu prohlížení v adresním řádku
na prvním místě.
Musí tam někde být tlačítko zrušit lokalitu (odstraní se session a redirektne na HP) a taky to musí fungovat tak, že když se zadá adresa včetně ty lokality tak se musí rovnou nahrát příslušná stránka… Pokud tam ta lokalita nebude musí se nahrát HP.
Když jsme u toho jak je to vubec v Nette s $_GET?
S Nette začínám tak v tom mam ještě zmatek co kam a jak dávat.
- bojovyletoun
- Člen | 667
$_GET v nette lze používat. Nebo použít objekt HttpRequest. Buď staticky Environment::gethttprequest nebo v presenteru $this->httprequest. Ale teď to důležité" . Systém předávání parametrů v presenteru právě nutnost používat nějaké requesty eliminuje". Prostě stačí v presenteru třeba napsat renderDefault($id){} a nette to samo spáruje přes router do konečné podoby url) příklad Cd collection
K příkladu. Jako hlavní stránku budeš mít Třeba presenter Home. tam
vypíšeš seznam lokalit s odkazem
<a n:href="Uzemi:default, $loc->name">$loc->name</>
za předpokladu že existuje presenter Uzemi s metodou action nebo
renderDefault($locality). $locality bude automaticky dosazen- viz link
generování odkazů
Ještě pro pochopení: zatím jsem nikde neuváděl nastavení routeru.
Klidně by to fungovalo se SimpleRouterem.
Pro konkretní příklad bych volil routy
":základní$router[]=new Route("<?index.php|>","Home:dafault");
a pro uzemí to co jsi psal ty. Jo ještě deklaruj parametry locality jako
persitetní- tím v url zustane.
takže takto
class AlfaPresenter extends basepresenter{
/** @persistent */
public $locality ;
PS rada druhá pravděpodobně chceš locality používat ve více presenterech, dokonce v celém webu. V tom případě deklaruj tuto proměnou v BasePresenteru
Dokumentace route
tvorba linků
Editoval bojovyletoun (23. 2. 2011 21:59)
- kokoumes
- Člen | 39
Moc díky za odpověď. Zkoušel jsem to tam nějak dodat, ale nefunguje mi
to.
Takhle vypadá můj kód:
BasePresenter
<?php
abstract class BasePresenter extends Presenter
{
public $oldLayoutMode = FALSE;
public $locality ; //tady jsem teda deklaroval tu proměnou
public function __construct(){
if(!Environment::getSession()->isStarted()){
Environment::getSession()->start();
}
parent::__construct();
}
public function beforeRender()
{
$idcart= ShoppingCart::cart()->IdCustomers();
$NumOfService = ShoppingCart::cart()->getNumOfService();
$Price = ShoppingCart::cart()->getFullPrice();
$this->template->cartPrice = $Price;
$this->template->numService = $NumOfService;
$loc = SelectLocality::selectedLoc()->checkLocality();//tady se hodnoti session odeslany formularem
if ($loc==false) {
$this->template->showSelectLoc = true;
}
else{
$this->template->showSelectLoc = false;
}
$this->template->showSelLocTop = SelectLocality::selectedLoc()->showLocality();
}
}
?>
DefaultPresenter
<?php
final class DefaultPresenter extends BasePresenter
{
public function renderDefault($locality)
{
$this->template->form = $this->getComponent('selectLocalityForm');
$this->locality='tabor';//tady jsem zkousel nastavit tu promenou
$this->link('default', array('locality' => 'en'));
}
protected function createComponentSelectLocalityForm()
{
$namespace = Environment::getSession('region');
$region2= SelectLocality::selectedLoc()->getingRegions();
$cities= SelectLocality::selectedLoc()->getingCities();
$form = new AppForm;
$form->setMethod('post');
$form->addSelect('region', 'd', $region2)->getControlPrototype()->onchange("submit();");
if (isset($namespace->region)) {
$form->setDefaults(array('region' => $namespace->region));
}
$form->addSelect('city', '', $cities);
$form->addSubmit('save', '');
$form->onSubmit[] = callback($this, 'SubmittedSelectLocalityForm');
$this->template->form = $form;
return $form;
}
public function SubmittedSelectLocalityForm(AppForm $form)
{
if($form['save']->isSubmittedBy()) {
$values = $form->getValues();
$namespace = Environment::getSession('region');
$namespace->region = $values['region'];
if ($values['city']!=="--") {
$namespace = Environment::getSession('Locality');
$namespace->Locality = $values['city'];
}
}
$this->redirect('default');
}
}
?>
a takovy mam bootstrap
<?php
$router[] = new Route('index.php', array(
'presenter' => 'Default',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<locality>/<presenter>/<action>/<id>', array(
'presenter' => 'Default',
'action' => 'default',
'locality' => 'def',
'id' => NULL,
));
?>
ten funguje dobře jen právě pořád netušim jak dodat do ty adresy tu lokalitu. A přesně jak říká ‚bojovyletoun‘ tato tam musí zůstat po celou dobu prohlížení stránek i když vyprší session.
- Filip Procházka
- Moderator | 4668
Výchozí hodnota je ta, která je uvedená u jeho definice v příslušné komponentě, nebo presenteru.
- Filip Procházka
- Moderator | 4668
class HomepagePresenter extends BasePresenter
{
/** @persistent */
public $nejakaPromenna = "vychoziHodnota";
}
odkaz:
<a href="{link homepage: 'nejakaPromenna' => "vychoziHodnota"}">odkaz bez klice 'nejakaPromenna'</a>
- kokoumes
- Člen | 39
Můžu mít v routeru 2× action?
<?php
$router[] = new Route('<locality>/<presenter>/<action>/<action2>/<id>', array(
'presenter' => 'Default',
'action' => 'default',
'locality' => 'def',
'action2' => NULL,
'id' => NULL,
));
?>
Pokud ano jak se pak bude tvořit odkaz v šabloně a v prezenteru?