FrontModule a AdminModule

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

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

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.

David Matějka
Moderator | 6445
+
0
-

Jakou mas URL? jak vypada router?

Jack.q
Člen | 54
+
0
-

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

a kde mas ten router? Jelikoz vracis pouze ten admin router, coz by ti nefungoval front. ukaz cely router factory

Jack.q
Člen | 54
+
0
-

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

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

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

hlaska je celkem jasna. Mas jednu tridu definovanou ve dvou souborech

Jack.q
Člen | 54
+
0
-

aha, ale teď to na mě ovšem vyhodilo chybu kterou uvádím v prvním příspěvku u založení téma

David Matějka
Moderator | 6445
+
0
-

A opravil si ten router? jak vypada ted?

Jack.q
Člen | 54
+
0
-

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;
	}
David Matějka
Moderator | 6445
+
0
-

Je to porad stejne spatne jako jsem psal o par prispevku vys

Jiří Nápravník
Člen | 710
+
+2
-

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

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

http://php.net/…n.return.php

If called from within a function, the return statement immediately ends execution of the current function

Jack.q
Člen | 54
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

Posli model kde ti to háže chybu. Router uz vypadá funkcni.

Nechybí ti u nějaký služby anotace @inject?

Jack.q
Člen | 54
+
0
-

Háže mi to chybu u AdminPresenteru, ne u modelu

David Matějka
Moderator | 6445
+
0
-

A jak vypada kod?

Jack.q
Člen | 54
+
0
-

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

mas chybu v pojmenovani konstruktoru, viz http://php.net/…p5.decon.php, chybi ti tam podtrzitko

chemix
Nette Core | 1310
+
0
-

@Jack.q muzu se zeptat co pouzivas za IDE?

Jack.q
Člen | 54
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

@Jack.q tak tu službu zaregistruj do konfiguráku jak ti píše nápověda.

Divný způsob řešení problému. Timhle způsobem bys za chvíli smazal celej projekt a pochvaloval si, že ti to nepíše žádnou chybu :/

Jack.q
Člen | 54
+
-1
-

Jenže tato služba je v configu zaregistrována

Šaman
Člen | 2666
+
0
-

Jack.q napsal(a):

Jenže tato služba je v configu zaregistrována

Myslíš \PostsRepository?

CZechBoY
Člen | 3608
+
0
-

@Jack.q Obě? Pošli konfigurák config.neon.

Jack.q
Člen | 54
+
0
-

Dělal jsem to podle návodu a tam o zaregistrování není ani slovo. Tady je konfigurák:

parameters:

php:
date.timezone: Europe/Prague

application:
errorPresenter: Error

session:
expiration: 14 days

services
App\Model\UserManager
App\Forms\SignFormFactory

router: App\RouterFactory::createRouter

Šaman
Člen | 2666
+
+5
-

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

@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íš…

chemix
Nette Core | 1310
+
+1
-

@Jack.q Tip: pozorovat IDE, snazi se ti pomoci (zluty vykricnik)

PS: doraz nekdy na posobotu na dopoledni workshop, minimalne dostanes info co je treba se doucit. V lepsim pripade si projdes zaklady nette aplikace pod vedenim nekoho zkuseneho.

Jack.q
Člen | 54
+
-2
-

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

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

@jack.q jako zacatecnik bych nevymyslel nejake nove postupy, ale drzel se zajetyck koleji… https://github.com/…odules-Usage