Model v komponentě – a „falešná“ chybová hláška že tabulka neexistuje
- Gruid
- Člen | 25
Ahoj, už jsem z toho celej šišatej. Učím se dělat komponenty a došel jsem ke skoro funkční verzi. Nejspíše něco nechápu dobře a dělám nějakou děsnou volovinu. Prosím o radu. Nekoukejte na názvy je to bastlený v sanboxu z composeru a podle manuálů tady na webu.
Tracy mi vypíše chybu Table ‚wtc_data‘ does not exist.
Ale nenechte se prosím zmást, tabulka samozřejmě existuje, ve
stejném projektu mimo komponentu jí používám a vše funguje. Jen v té
komponentě nikoliv :(
Verze nette 2.4 dnes aktuální stable sandbox z composeru a php 5.6
takže mám pollControl.php
<?php
use Nette\Application\UI\Control;
use App\Model;
use App\Controls;
class PollControl extends Control
{
/**
* @var App\Model\PollManager
*/
private $pollManager;
/**
* @var int Id ankety pro kterou vytváříme komponentu
*/
private $pollId;
/**
* @param $pollId
* @param App\Model\PollManager $pollManager model starající se o hlasování
*/
public function __construct($pollId, App\Model\PollManager $pollManager)
{
$this->pollManager = $pollManager;
$this->pollId = $pollId;
}
public function render()
{
$m_id = "1";
$test = $this->pollManager->getLastRow($m_id);
$this->template->lastRow = $test;
$template = $this->template;
$template->setFile(__DIR__ . '/pollControl.latte');
// vložíme do šablony nějaké parametry
//$template->param = $value;
// a vykreslíme ji
$template->render();
}
}
?>
Pak mám pollManager.php
<?php
namespace App\Model;
use Nette\Database\Connection;
use Nette\Database\Table\IRow;
use Nette\Database\Table\Selection;
use Nette\Database\Context;
use Nette\Object;
/**
* Základní třída modelu pro všechny modely aplikace.
* Předává přístup k práci s databází.
* @package App\Model
*/
class PollManager extends Object
{
/** @var Context Instance třídy pro práci s databází. */
protected $database;
/**
* Konstruktor s injektovanou třídou pro práci s databází.
* @param Context $database automaticky injektovaná třída pro práci s databází
*/
public function __construct(Context $database)
{
$this->database = $database;
}
public function getLastRow($id)
{
$selection = $this->database->table('wtc_data')
->where('t_id = ?', $id)
->order('time DESC')
->limit(1)
->fetch();
return $selection;
}
}
?>
Dále mám IPollControlFactory:
<?php
interface IPollControlFactory
{
/**
* @param $pollId
* @return PollControl
*/
public function create($pollId);
}?>
a v config neonu:
<?php
services:
- IPollControlFactory
- App\Model\PollManager
router: App\RouterFactory::createRouter
?>
V presenteru nakonec toto:
<?php
namespace App\Presenters;
use Nette;
use App\Model;
use App\Controls;
class HomepagePresenter extends BasePresenter
{
/**
* @var \IPollControlFactory
* @inject
*/
public $pollControlFactory;
protected function createComponentPollControl()
{
$pollId = 1; // můžeme si předat náš parametr
return $this->pollControlFactory->create($pollId);
}
public function renderDefault()
{
$this->template->anyVariable = 'any value';
}
}
?>
Když zakomentuju řádek $selection =
$this->database->table(‚wtc_data‘)
tak se mi komponenta vykreslí, což je jasné. Ale proč to píše právě tuto
chybu nechápu :( Protože opravdu stejnou funkci používám v jiným modelu
bez problémů.
Děkuji za trpělivost se začátečníkem :)
- Gruid
- Člen | 25
Stoprocentně mám – mám malý projekt, který funguje – stránka, co něco vypisuje a „jen“ jsem chtěl tento projekt udělat jako komponentu. Takže mi to stále funguje a jen v tomto funkčním bastlím komponentu, která dělá to samé jako celý projekt. Ale dal jsem si na nějakou dobu od nette pokoj a teď jsem po pár verzích trochu ztracenej v tom injektování atd. Dříve jsem prostě v komponentě dal:
<?php
$model = new \necoModel();
?>
A všechno frčelo…
- Gruid
- Člen | 25
No nebylo mi jasný asi tak všechno :)
Nevim proč, ale s dokumentací tady na webu nette mám občas problém a
přijde mi zmatečná. Články jsou různě odkazovány jeden na druhý
v nichž se mísí různé postupy. Například když si čtete
o komponentách a závislostech, tak vás to odkáže na DI a tam už nevíte
která část se vás týká a takto se zanořujete dál a dál. Chápu, že pro
již znalé je to hračka, ale nám začátečníkům a nebo i lehce
pokročilým to může občas pěkně zamotat hlavu :)
Každopádně už jsem se trochu zorientoval, dopracoval se k funkční komponentě a moc mi pomohl tento příspěvek: https://forum.nette.org/…v-komponente#…
I když jak sám autor píše , víceméně jen přepsal původní článek. Ale z tohoto příspěvku jsem mnohem moudřejší.
Děkuji všem ;)
- CZechBoY
- Člen | 3608
@Gruid poslal si špatně odkaz na příspěvek :-(
jinak jestli máš nějaký připomínky k dokumentaci tak můžeš poslat
issue nebo rovnou pull request s opravou https://github.com/nette/docs