problém s odkazy
- vmartin
- Člen | 18
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
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
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
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)
- vmartin
- Člen | 18
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.
- Oggy
- Člen | 306
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
- Oggy
- Člen | 306
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..