Vykreslení stejné komponenty (gridu) na jedné stránce s různými parametry
- krust
- Člen | 14
Ahoj, ve zkratce. V detailu záznamu jsou připojené kategorie a ke každé z nich jsou připojené subzáznamy. Mám komponentu (DataGrid) na vykreslování těchto připojených subzáznamů, ale každý musí logicky obsahovat jiné data.
Latte:
{foreach $segments as $sid=>$segment}
<div class="col-12">
<div class="card">
<div class="card-header row">
<div class="col-6 text-start">
<h4>{$segment}</h4>
</div>
<div class="col-6 text-end">
<button class="btn btn-primary btn-sm" href="#" data-bs-toggle="modal" data-bs-target="#addContactPersonModal" type="button">Připojit</button>
</div>
</div>
<div class="card-body">
{control contactsPersonsGrid, $sid}
</div>
</div>
</div>
{/foreach}
Presenter:
public function createComponentContactsPersonsGrid($name,$segment = 0)
{
$grid = new DataGrid($this, $name);
if($segment > 0){
$grid->setDataSource($this->model->query("SELECT * FROM contacts_persons WHERE id IN (SELECT person FROM relations_contacts WHERE company = ? AND segment = ?)",$this->id,$segment)->fetchAll());
}else{
$grid->setDataSource($this->model->query("SELECT * FROM contacts_persons WHERE id IN (SELECT person FROM relations_contacts WHERE company = ?)",$this->id)->fetchAll());
}
...
Začínám chápat, že parametr latte->presenter je NO GO ZONE, ale asi úplně nevím, jak tohle vyřešit :-) budu rád za rady. Díky
Editoval krust (13. 10. 2021 21:36)
- Marek Bartoš
- Nette Blogger | 1280
createComponent* sevolají vždy jen jednou, potom už se pracuje
s existující komponentou. Vyřešíš to použitím multiplieru, který ti
pro každé id vrátí novou komponentu.
https://doc.nette.org/…n/multiplier
- krust
- Člen | 14
Marek Bartoš napsal(a):
createComponent* sevolají vždy jen jednou, potom už se pracuje s existující komponentou. Vyřešíš to použitím multiplieru, který ti pro každé id vrátí novou komponentu.
https://doc.nette.org/…n/multiplier
To mi vrací Component ‚contactsPersonsGrid0‘ already has a parent.
S tím, že začátek mám takto
return new Multiplier(function ($itemId) {
$grid = new DataGrid($this, "contactsPersonsGrid{$itemId}");