FrontModule a AdminModule
- Jack.q
- Člen | 54
Zdravím, mám menší problém s FrontModule a AdminModule. Dělal jsem to přesně krok po kroku jako zde http://blog.jerryklimcik.cz/…e-ve-vyvoji/
Jenže vyskytl se menší problém, a tím je tato hláška:
Cannot load presenter ‚Front:Admin‘, class ‚FrontModule\AdminPresenter‘ was not found.
Přitom AdminPresenter existuje, a vypadá takto:
<?php
namespace AdminModule;
class AdminPresenter extends \Nette\Application\UI\Presenter
{
protected function createComponentsignInForm()
{
$form = new UI\Form;
$form->addText('mail', 'E-mail:');
$form->addPassword('password', 'Heslo:');
$form->addSubmit('login', 'Přihlásit se');
$form->onSuccess[] = array($this, 'signInForm');
return $form;
}
}
V čem může být problém?
- Pavel Kravčík
- Člen | 1196
Jack.q napsal(a):
V čem může být problém?
Předpokládám, že v přehlédnutí nebo neznalosti http://php.net/…mespaces.php.
- Jack.q
- Člen | 54
URL mám:
localhost/System/www/admin/
A router:
$router = new RouteList(Admin);
$router[] = new Route('admin/<presenter>/<action>[/<id>]', array ('module' => 'Admin', 'presenter' => 'Admin', 'action' => 'default', 'id' => NULL));
return $router;
Chybu píše jen adresář Admin, Front mi jede
Editoval Jack.q (30. 11. 2015 14:06)
- David Matějka
- Moderator | 6445
a kde mas ten router? Jelikoz vracis pouze ten admin router, coz by ti nefungoval front. ukaz cely router factory
- Jack.q
- Člen | 54
David Matějka napsal(a):
a kde mas ten router? Jelikoz vracis pouze ten admin router, coz by ti nefungoval front. ukaz cely router factory
Router je umístěn v app/router/RouterFactory.php. Celý router vypadá takto:
<?php
namespace App;
use Nette;
use Nette\Application\Routers\RouteList;
use Nette\Application\Routers\Route;
class RouterFactory
{
/**
* @return Nette\Application\IRouter
*/
public static function createRouter()
{
$router = new RouteList;
$router[] = new Route('<presenter>/<action>[/<id>]', array ('module' => 'Front', 'presenter' => 'Homepage', 'action' => 'default'));
return $router;
$router = new RouteList(Admin);
$router[] = new Route('admin/<presenter>/<action>[/<id>]', array ('module' => 'Admin', 'presenter' => 'Admin', 'action' => 'default', 'id' => NULL));
return $router;
}
}
- David Matějka
- Moderator | 6445
A opravdu tam nevidis nic divnyho?
Navic to neodpovida tomu clanku, na ktery odkazujes, tam se nic nepovida o RouteListu (kde mas mimochodem v konstruktoru dalsi chybu)
Zkus si tu sekci Routovani v tom clanku projit znovu
- Jack.q
- Člen | 54
Po změně router na mě vyskočilo:
Ambiguous class AdminModule\AdminPresenter resolution; defined in C:\xampp\htdocs\System\app\AdminModule\presenters\AdminPresenter.php and in C:\xampp\htdocs\System\app\FrontModule\presenters\AdminPresenter.php
Vůbec nechápu co to je, teda myslím, že je to kvůli class, ale v návodu píšou, že se má class smazat.
- David Matějka
- Moderator | 6445
hlaska je celkem jasna. Mas jednu tridu definovanou ve dvou souborech
- Jack.q
- Člen | 54
Takhle:
$router = new RouteList;
$router[] = new Route('<presenter>/<action>/<id>', array('module' => 'Front','presenter' => 'Homepage','action' => 'default', 'id' => NULL,));
return $router;
$router = new RouteList(Admin);
$router[] = new Route('admin/<presenter>/<action>[/<id>]', array ('module' => 'Admin', 'presenter' => 'Admin', 'action' => 'default', 'id' => NULL));
return $router;
}
- Jiří Nápravník
- Člen | 710
JE tam spousta chyb.
Return ti vyskoci z funkce. takze ta druha routa se nebere v potaz
Routelist(Admin) – kdyz uz tak RouteList(‚Admin‘) – nemluve o tom, ze v clanku se routlist nezminuje.
Prvne ma byt konkretni routa, a pak ta defaultni. Ci-li prvne admin a pak ta klasika
- Jack.q
- Člen | 54
Pokud myslíš tu čárku za NULL tak tou to není
Jiří Nápravník napsal(a):
JE tam spousta chyb.
Return ti vyskoci z funkce. takze ta druha routa se nebere v potaz
Routelist(Admin) – kdyz uz tak RouteList(‚Admin‘) – nemluve o tom, ze v clanku se routlist nezminuje.
Prvne ma byt konkretni routa, a pak ta defaultni. Ci-li prvne admin a pak ta klasika
Jenže když v Routu udělám první admin, a pak až Front tak nefunguje zase Front a píše:
No route for HTTP request.
a admin vypíše i tak chybu, ale už o trochu jinou
Editoval Jack.q (30. 11. 2015 17:03)
- David Matějka
- Moderator | 6445
If called from within a function, the return statement immediately ends execution of the current function
- Jack.q
- Člen | 54
Super takže chyba zjevně byla v routech, respektive u route admin jsem smazal return, ale zase píše chybu.
Call to a member function fetchAll() on null
Nechápu proč. Ve finální podobě vypadá router takto:
$router = new RouteList();
$router[] = new Route('admin/<presenter>/<action>[/<id>]', array (
'module' => 'Admin',
'presenter' => 'Admin',
'action' => 'default',
'id' => NULL,
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
return $router;
Editoval Jack.q (1. 12. 2015 7:50)
- Jack.q
- Člen | 54
Vypisuje chybu konkrétně na řádku 17
16: public function renderDefault() {
17: $this->template->posts = $this->postsRepository->fetchAll();
18: }
A vypadá takhle:
<?php
namespace AdminModule;
use \Nette\Application\UI\Form;
class AdminPresenter extends BasePresenter {
/** @var \PostsRepository */
private $postsRepository;
/** @var \CommentsRepository */
private $commentsRepository;
function _construct(\PostsRepository $postsRepository, \CommentsRepository $commentsRepository) {
$this->postsRepository = $postsRepository;
$this->commentsRepository = $commentsRepository;
}
public function renderDefault() {
$this->template->posts = $this->postsRepository->fetchAll();
}
public function renderSingle($id) {
}
protected function createComponentEditArticleForm() {
$post = $this->postsRepository->fetchSingle($this->getParam('id'));
$form = new Form();
$form->addText("title", "Název článku: ")
->setDefaultValue($post->title)
->setRequired('Vyplňte název článku!');
$form->addTextArea("body", "Text článku: ")
->setDefaultValue($post->body)
->setRequired('Vyplňte text článku!');
$form->addHidden("post_id")
->setDefaultValue($this->getParam('id'));
$form->addSubmit("send", "Odeslat");
$form->onSuccess[] = $this->editArticleFormSucceeded;
return $form;
}
public function editArticleFormSucceeded(Form $form) {
$values = $form->getValues();
$post = $values->post_id;
unset($values->post_id);
$this->postsRepository->updateArticle($post, $values);
$this->flashMessage('Článek byl aktualizován', 'info');
$this->redirect("Admin:");
}
public function handleDeleteArticle($id) {
$this->commentsRepository->deleteComments($id);
$this->postsRepository->deleteArticle($id);
$this->flashMessage('Článek byl smazán', 'info');
$this->redirect('Admin:');
}
protected function createComponentAddArticleForm() {
$form = new Form();
$form->addText("title", "Název článku: ")
->setRequired('Vyplňte název článku!');
$form->addTextArea("body", "Text článku: ")
->setRequired('Vyplňte text článku!');
$form->addSubmit("send", "Odeslat");
$form->onSuccess[] = $this->addArticleFormSucceeded;
return $form;
}
public function addArticleFormSucceeded(Form $form) {
$values = $form->getValues();
$values->date = new \Nette\DateTime();
$this->postsRepository->addArticle($values);
$this->flashMessage('Článek byl přidán', 'info');
$this->redirect("Admin:");
}
}
- David Matějka
- Moderator | 6445
mas chybu v pojmenovani konstruktoru, viz http://php.net/…p5.decon.php, chybi ti tam podtrzitko
- Jack.q
- Člen | 54
To podtržítko před construct jsem odstranil záměrně, jelikož když jsou dvě podtržítka před construct píše, a psalo mi to chybu:
Service ‚application.1‘: Service of type PostsRepository needed by AdminModule\AdminPresenter::__construct() not found. Did you register it in configuration file?
@chemix
Netbeans IDE 8.1
Editoval Jack.q (1. 12. 2015 16:27)
- Jack.q
- Člen | 54
Dělal jsem to podle návodu a tam o zaregistrování není ani slovo. Tady je konfigurák:
parameters:
php:
date.timezone: Europe/Pragueapplication:
errorPresenter: Errorsession:
expiration: 14 days
- services
- App\Model\UserManager
- App\Forms\SignFormFactory
router: App\RouterFactory::createRouter
- Šaman
- Člen | 2666
Tady je konfigurák
ze zdrojáků onoho projektu.
To, že o zaregistrování není ani slovo pořeš s autorem, ale asi
předpokládal, že je to samozřejmé. Někde se ta třída musí vytvořit.
Ten konstruktor si ji pak vyžádá už připravenou a nakonfigurovanou
z DI kontejneru.
A ten tvůj fígl s odmazáním podtržítka svědčí o tom, že se
vůbec neorientuješ v základech OOP v PHP. To je dost nutné, než se
pustíš do psaní aplikací v OOP frameworku. Odmazáním podtržítka jsi
zrušil konstruktor (a vytvořil divně pojmenovanou obyčejnou funkci, která
se ale nikde nepoužívá), takže jsi srozumitelnou chybu (Service … not
found. Did you register it in configuration file?) potlačil a
ta chyba se objevila až když ten $postRepository
byl opravdu
potřeba a najednou se zjistilo, že není k dispozici.
Dodatek: Tak odstavec o nutnosti zaregistrovat služby tam je, i s kompletní ukázkou toho, co se má do konfigu přidat. Ale je to v prvním dílu, kde se vytváři základ aplikace.
Editoval Šaman (1. 12. 2015 17:05)
- Oli
- Člen | 1215
@Jack.q Dlouhodobě máš otázky které svědčí o tom, že o programování (minimálně v OOP) nevíš v podstatě nic. Vypadá to, že vždy vezmeš nějakej kus kodu, ten si copy&past do své aplikace a pak se ptáš proč ti to nejde chybovou hlášku za chybovou hláškou. Kdyby jsi aspoň trochu tušil, tak minimálně polovinu hlášek jsi schopen opravit sám.
Vzhledem k tomu, že stejná úroveň dotazů trvá skoro rok (viz.: https://forum.nette.org/…i-do-systemu) jsi se základy PHP (a OOP PHP) vůbec nesnažil doučit nebo prostě trolíš…
- Jack.q
- Člen | 54
@chemix
Díky, routy už jsem opravil, ale zjevně bude někde v routech problém jelikož mi vyhazuje hlášku:
Layout not found. Missing template '…\htdocs\System\app\AdminModule\templates\Admin\@layoutAdmin.latte'.
ale já mám @layoutAdmin ve složce templates, a pak až složku Admin kde jsou soubory šablony. I když se tváří, že je chyba jen v cache, respektive vypisuje chybu v cache tak to tím není, zkoušel jsem promazat
Editoval Jack.q (2. 12. 2015 9:33)
- Myiyk
- Člen | 321
Tohle není chyba v routerech, poznáš to podle toho, že tady se snaží
najít šablonu.
Mrkni na životní
cyklus presenteru, šablona se zpracovává v části
Rendering
. To už routy dávno předaly informace presenteru, ve
kterém už proběhly metody action
i render
.
A teď k tvé chybě.
Máš nastavenou špatnou cestu k layoutu.
- chemix
- Nette Core | 1310
@jack.q jako zacatecnik bych nevymyslel nejake nove postupy, ale drzel se zajetyck koleji… https://github.com/…odules-Usage