Jak ovládat správně routy?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kokoumes
Člen | 39
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

$_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
+
0
-

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.

jasir
Člen | 746
+
0
-

Tak musíš Nette nějak říct, že je $locality parametr presenteru. Buď ji uvést jako paremetr u action/render metod, a/nebo ji označit anotací /** @persistent */

kokoumes
Člen | 39
+
0
-

Aha.. je to ono supr díky.

kokoumes
Člen | 39
+
0
-

Ještě bych měl jeden dotázek. Jakým způsobem se pak zbavim ty perzistetní proměný na default co je v routě? potřebuju to udělat odkazem v šabloně. zkusil jsem si na to udělat akci ale pořád se proměný nemohu zbavit

Tharos
Člen | 1030
+
0
-

Nastav při generování odkazu hodnotu toho parametru na výchozí. Tím by měl z URL zmizet.

kokoumes
Člen | 39
+
0
-

No to je mi jasný že musim, ale jak? :-) to jsem jaksi nenašel nebo nevim.

Filip Procházka
Moderator | 4668
+
0
-

Výchozí hodnota je ta, která je uvedená u jeho definice v příslušné komponentě, nebo presenteru.

kokoumes
Člen | 39
+
0
-

To je mi ty jasný, ale jak zrušim natavenou hodnotu(kterou jsem předtím nastavil) v žabloně přes odkaz. Zřejmě asi nějakou akcí, ale mě by zajímalo jak tahle akce bude vypadat… zkoušel jsem unset() ale to jaksi nejde :-)

Filip Procházka
Moderator | 4668
+
0
-
class HomepagePresenter extends BasePresenter
{
	/** @persistent */
	public $nejakaPromenna = "vychoziHodnota";
}

odkaz:

<a href="{link homepage: 'nejakaPromenna' => "vychoziHodnota"}">odkaz bez klice 'nejakaPromenna'</a>
kokoumes
Člen | 39
+
0
-

Super díky je to ono.

kokoumes
Člen | 39
+
0
-

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?

Aurielle
Člen | 1281
+
0
-

K čemu 2× action?

kokoumes
Člen | 39
+
0
-

Potřebuju více parametrů kvůli větvení.