Problém s komponentou – Component with name ‚…‘ does not exist
- xmilde
- Člen | 13
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)
- xmilde
- Člen | 13
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)
- SendiMyrkr
- Člen | 30
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
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 :-)
- xmilde
- Člen | 13
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
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)
- David Klouček
- Člen | 57
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ý.
- David Klouček
- Člen | 57
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
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
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)
- factor
- Člen | 28
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)
- Václav Mašín
- Člen | 34
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}.
- Václav Mašín
- Člen | 34
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
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
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
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.