problém s komponentami při přechodu na Nette 2.4

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

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:

  1. Mám XAMMP s PHP7.1 – funguje
  2. 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)

nightfish
Člen | 519
+
0
-

akoska napsal(a):
A toto mi stále píše hlášku Class ‚App\Presenters\TestovaciControl‘ not found

Je třída TestovaciControl v namespace App\Presenters?

akoska
Člen | 16
+
0
-

nightfish napsal(a):

akoska napsal(a):
A toto mi stále píše hlášku Class ‚App\Presenters\TestovaciControl‘ not found

Je třída TestovaciControl v namespace App\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)

CZechBoY
Člen | 3608
+
0
-

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?

akoska
Člen | 16
+
0
-

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

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

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 ne

muzes bud pridat TestovaciControl do use 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
+
0
-

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

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

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

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)

CZechBoY
Člen | 3608
+
0
-

Jaky chyby ti to pise?

Nechapu jak muze mit nekdo problem s používáním kdyz ma stejne use Nette kvuli jednom vyskytu… Nainstaluj si nejaky IDE at si usetris tak 60% prace v php…

David Matějka
Moderator | 6445
+
0
-

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

akoska napsal(a):

protected function createComponentLngBLimitCmp()
{
return new LngBLimitCmp();
}

Máš v zásadě dvě možnosti:

  1. Změnit v presenteru return new LngBLimitCmp(); na return new \LngBLimitCmp();.
  2. 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
+
0
-

@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. :-)