Vykreslení stejné komponenty (gridu) na jedné stránce s různými parametry

krust
Člen | 12
+
0
-

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. 21:36)

Marek Bartoš
Nette Blogger | 501
+
+4
-

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/…k/multiplier

krust
Člen | 12
+
0
-

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/…k/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}");
Milo
Nette Core | 1202
+
+5
-

Vypadá to, že ty v tom DataGridu připojuješ DataGrid k presenteru. To nemusíš. A ani nemusíš předávat do něj název komponenty. Tohle si Nette vyřeší samo, jakmile ho továrnička createComponent…() resp. Multiplier vrátí. Do konstruktoru si pouze předej $segment.