problém s odkazy

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

Dobrý den, s Nette teprve začínám, ale v diskuzi jsem můj problém nenašel.

Po dvou dnech procházení diskuzí a tutoriálů se mi povedlo připojit k mysql databázi a zobrazovat z ní data.

Teď řeším problém routeru. Snažil jsem se z akrabatu pochopit, jak to vše pracuje. Chápu, že nastavuji presenter a v něm určitou akci. Ale jak Nette pozná, jaký template na to použít?

jde mi o tento odkaz: <p><a href=„{link add}“>Add new album</a></p>
odkaz v prohlížeči na localhost je potom …root/Dashboard/add.

já používám defaultPresenter, kde mám také Add. Template používám default.default.phtml (všiml jsem si, že to je stejné jako adresář default a v něm temlate default.phtml, což mě trochu překvapilo), ale na jaké místo mám vytvořit add.phtml? tam, co je default, nebo na to vytvořit jiný adresář?
Snad je můj dotaz srozumitelný. Doposud jsem s frameworkem nedělal, vše jsem měl v čistém php, tak jsem zmaten :-)

Editoval vmartin (22. 8. 2009 0:42)

Etch
Člen | 403
+
0
-
class DefaultPresenter extends Presenter{
	public function actionDefault(){}
	public function actionAdd(){}
	public function actionEdit(){}
	public function actionRemove(){}
}

class AdminPresenter extends Presenter{
	public function actionDefault(){}
	public function actionLogin(){}
	public function actionAaa(){}
	public function actionBbb(){}
}

Struktura :

app/
   presenters/
      DefaultPresenter.php
      AdminPresenter.php
   templates/
      Default/
         default.phtml
         add.phtml
         edit.phtml
         remove.phtml
      Admin/
         default.phtml
         login.phtml
         aaa.phtml
         bbb.phtml

nebo alternativní struktura :

app/
   presenters/
      DefaultPresenter.php
      AdminPresenter.php
   templates/
      Default.default.phtml
      Default.add.phtml
      Default.edit.phtml
      Default.remove.phtml
      Admin.default.phtml
      Admin.login.phtml
      Admin.aaa.phtml
      Admin.bbb.phtml

//EDIT: Typo

Editoval Etch (22. 8. 2009 19:51)

Foowie
Člen | 269
+
0
-

V ukázkovém projektu CD-collection je následující routa:

<?php
	$router[] = new Route('<presenter>/<action>/<id>', array(
		'presenter' => 'Dashboard',
		'action' => 'default',
		'id' => NULL,
	));
?>

což znamená: Výsledná www adresa bude mít tvar JMÉNO_PRESENTERU/JMÉNO_ACTION/HODNOTA_ID. Dále je jako druhý parametr pole, který obsahuje defaultní hodnoty. Pokud bude v požadavku stejná hodnota jako defaultní, nebude v uri zobrazena. (Takže pokud bude presenter „Abc“, action „default“ a id bude „null“ bude výsledná adresa …document_root/Abc/

Výsledný template se potom hledá jako templates/JMÉNO_PRESENTERU/JMÉNO_AKCE.phtml, nebo /templates/JMÉNO_PRESENTERU.JMÉNO_AKCE.phtml (pokud nepoužíváš moduly)

<p><a href=„{link add}“>Add new album</a></p> (spíše asi plink – ten se používá k odkazování v presenteru/na presenter, link k odkazování v komponentě/na komponentu)

{link add} znamená: „Vem aktuální adresu a změň action na add“. Pokud by tam bylo {link Clanek:add, 5} znamenalo by to "Vem aktuální adresu a změň presenter na článek, action na add a první parametr metody actionAdd bude mít hodnotu 5. (V tomhle případě budou smazány i persistentní parametry, teda pokud ty parametry nejsou definované v předkovi současného a Clanek presenteru)

vmartin
Člen | 18
+
0
-

děkuji za pomoc, hned to jdu předělat.

vmartin
Člen | 18
+
0
-

asi si budete klepat na čelo, ale stále to nemůžu rozeběhnout…

vytvořil jsem si strukturu stejně, jako napsal Etch.

bootstrap mám takto:

<?php

require LIBS_DIR . '/Nette/loader.php';

Debug::enable();

// 2b) enable RobotLoader - this allows load all classes automatically
$loader = new /*Nette\Loaders\*/RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();

$application = Environment::getApplication();

// Step 4: Setup application router
$router = $application->getRouter();

// mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
	$router[] = new Route('index.php', array(
		'presenter' => 'Default',
		'action' => 'default',
	), Route::ONE_WAY);

	$router[] = new Route('<presenter>/<action>/<id>', array(
		'presenter' => 'Default',
		'action' => 'default',
		'id' => NULL,
	));

} else {
	$router[] = new SimpleRouter('Default:default');
}

// Step 4: Run the application!
$application->run();
?>

v templates mám @layout.phtml

ten v body má:

<div class="cc">
  {include #content}
</div>

default.phtml potom obsahuje:

{block #content}

<h2>{$title}</h2>

<table class="menu">
{foreach $sporty as $sport}
<tr>
  <ul>
	<td><li><a>{$sport->sport}</a></li></td>
	</ul>
</tr>
{/foreach}

</table>

<p><a href="{plink add}">Add</a></p>

základ se mi zobrazí, ale v posledním řádku, ať už mám link, nebo plink, stále to hlásí chybu, že
je objekt nenalezen.
Vypsanná adresa je localhost/document_root/default/add/.

Vidíte tam, prosím, někdo chybu? ze začátku mi jde o to při odkazu zobrazit pouhý text, ale nikdy se nedokážu dostat na jiný template.

Děkuji za každý postřeh.

Edit: code fix

Editoval kravčo (22. 8. 2009 19:03)

kravčo
Člen | 721
+
0
-

A máš v adresári document_root súbor .htaccess?

vmartin
Člen | 18
+
0
-

díky moc, takováhle chyba by mě nikdy nenapadla :-)
jdu nastudovat, co vše by měl obsahovat, zatím jsem zkopíroval ten z akrabatu a funguje mi to. Díky

vmartin
Člen | 18
+
0
-

snad už to je poslední problém s odkazy.

Mám tento odkaz: <a href=„{plink default:souteze, $sport->sport}“ >

ten mi funguje, ale jak předá dva argumenty?

zkoušel jsem tohle:

<a href=„{plink default:souteze, $sport->id, $sport->sport}“ >

ale chce to pole, do kterého jsem se to sice pokoušel dát, ale marně.

Děkuji všem za pomoc.

Foowie
Člen | 269
+
0
-

Myslím, že to je něco jako:
<a href=„{plink default:souteze, "id"=>$sport->id, "sport"=>$sport->sport}“ >
Kde id a sport jsou názevy proměnných v definici metody akce.

Ondřej Mirtes
Člen | 1536
+
0
-
{plink Default:souteze $sport->id $sport->sport}

Toto nefunguje?

Oggy
Člen | 306
+
0
-

takový dotaz

šablona:

<?php
{link $zalozka->url}
?>

$zalozka->url je nějaká url z databáze ..např. kontakt
má to být presenter…ale takto je to chápáno jak action stávajícho presenteru..to je celkem jasné..ale jak docílit toho, aby to byl presenter? dvojtečku za $zalozka->url_cs ..jak jí tam dostanu?.. pokud napíši

<?php
{link $zalozka->url:}
?>

je to syntaktická chyba..

díky

Panda
Člen | 569
+
0
-

Výraz nesmí začínat znakem $, jinak jej Nette považuje celý za PHP kód. Je potřeba tedy zapsat celou cestu k presenteru:

{link :$zalozka->url:}
Oggy
Člen | 306
+
0
-

Panda napsal(a):

Výraz nesmí začínat znakem $, jinak jej Nette považuje celý za PHP kód. Je potřeba tedy zapsat celou cestu k presenteru:

{link :$zalozka->url:}

díky super..

P.S. jak vlastně funguje generování odkazu?…
v tomto případě, který jsem tu řešili.. například..stránka O nás (url= o-nas) ..to hází chybu..že presentername musí být alphanumeric..
jde mi o to..že podle té url (o-nas) se potom podívám buďto v routeru nebo ve stylu pro router (ale to je asi na řešení do jiného vlákna) jaký presenter má tuto url obsloužit..

David Grudl
Nette Core | 8218
+
0
-

Možná raději {link "$zalozka->url:"}

Oggy
Člen | 306
+
0
-

David Grudl napsal(a):

Možná raději {link "$zalozka->url:"}

ok..díky..
jak to nejlépe vyřešit s těmi cool odkazy? děkuju