Problém s komponentou – Component with name ‚…‘ does not exist

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

Zdravím, potřeboval bych prosím pomoci s následujícím problémem: mám vytvořenou jednoduchou komponentu, ale když ji dám do příslušného presenteru a v šabloně si ji nechám vykreslit, tak mi laděnka hlásí: Component with name ‚price‘ does not exist, ale v okamžiku kdy ji dám do BasePresenteru tak se mi vykreslí. Ví někdo jak na to? S nette začínám. Díky

Editoval xmilde (24. 3. 2012 15:51)

ViPEr*CZ*
Člen | 817
+
0
-

Nějaké další info. Nejlépe ukázka kódu(ů).

xmilde
Člen | 13
+
0
-

ViPErCZ napsal(a):

Nějaké další info. Nejlépe ukázka kódu(ů).

BasePresenter:

use Nette\Application\UI,
	Nette\Security as NS;
use Nette\Application\UI\Form;

class AdminPresenter extends Nette\Application\UI\Presenter{
		public function beforeRender(){

		$this->template->adminmenu = array(
					O nás' => 'about',
					'Ceník' => 'price',										);
		}

		public function handleSignOut()
		{
		$this->getUser()->logout();
		$this->redirect('Admin:default');
		}
}

PricePresenter:

use use Nette\Application\UI,
	Nette\Security as NS;
use Nette\Application\UI\Form;

class PricePresenter extends BasePresenter{
	public function createComponentPrice(){
		$form = new Form();
		$form->addText('stroj', 'Nazev stroje:', 50);
		return $form;
	}
}

price.latte

{block content}
{control price}

Editoval xmilde (24. 3. 2012 16:34)

ViPEr*CZ*
Člen | 817
+
0
-

No chybu v tom nevidím. Zkoušel jste vymazat cache? Jaká je to verze Nette?

To pole neberu jako chybu… tam to doufám máte takto:

$this->template->adminmenu = array('O nás' => 'about', 'Ceník' => 'price');
SendiMyrkr
Člen | 30
+
0
-

Proč je v BasePresenter.php třída AdminPresenter? A neměl by pak tedy PricePresenter dědit z AdminPresenter a ne BasePresenter?

Každopádně chybu vidim v tom, že pravděpodobně voláš {link price} a ne {link Price:index} to znamená, že voláš action z AdminPresenteru a ne z PricePresenteru… proto to v z AdminPresenteru funguje a z Price presenteru nefunguje… Koukni se do debugbaru na jakym jsi presenteru a action…

Editoval SendiMyrkr (24. 3. 2012 19:43)

ViPEr*CZ*
Člen | 817
+
0
-

SendiMyrkr napsal(a):

Proč je v BasePresenter.php třída AdminPresenter? A neměl by pak tedy PricePresenter dědit z AdminPresenter a ne BasePresenter?

Každopádně chybu vydim v tom, že pravděpodobně voláš {link price} a ne {link Price:index} to znamená, že voláš action z AdminPresenteru a ne z PricePresenteru… proto to v z AdminPresenteru funguje a z Price presenteru nefunguje… Koukni se do debugbaru na jakym jsi presenteru a action…

Jej tak v tý rychlosti jsem to ani neviděl. To je jasné. Pokud je dotyčný na jiným presenteru, pak se mu ani nezavolá createComponent a nemůže to fungovat. A v BasePresenteru definovat jinou třídu než BasePresenter? Tfuj.

PS: SendiMyrkr … oprav si tu hrubku :-)

SendiMyrkr
Člen | 30
+
0
-

ViPErCZ napsal(a):

PS: SendiMyrkr … oprav si tu hrubku :-)

Shame on me…!

xmilde
Člen | 13
+
0
-

ViPErCZ napsal(a):

SendiMyrkr napsal(a):

Proč je v BasePresenter.php třída AdminPresenter? A neměl by pak tedy PricePresenter dědit z AdminPresenter a ne BasePresenter?

Každopádně chybu vydim v tom, že pravděpodobně voláš {link price} a ne {link Price:index} to znamená, že voláš action z AdminPresenteru a ne z PricePresenteru… proto to v z AdminPresenteru funguje a z Price presenteru nefunguje… Koukni se do debugbaru na jakym jsi presenteru a action…

Jej tak v tý rychlosti jsem to ani neviděl. To je jasné. Pokud je dotyčný na jiným presenteru, pak se mu ani nezavolá createComponent a nemůže to fungovat. A v BasePresenteru definovat jinou třídu než BasePresenter? Tfuj.

PS: SendiMyrkr … oprav si tu hrubku :-)

omlouvám se, ale přemýšlel jsem předtím moc dopředu – jasně, že tam má být třída BasePresenter a za radu s tím linkem moc díky … to bude ten problém. Kouknu se na to pořádně později, ale myslím si, že pak by to již mělo fungovat:-)

Editoval xmilde (24. 3. 2012 19:53)

David Klouček
Člen | 57
+
0
-

Abych nezakládal stejnej topic, tak se zeptám tu. Nette se chová, jako bych nevytvářel komponentu addCommentForm. Laděnka mi vyhazuje:

Component with name 'addCommentForm' does not exist

components/CommentsControl.php

use Nette\Application\UI;
use Nette\Application\UI\Form;

class CommentsControl extends UI\Control
{
	public function __construct()
	{
		parent::__construct();
	}

	public function render()
	{
		$this->template->setFile(__DIR__ . '/CommentsControl.latte');
		$this->template->render();
	}

	protected function createComponentAddCommentForm() // tady ji vytvářim
	{
		$form = new Form;
		//..
		return $this;
	}
}

components/CommentsControl.latte

{control addCommentForm}

V továrničce v presenteru pak akorát vracim novou instanci třídy CommentsControl.

Poradíte někdo?

Editoval David Klouček (24. 3. 2012 19:59)

Tomáš Votruba
Moderator | 1114
+
0
-

@David Klouček: Co přesně máš v továrničce v presenteru?

David Klouček
Člen | 57
+
0
-

Schmutzka napsal(a):

@David Klouček: Co přesně máš v továrničce v presenteru?

public function createComponentComments()
{
	$control = new \CommentsControl();
	//$control->setType('post');
	//$control->setId($this->template->post['id']);
	return $control;
}

Schválně jsem si vytvořil novou komponentu aplikace, která nic nedělá a hlásí to samý.

ViPEr*CZ*
Člen | 817
+
0
-

Todle jsem ještě nezkoušel, ale místo this bych vracel buď return $form; a nebo bych pak ještě zkusil získat presenter aktuální přes $this->getPresenter() a poslal bych do presenteru přes addComponent moji novou vytvořenou komponentu.

David Klouček
Člen | 57
+
0
-

ViPErCZ napsal(a):

Todle jsem ještě nezkoušel, ale místo this bych vracel buď return $form; a nebo bych pak ještě zkusil získat presenter aktuální přes $this->getPresenter() a poslal bych do presenteru přes addComponent moji novou vytvořenou komponentu.

No tyvole! Tohle už je už po druhý co několik hodin řešim, že jsem napsal return $this místo $form! Díky.

ViPEr*CZ*
Člen | 817
+
0
-

David Klouček napsal(a):

ViPErCZ napsal(a):

Todle jsem ještě nezkoušel, ale místo this bych vracel buď return $form; a nebo bych pak ještě zkusil získat presenter aktuální přes $this->getPresenter() a poslal bych do presenteru přes addComponent moji novou vytvořenou komponentu.

No tyvole! Tohle už je už po druhý co několik hodin řešim, že jsem napsal return $this místo $form! Díky.

No to mi povídej… kolikrát člověk překoukne takový věci, že se až diví. Hlavně, že funguje ;-)

xmilde
Člen | 13
+
0
-

Zdravím, tak jsem se k tomuto problému vrátil a fakt už nevím jak na to. V AdminPresenteru mám následující:

<?php

use Nette\Application\UI,
	Nette\Security as NS;
use Nette\Application\UI\Form;


class AdminPresenter extends Nette\Application\UI\Presenter{

	public function beforeRender(){

		$this->template->adminmenu = array(
					'O nás' => 'about',
					'Ceník' => 'price',
					'Reference' => 'reference',
					);
		}

	public function createComponentSignInForm(){

		$form = new Form;
		$form -> addText('username', 'Uživatelské jméno:', 30, 20);
		$form -> addPassword('password', 'Heslo:', 30, 20);
		$form->addSubmit('login', 'Přihlásit se');
		$form->onSuccess[] = callback($this, 'signInFormSubmitted');
		return $form;
	}

	public function signInFormSubmitted(Form $form){
		try {
			$user = $this->getUser();
			$values = $form->getValues();
			//if ($values->persistent) {
			//	$user->setExpiration('+30 days', FALSE);
			//}
			$user->login($values->username, $values->password);
			$this->flashMessage('Přihlášení bylo úspěšné.', 'success');
			$this->redirect('Administrace');
		} catch (NS\AuthenticationException $e) {
			$form->addError('Neplatné uživatelské jméno nebo heslo.');
		}
	}
	public function handleSignOut(){
		$this->getUser()->logout();
		$this->redirect('Admin:default');
	}

}

a v PricePresenteru:

use Nette\Application\UI,
	Nette\Security as NS;
use Nette\Application\UI\Form;

class PricePresenter extends AdminPresenter{
        public function createComponentPrice(){
                $form = new Form();
                $form->addText('stroj', 'Nazev stroje:', 50);
                return $form;
        }
}

a menu v šabloně @layout.latte vypisuji:

<div id="menu">
	{if $user->isLoggedIn()}
		<ul n:inner-foreach="$adminmenu as $item => $link">
			<li ><a n:href="$link">{$item}</a></li>
		</ul>
	{/if}
</div>

šablona pro price.latte:

{block content}
{control price}

S tím, že, když se klikne na About, ohlasi laděnka Component with name ‚price‘ does not exist. Z toho co se tu psalo jsem to moc nepochopil – kopne do mě, prosím, někdo pořádně? Díky

Editoval xmilde (6. 4. 2012 10:20)

Ascaria
Člen | 187
+
0
-

A nesnažíš se náhodou postavit tu komponentu i v nějakém tom about.latte (zkopírovaná šablona a neodstraněná control)?

xmilde
Člen | 13
+
0
-

Ascaria napsal(a):

A nesnažíš se náhodou postavit tu komponentu i v nějakém tom about.latte (zkopírovaná šablona a neodstraněná control)?

ne,v AboutPresenteru mám jinou komponentu (tam mám komponentu tinyMCE), ale výsledek je stejný …

factor
Člen | 28
+
0
-

Dobrý den,
omlouvám se za svou neschopnost, ale mám stejný výstup od laděnky a žádný z předchozích řešení mi nepomohl.

Presenter:

class AddElementPresenter extends BasePresenter {
    /** @var addElementModel */
    protected $AddElementModel;

    public function addElement()
    {
        if($this->AddElementModel === NULL)
            $this->AddElementModel = new AddElementModel ();
        return $this->AddElementModel;
    }

     /**
     * @param Form $form
     */

    function FormSubmittedPridatelement($form)
    {
        $data = $this->addElement();
        $values = $form ->getForm()->getValues();
        $add = $data->create_contractor($values);
    }

    public function createComponentPridatelement($name)
    {
        $data = $this -> addElement();
        $arr_type = $data -> get_type_arr();

        $form = new Form($this, $name);
        $form ->addSelect("type", "Typ: ", $arr_type);
	.....
        $form ->onSuccess[]= array($this, 'FormSubmittedPridatelement');

        return $form;
    }

template:

{control Pridatelement}

Původně vše fungovalo jak mělo, ale rozhodl jsem se že předělám menu na více úrovňové a od té chvíle tápu.

Za jakoukoliv nápovědu budu neskonale vděčnej.
S pozdravem,
Ondra

Editoval factor (8. 4. 2012 13:12)

Aurielle
Člen | 1281
+
0
-

{control pridatelement} ← malé P

xmilde
Člen | 13
+
0
-

zdravím,neví si s tím někdo rady?

factor
Člen | 28
+
0
-

gmvasek napsal(a):

{control pridatelement} ← malé P

Bohužel beze změny :-/

MartyIX
Člen | 217
+
0
-
public function createComponentPridatelement()
   {
       $data = $this -> addElement();
       $arr_type = $data -> get_type_arr();

       $form = new Form($this, 'pridatelement');

Co v ramci debuggingu takto?

xmilde
Člen | 13
+
0
-

věděl by si prosím někdo rady s mým problém? – popsáno výše. Pozn. nejsem factor,který má podobný problém a a který se tu ve finále řeší. všem co jsou ochotni mi pomocí předem díky.

MartyIX
Člen | 217
+
0
-

@xmilde: Tak si zkopiruj do AboutPresenteru tu funkci createComponentPrice, jen abys videl, co se stane..

EDIT: Jinak samozrejme muzes zkusit promazat cache, tim se nikdy nic nezkazi :)

Editoval MartyIX (9. 4. 2012 11:12)

xmilde
Člen | 13
+
0
-

MartyIX to můj problém neřeší,v okamžiku kdy komponentu mám v AdminPresenteru tak se zobrazí,jakmile ji dám kamkoliv jinam,pak se objeví daná hláška. Cache na to nemá vliv. výše je napsáno,že jsem na jiném Presenteru a to je to,s čím si nevím řady. díky

xmilde
Člen | 13
+
0
-

to se tu fakt nenajde někdo, kdo by mi s tím pomohl? já snad za to i zaplatím :-)

norbe
Backer | 405
+
0
-

Budeš muset dát někam ke stažení nějakou co nejvíc ořezanou verzi, ve které ti to nejde…

Václav Mašín
Člen | 34
+
0
-

Výstřel hodně naslepo a tudíž nejspíš do mima, ale stejnou hlášku mi to tuhle hlásilo, když jsem se pokoušel odkazy na akci prezenteru v šabloně komponenty vyrábět pomoci latte makra {link} místo žádoucího {plink}.

MartyIX
Člen | 217
+
0
-

xmilde: Cim vic zdrojaku zverejnis, tim vetsi mas sanci, ze tvuj problem bude vyresen. Zkus prihodit about.latte

Václav Mašín
Člen | 34
+
0
-

Tak ještě doplnění mého příspěvku výše – zkuste schválně změnit buď název oné komponenty nebo té akce prezenteru ‚price‘ na něco trochu jiného (např. něco jako ‚pprice‘ bude stačit).

xmilde
Člen | 13
+
0
-

Václav Mašín napsal(a):

Tak ještě doplnění mého příspěvku výše – zkuste schválně změnit buď název oné komponenty nebo té akce prezenteru ‚price‘ na něco trochu jiného (např. něco jako ‚pprice‘ bude stačit).

zkoušel jsem ale vůbec žádna změna.Dám sem tedy dané kódy:
bootstrap.php

// Enable RobotLoader - this will load all classes automatically
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
	->addDirectory(APP_DIR)
	->addDirectory(LIBS_DIR)
	->register();
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');
$container = $configurator->createContainer();
// Setup router
$container->router[] = new Route('admin/<action>[/<id>]', 'Admin:default');
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
// Configure and run the application!
$container->application->run();

výpis menu v @layout.latte (AdminModule)

<div id="menu">
	{if $user->isLoggedIn()}
		<ul n:inner-foreach="$adminmenu as $item => $link">
			<li ><a href="{plink Admin:$link}">{$item}</a></li>
		</ul>
	{/if}
</div>

AdminPresenter:

use Nette\Application\UI,
	Nette\Security as NS;
use Nette\Application\UI\Form;

class AdminPresenter extends Nette\Application\UI\Presenter{

	public function beforeRender(){
		$this->template->adminmenu = array(
			'O nás' => 'about',
			'Náš tým' => 'team',
			'Ceník' => 'cenik',
			);
	}
	public function createComponentSignInForm(){
		$form = new Form;
		$form -> addText('username', 'Uživatelské jméno:', 30, 20);
		$form -> addPassword('password', 'Heslo:', 30, 20);
		$form->addSubmit('login', 'Přihlásit se');
		$form->onSuccess[] = callback($this, 'signInFormSubmitted');
		return $form;
	}
	public function signInFormSubmitted(Form $form)
	{
		try {
			$user = $this->getUser();
			$values = $form->getValues();
			//if ($values->persistent) {
			//	$user->setExpiration('+30 days', FALSE);
			//}
			$user->login($values->username, $values->password);
			$this->flashMessage('Přihlášení bylo úspěšné.', 'success');
			$this->redirect('Administrace');
		} catch (NS\AuthenticationException $e) {
			$form->addError('Neplatné uživatelské jméno nebo heslo.');
		}
	}
	public function handleSignOut()
	{
		$this->getUser()->logout();
		$this->redirect('Admin:default');
	}
}

AboutPresenter:

use Nette\Application\UI,
	Nette\Security as NS;
use Nette\Application\UI\Form;

class AboutPresenter extends Nette\Application\UI\Presenter{

	public function Wysiwyg_onSuccess(Form $form){
		$this->context->createAbout()->update(array('text' => $form->values->text,));
		$this->flashMessage('Zaznam byl ulozen.', 'success');
		if (!$this->isAjax()) {
			$this->redirect('this');
		} else {
			$form->setValues(array(), TRUE);
			$this->invalidateControl('form');
			$this['Admin']->invalidateControl();
		}
	}

	public function createComponentWysiwyg()
	{
		$form = new Nette\Application\UI\Form();
		$form->onSuccess[] = callback($this, 'Wysiwyg_onSuccess');
		$form->addTextArea('text', '')->getControlPrototype()->class('mceEditor')->style('width:855px;height: 480px;');
		//$form -> addSubmit('save', 'Uloz');
		return $form;
	}
}

CenikPresenter:

use Nette\Application\UI,
	Nette\Security as NS;
use Nette\Application\UI\Form;

class CenikPresenter extends AdminPresenter{

	public function createComponentCenik(){
		$form = new Form();
		$form->addText('stroj', 'Nazev stroje:', 50);
		return $form;
	}
}

about.latte:

{block content}
{control wysiwyg}

cenik.latte:

{block content}
{control cenik}

v okamžiku, kdy dám komponenty do AdminPresentru tak fungují. V tomto případě se právě hlásí již několikrát zmíněná hláška a já jsem totálně v koncích a nevím co s tím a jak dál. Díky všem co se snaží mi pomoci.

Editoval xmilde (11. 4. 2012 12:41)

petr.pavel
Člen | 535
+
0
-

Naskočil jsem až teď a mám trochu problémy se zorientovat (i kvůli tomu prďochovi, co si na chvíli ukradl vlákno pro sebe).

Oprav mě, jestli mám někde mezeru:

  • Jakou akci presenteru About voláš?

    Jak vypadají zdrojáky metod, které ji obsluhují? Jestli tam máš někde $this[‚price‘] tak to je ono.

  • Není mi jasné, jak to, že se šablona pro akci presenteru About jmenuje about.latte, ale budiž.
  • Jestli to dobře chápu, hledáš, proč About:akce potřebuje komponentu price, když (si myslíš), že na ni ve skutečnosti neodkazuje. Pravda?
  • Určitě jsi poslal celou definici wysiwyg v createComponentWysiwyg()?
  • Když Laděnka hlásí Component … does not exist, tak ti taky ukáže, kde se s tou komponentou pokoušíš pracovat. Projdi si celý „stack“ volání, nekoukej jen na právě rozbalenou větev. Mělo by tě tam něco trknout. Případně pošli odkaz na Laděnku.

Editoval petr.pavel (11. 4. 2012 13:15)

xmilde
Člen | 13
+
0
-

petr.pavel napsal(a):

Naskočil jsem až teď a mám trochu problémy se zorientovat (i kvůli tomu prďochovi, co si na chvíli ukradl vlákno pro sebe).

Oprav mě, jestli mám někde mezeru:

  • Jakou akci presenteru About voláš?

U AboutPresenteru a jeho šabloně volám vykreslení komponenty wysiwyg

Jak vypadají zdrojáky metod, které ji obsluhují? Jestli tam máš někde $this[‚price‘] tak to je ono.

Co se tyče jednotlivých metod, nikde není $this[‚price‘]

  • Jestli to dobře chápu, hledáš, proč About:akce potřebuje komponentu price, když (si myslíš), že na ni ve skutečnosti neodkazuje. Pravda?

Skoro … About:akce potřebuje komponentu wysiwyg Cenik:akce potřeuje komponentu ceník ( dřive price ) a v okamžiku, kdy tyto komponenty vytvořím v AdminPresenteru a v šabloně vykresím, tak je to bez problémů a jakmile je nacpu do příslušných presenterů, tak se hlásí že neexistují.

  • Určitě jsi poslal celou definici wysiwyg v createComponentWysiwyg()?

Jasně – jinak kdyby byla v AdminPresenteru, tak by nefungovala.

fr
Člen | 8
+
0
-

Šablona pro akci presenteru About se jmenuje about.latte kvůli tomu, že se nachází v ...../app/templates/Admin/ ?

Jestli ano, potom vytváření komponenty v ...../app/templates/About/default.latte funguje ?