Component with name ‚OpenHoursControl‘ does not exist

Cthulhu
Člen | 1
+
0
-

Ahoj, dnes už nad tím trávím možná 5 hodin, projel jsem různé tutoriály na tvorbu komponent, googlil jsem ohledně problému v titulku, ale nejsem schopen problém vyřešit.

app/presenters/Homepage/default.latte jsem vložil tento řádek:
{control OpenHoursControl}

v BasePresenter.php mám následující továrničku:

<?php

namespace App\Presenters;

use Nette;

/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    protected function createComponentOpenHoursControl() {
        $openHours = new \OpenHoursControl;
        return $openHours;
	}
}

app/components mám dva soubory: OpenHoursControl.php

<?php
use Nette\Application\UI\Control;

class OpenHoursControl extends Control
{
    private $database;
    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

	public function render(){
        $template = $this->template;
        $template->setFile(__DIR__ . '/OpenHoursControl.latte');
        $template->data = $this->database->table('vk_openhours')->order('day');
        $template->render();
    }
}

a OpenHoursControl.latte (zatím vyplněno jen zběžně pro test)

{block content}
<p><table id="openHoursTable" class="table table-striped">
<tr n:foreach="$data as $date" class="d-none d-xl-table-row">
<th scope="row">{$date->crew1}</th>
<td>sloupec</td>
</tr>
</table></p>
{/block}

No a píše to, co to píše (Tracy Call Stack):
Component with name ‚OpenHoursControl‘ does not exist.
$_tmp = $this->global->uiControl->getComponent("OpenHoursControl");

Co mi tam chybí? Rád bych se dozvěděl, co jsem v návodech nejspíše opakovaně přehlédl.

CZechBoY
Člen | 3608
+
+2
-
  1. Dědí HomepagePresenter od toho BasePresenteru?
  2. V šabloně bys měl asi mít první písmeno malé – {control openHoursControl}.
  3. Nepředáváš si databázi do komponenty takže jak to rozjedeš tak ti to spadne na chybějícím parametru. Doporučuju si přečíst část dokumentace, kde je vysvětleno jak si zjednodušit práci s komponentami se závislostmi https://doc.nette.org/…dependencies#….
Ondřej Kubíček
Člen | 494
+
+1
-

v šabloně musí název komponenty začínat malým písmenem

{control openHoursControl}
Šaman
Člen | 2632
+
0
-

A název souboru openHoursControl.latte by měl začínat také malým. Velké písmeno označuje Třídu, nebo IRozhraní.

David Grudl
Nette Core | 8082
+
+1
-

Co máš za verzi Nette?

Mělo by to vypsat hlášku Component with name ‚OpenHoursControl‘ does not exist, did you mean ‚openHoursControl‘?

CZechBoY
Člen | 3608
+
+1
-

@Šaman To je snad jeho konvence, nemusí to být vůbec tak jak píšeš.

Šaman
Člen | 2632
+
0
-

CZechBoY napsal(a):

@Šaman To je snad jeho konvence, nemusí to být vůbec tak jak píšeš.

No, je to konvence, která pomáhá předcházet takovým chybám, na kterou hledá odpověď. Jestli ví, co dělá (tedy jestli doopravdy má nějakou konvenci a drží ji), pak ok. Ale jestli v tom ještě lítá, tak je lepší zvyknout si na zavedenou konvenci – jestli bude někdy třeba copypastovat nějaké řešení a nebudou sedět velikosti písmen, tak na Linuxu mu to zařve. A propo teď to na case sensitive systémech načte šablonu Default.latte, když mám pohled default? Doma mám wokna a těm je to jedno, ale řekl bych, že kdyby tu šablonu nenastavoval ručně (se správnou velikostí písmen) v komponentě, ale byla to šablona presenteru, která se hledá defaultně, tak mu šablona s velkým písmenem na začátku nebude fungovat. Nebo se pletu? A mít některé šablony s velkým a některé šablony s malým je cesta do ladicích pekel.

A pokud by měl všechny šablony velkým a pracoval jako já na case insensitive systému, kde všechno běhá a pak to nasadil na hosting na Linux… Tak na to raději upozorňuji rovnou. :)

Editoval Šaman (7. 12. 2018 22:35)

CZechBoY
Člen | 3608
+
0
-

@Šaman kde vidis default? vsak tam ma

$template->setFile(__DIR__ . '/OpenHoursControl.latte');
vanaveno
Člen | 144
+
0
-

Dobrý den, mám úplně stejný problém. Postupuji podle vašich návodů pomalinku v před, ale právě u tvorby controloru jsem zabředl do pořádnýho bahna. Zkoušel jsem problém řešit podle různých návodů a hlášek jsem řešil různých druhů podle různých návodů. Posílám aktulální kódy:

soubor app/presenters/Basepresenter.php

namespace App\Presenters;

use Nette;

/**
 * Base presenter for all application presenters.
 */

abstract class BasePresenter extends Nette\Application\UI\Presenter
{

 protected function createComponentCategoryControl() {
        $category = new \CategoryControl;
        return $category;
    }

}
soubor app/components/CategoryControl.php
<?php

namespace App\Components;

use Nette\Application\UI\Control;

class CategoryControl extends Control
{


    private $database;

	public function __construct(Nette\Database\Context $database)
    {

	$this->database = $database;
    }

    public function render()
    {
        $template = $this->template;
        $template->setFile(__DIR__ . '/categoryControl.latte');
        // vložíme do šablony nějaké parametry
        $this->template->categories = $this->database->table('categories');
        // a vykreslíme ji
        $template->render();
    }
}
soubor app/components/categoryControl.latte
<ul>
 {foreach $categories as $category}
        <li><a href="{$category->url}">{$category->title}</a></li>
    {/foreach}
</ul>
soubor app/templates/Homepage/default.latte
{block content}
<div id="home">
	<div class="container pad4000">
		<h1>Úvodní stránka</h1>
		{control categoryControl}
	</div>
</div>
{/block}
Mám nainstalovánu nette 2.4, operační systém Ubuntu 14.04
A hlásí mi to Component with name 'categoryControl' does not exist
Děkuji za pomoc

Editoval vanaveno (13. 12. 2018 16:13)

David Matějka
Moderator | 6445
+
0
-

@vanaveno dedi HomepagePresenter od BasePresenteru?

vanaveno
Člen | 144
+
0
-

David Matějka napsal(a):

@vanaveno dedi HomepagePresenter od BasePresenteru?

Děkuji za rychlou odpověď. No popravdě jsem to neměl, ale to je tím, že už jsem to x-krát předělával takže teď je to tak

<?php

namespace App\Presenters;

use Nette;
use Nette\Application\UI;


class HomepagePresenter extends BasePresenter
{
    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function renderDefault()
{
    $this->template->posts = $this->database->table('posts')
        ->order('created_at DESC')
        ->limit(5);
}
}


<?php

namespace App\Presenters;

use Nette;

/**
 * Base presenter for all application presenters.
 */

abstract class BasePresenter extends Nette\Application\UI\Presenter
{

 protected function createComponentCategoryControl() {
        $category = new \CategoryControl;
        return $category;
    }

}
A teď mi to hlásí

Error
Class 'CategoryControl' not found a ukazuje mi to červeně řádek

  $category = new \CategoryControl;

Editoval vanaveno (13. 12. 2018 16:11)

Tyraxor
Člen | 31
+
+1
-

Ahoj,

při instancování té komponenty máš špatný Namespace

$category = new \CategoryControl;
změn na
$category = new \App\Components\CategoryControl;
nebo přidej "use"
CZechBoY
Člen | 3608
+
+2
-

@vanaveno Používej pls zvýrazňovač syntaxe na foru při vkládání zdrojáků…
Dělá se to přes párový „tag“ /--php a potom uzavřeš přes \--

Editoval CZechBoY (13. 12. 2018 9:34)