Propojení Modelu s Komponentou

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

Dobrý den, Rád bych docílil toho, že na každé stránce(tedy voláno z layoutu)budu mít počet registrovaných uživatelů. Jediný co mě napadá je Vytvořit model který obsahuje připojení k db, předat to komponentě která data vytáhne z db a tu nakonec z BasePresenteru volat do layoutu.
BaseModel:

<?php
namespace Model;

class BaseModel extends \Nette\Object
{
    /**
    * @inject
    * @var \Nette\Database\Context
     */
    private $database;

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

Komponenta:

<?php
namespace Components;

use Nette\Application\UI;

class NumOfUsers extends UI\Control
{
    /**
     * @inject
     * @var \Model\BaseModel
     */
    public $database;

    public function render()
    {
    	$this->template->setFile(__DIR__ . '/NumOfUsers.latte');
	$this->template->test = $this->database->table('web_users')->count();
    	$this->template->render();
    }

}
?>

BasePresenter:

<?php
namespace App;

use Nette,
	Model;

use Nette\ComponentModel\Component;
/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
protected function createComponentNumOfUsers()
    {
	$control = new \Components\NumOfUsers;
	return $control;
    }
}
?>

No ať se snažím jak se snažím, asi jsem uplně mimo… Nedaří se mi naplnit $database. Mohl by prosím někdo poradit?

David Matějka
Moderator | 6445
+
0
-

@inject funguje jen v presenteru, pouzij na to generovanou tovarnicku, viz treba https://doc.nette.org/…s/form-reuse#…

Fyasko
Člen | 106
+
0
-

Děkuju za radu. Po chvíli trápení s ‚\‘ jsem dosáhl toho že kód nevyhazuje chybu. akorát jsem jaksi nedomyslel proč a jak vypsat ty data.
UPDATE
komponenta:

<?php
namespace Components;

use Nette\Application\UI;

class NumOfUsers extends UI\Control
{
    private $database;

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

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

    protected function createComponentNumOfUsers()
    {
	$num = $this->database->table('web_users')->count();
	return $num;
    }

}
/** rozhranní pro generovanou továrničku */
interface INumOfUsersFactory
{
    /** @return NumOfUsers */
    function create();
}
?>

BasePresenter:

<?php
namespace App;

use Nette,
	Model;

use Nette\ComponentModel\Component;
/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    /** @var \Components\INumOfusersFactory @inject */
    public $numOfUsersFactory;

    protected function createComponentNumOfUsers()
    {
	$control = $this->numOfUsersFactory->create();
	return $control;
    }

}
?>

a samozřejmě CONFIG:
services:
- Components\INumOfUsersFactory


zkoušel několik možností v rámci znalostí ale furt končim v laděnce např:
Method Components\NumOfUsers::createComponentNumOfUsers() did not return or create the desired component.
Omlouvám se, ale opravdu nevím jak na to :/

David Matějka
Moderator | 6445
+
0
-

tu zanorenou komponentu (createComponentNumOfUsers v NumOfUsers komponente) smaz, ten kod presun normalne do render metody, stejne jako si to pouzival v prvnim prispevku

public function render()
{
 $this->template->test = $this->database->table('web_users')->count('*');
}

btw, vsimni si, ze jsem do ->count() pridal jako parametr '*', bez toho parametru se provede dotaz, ktery vybere vsechny uzivatele a provede count() na vysledku

Fyasko
Člen | 106
+
0
-

:D tak jednoduché až se musím smát sám sobě. A tobě samozřejmě mnohokrát děkuji za ztracený čas :) . I když se to nezdá, hodně mi tento příklad pomohl :)