Propojení Modelu s Komponentou
- Fyasko
- Člen | 106
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
@inject funguje jen v presenteru, pouzij na to generovanou tovarnicku, viz treba https://doc.nette.org/…s/form-reuse#…
- Fyasko
- Člen | 106
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
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