problém s komponentami při přechodu na Nette 2.4
- akoska
- Člen | 16
Mám projekt v Nette 2.0
Chci po 5ti letech přejít na Nette 2.4 z důvodu podpory PHP7.1
Rozhodl jsem se po několikadenním studování N2.4 projekt radši kompletně přepsat protože se v Nette změnilo příliš mnoho.
proto:
- Mám XAMMP s PHP7.1 – funguje
- Stáhl jsem si tedy základní aplikaci přes
composer create-project nette/web-project path/to/install – podařilo se, zákl. aplikace funguje .
Problém, však nastává, když chci použít komponentu.
Takže v ukázkovém presenteru. Jsem přidal
<?php
namespace App\Presenters;
use Nette;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
protected function createComponentTestovaci()
{
return new TestovaciControl;
}
}
a v latte jsem uvedl
html kod nad
{control testovaci}
html kod pod
komponenta TestovaciControl.php se svojí TestovaciControl.latte
je v adresáři components , který je na stejné úrovni jako
adresář presenters .
A toto mi stále píše hlášku Class ‚App\Presenters\TestovaciControl‘ not found
nevíte kde je problém? cache atp samozřejmě mám vyčištěné .
Editoval akoska (31. 7. 2017 14:04)
- akoska
- Člen | 16
nightfish napsal(a):
akoska napsal(a):
A toto mi stále píše hlášku Class ‚App\Presenters\TestovaciControl‘ not foundJe třída
TestovaciControl
v namespaceApp\Presenters
?
Ten namespace App\Presenters
je tam uveden jen a pouze proto,
že jsem neměnil vůbec nic na té prvotní stažené aplikaci. Jen jsem
vytvořil adresář components na úrovni adresáře presenters a do něj
vložil onu komponentu, tak jako v N2.0 .
Editoval akoska (31. 7. 2017 15:04)
- akoska
- Člen | 16
CZechBoY napsal(a):
Adresáře jsou fuk, chceme vědět namespace.
btw. jak si upgradoval z tý verze Nette 2.0? Šel si klasickou cestou 2.0->2.1->2.2->2.3->2.4 nebo si hned skočil do vody z Nette 2.0 na Nette 2.4?
Nerozumíme si. Nyní neřešme přechod mezi verzemi.
Nyní jsem v tomto stavu: https://doc.nette.org/cs/quickstart
Základní presenter jede.
A nyní chci přidat u Homepage do default.latte komponentu, která leží v adresáři components. Znám postup z N2.0. který zjevně na N2.4 nefunguje.
A nevím jak přijít na to co to je.
Do namespace jsem nikde nikam nezasahoval.
- David Matějka
- Moderator | 6445
to nesouvisi s nette 2.4, ale s (ne)pouzitim namespace – presenter je
v namespace App\Presenters
, ale ta komponenta asi ne
muzes bud pridat TestovaciControl
do use
statementu
nebo pouzit FQN \TestovaciControl
- akoska
- Člen | 16
David Matějka napsal(a):
to nesouvisi s nette 2.4, ale s (ne)pouzitim namespace – presenter je v namespace
App\Presenters
, ale ta komponenta asi nemuzes bud pridat
TestovaciControl
douse
statementu nebo pouzit FQN\TestovaciControl
Tak přes ‚Use‘ statement to funguje, ale to bych v USE musel defacto uvádět kazdou komponentu, která se v presenteru použije, a to by byl v efektivitě tvorby aplikací krok zpět.
V N2.0 jsem v presentru „jen“ vytvoril továrnu a pak jsem ji mohl volat v latte.
Jak tedy všechny komponety automatizovaně zpřístupnit pro použití?
Ja bych potřeboval, aby se každá komponenta, která se naprogramuje byla v případě použití k dispozici na zavolání v latte.
Jde to nějak zařídit?
- David Matějka
- Moderator | 6445
tak pokud nechces namespace pouzivat ani u presenteru, staci to odsud smazat a upravit mapovani
ale to bych v USE musel defacto uvádět kazdou komponentu, která se v presenteru použije, a to by byl v efektivitě tvorby aplikací krok zpět.
tak kazde ruzomne IDE umi importovat tridy automaticky…
Ja bych potřeboval, aby se každá komponenta, která se naprogramuje byla v případě použití k dispozici na zavolání v latte.
takovouhle magii nechces..
- akoska
- Člen | 16
David Matějka napsal(a):
tak pokud nechces namespace pouzivat ani u presenteru, staci to odsud smazat a upravit mapovani
ale to bych v USE musel defacto uvádět kazdou komponentu, která se v presenteru použije, a to by byl v efektivitě tvorby aplikací krok zpět.
tak kazde ruzomne IDE umi importovat tridy automaticky…
Ja bych potřeboval, aby se každá komponenta, která se naprogramuje byla v případě použití k dispozici na zavolání v latte.
takovouhle magii nechces..
Díky,
to mapování by se pro komponenty ukládané mělo nastavit jak?
Zde https://doc.nette.org/cs/configuring
vím sice kde se mapování nastavuje, ale jak toto nastavit to
fakt nevím.
Co se týče magie, tak jsem měl na mysli toto řešení.
https://doc.nette.org/…tion/factory
V N2.0 s tím problém nebyl. Napsal jsem komponentu uložiljsem ji i s template do adresáře components, udělal v presenteru factory a pak jsem si ji zavolal v latte. To bylo o proti dřívějšku zjednodušení.
V N2.4 toto nefunguje. Ani v první ukázkové aplikaci. Řeším tuto základní věc už 3tí den a myslím, že je škoda, že tyto základní věci v tutoriálu nejsou pořešené.
O to víc si cením, že se najde někdo kdo je ochoten poradit.
Rozdíl mezi N2.0 a N2.4 je vcelku propastný na to, že se fakt nedají věci v dokumentaci dohledat. A to programuji už 15let a dost věcí si dovedu dovodit.
- David Matějka
- Moderator | 6445
pro pouziti bez namespace bude stacit smazat z configu web-projectu ten soucasny, jelikoz defaultni pracuje bez hlavniho NS
Co se týče magie, tak jsem měl na mysli toto řešení.
to ale neni to, cos jsem pochopil z tve vety. tady budes muset stejne v presenteru komponentu registrovat. a v 2.4 to funguje bez problemu
že je škoda, že tyto základní věci v tutoriálu nejsou pořešené.
tak ten problem s namespacema nesouvisi s nette, ale primo s php
- akoska
- Člen | 16
David Matějka napsal(a):
pro pouziti bez namespace bude stacit smazat z configu web-projectu ten soucasny, jelikoz defaultni pracuje bez hlavniho NS
Co se týče magie, tak jsem měl na mysli toto řešení.
to ale neni to, cos jsem pochopil z tve vety. tady budes muset stejne v presenteru komponentu registrovat. a v 2.4 to funguje bez problemu
že je škoda, že tyto základní věci v tutoriálu nejsou pořešené.
tak ten problem s namespacema nesouvisi s nette, ale primo s php
Mohu poprosit o předpis jak změnit to mapování, aby se mi načítaly
komponenty uložené v adresáři components?
ať změním v config neon cokoliv, tak vysledkem je chybová hláška.
V config neonu mám:
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
presenter je
namespace App\Presenters;
use Nette;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
protected function startup()
{
parent::startup();
}
public function actionDefault(){
}
public function renderDefault(){
}
//=== logovaci formular ===
protected function createComponentLngBLimitCmp()
{
return new LngBLimitCmp();
}
}
v latte mám:
.
.
{control lngBLimitCmp}
.
.
na výše změněný zápis bych musel pro kazdou komponentu užitou v presenteru rozšiřovat USE deklaraci a to by byl krok zpět.
Editoval akoska (31. 7. 2017 19:34)
- David Matějka
- Moderator | 6445
staci smazat ten mapping z configu. a samozrejme smazat deklaraci namespacu z presenteru, kdyz je nechces pouzivat.
na výše změněný zápis bych musel pro kazdou komponentu užitou v presenteru rozšiřovat USE deklaraci a to by byl krok zpět.
a ty nepouzivas nejake ide, ktere ti to doplni? nepouzivat namespace mi prijde dnes jako trochu krok zpet :)
- nightfish
- Člen | 519
akoska napsal(a):
protected function createComponentLngBLimitCmp()
{
return new LngBLimitCmp();
}
Máš v zásadě dvě možnosti:
- Změnit v presenteru
return new LngBLimitCmp();
nareturn new \LngBLimitCmp();
. - Neměnit nic v presenteru, ale dopsat na první řádek každého
souboru s komponentou
namespace App\Presenters;
.
Při použití druhé varianty budeš ve jmenném prostoru
App\Presenters
míchat jak presentery, tak
komponenty – z hlediska funkčnosti to ničemu nevadí, osobně
bych to ale nedělal.
Na závěr přidám vysvětlení, proč to v Nette 2.0 fungovalo – tam
totiž presentery neměly uvedeny žádný jmenný prostor (stejně
jako tvé minulé i současné komponenty), proto
new LngBLimitCmp()
bez problémů fungovalo. Od určité verze
sandboxu (teď se mi to nechce hledat) však presentery jsou umístěny
ve jmenném prostoru App\Presenters
, a proto je nutno se na třídy
mimo tento jmenný prostor odvolávat pomocí celého jména (např.
new \LngBLimitCmp()
) a nebo použít klauzuli
use LngBLimitCmp;
.
- akoska
- Člen | 16
@CZechBoY Já potřebuji nejprve vědět provázanosti a proč to nefunguje. Pak se mohu spolehnout na nějaký editor.
Proč to nechodilo zdůvodnil výborně @nightfish, kterému za vyčerpávající odpověď děkuji.
Nakonec jsem to rozběhl dle návodu @DavidMatějka.
Co se týče editoru, tak hlavně ne eclipse. :-)