Makro s přístupem do databáze
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- mkoubik
- Člen | 728
Lepší bude použít vlastní komponentu a Multiplier.
Renderoval bys to pak pomocí {control komponenta-klic}
. Jen pozor
na to, aby se ti pro každou vykreslenou hodnotu nepokládal samostatný dotaz
do db, pokud jich bude hodně.
- trejjam
- Backer | 65
Děkuji za nasměrování, vymyslel jsem toto, je to napsáno „vhodně“?
BasePresenter.php:
function createComponentLabels() {
$labels=$this->context->labelsService;
return new Nette\Application\UI\Multiplier( function ($data) use ($labels) {
$label=new \Label($labels->getData($data));
return $label;
});
}
Label
class Label extends \Nette\Application\UI\Control {
private $text;
public function __construct($text) {
parent::__construct();
$this->text = $text;
}
public function render()
{
echo $this->text;
}
}
LabelsService:
class LabelsService extends \Nette\Application\UI\Control {
private $database;
private $labels=array();
private $data="";
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function getData($name) {
if (in_array($name, $this->labels)) {
return $this->labels[$name];
}
else {
$value=$this->database->table("labels")->select("value")->where(array("name"=>$name))->fetch();
return $this->labels[$name]=$value->value;
}
}
public function setData($name, $data) {
$this->database->table("labels")->where(array("name"=>$name))->update(array("value"=>$data));
$this->labels[$name]=$data;
}
function &__get($name) {
$this->getData($name);
return $this->labels[$name];
}
}
Při psaní mi pomohl záznam ze Soboty: https://www.youtube.com/watch?…
Editoval trejjam (5. 5. 2014 0:12)