Model v komponentě – a „falešná“ chybová hláška že tabulka neexistuje

Gruid
Člen | 25
+
0
-

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

jAkErCZ
Člen | 321
+
+2
-

A máš dobře nastavený přístup do databáze?

Gruid
Člen | 25
+
0
-

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…

CZechBoY
Člen | 3608
+
0
-

@Gruid No radši ani nechci vědět kde si to zjistilo parametry k připojení k databázi.

Co přesně ti není jasný na injektování?

Gruid
Člen | 25
+
0
-

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

@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