Komponenta – formulář – šablona komponenty s proměnným textem

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

Zdravím, řeším následující problém:
V administraci se mi několikrát opakuje potvrzovací formulář pro smazání nějakého objektu (aktuality, uživatele, dokumentu, atd.) a proto jsem se rozhodl využít formuláře jako komponenty.

Formulář má vždy dvě tlačítka – Smazat a a Storno + nějaký potvrzovací text s proměnnou.
Např: „Opravdu si přejete smazat uživatele XYZ?“, „Opravdu si přejete smazat dokument ABC?“

A snažím se vyřešit, jak tento text s proměnnou předat do šablony dané komponenty aniž bych ho musel nasettovat v presenteru při vytváření komponenty (pokud to tedy jde).

Komponenta DeleteForm:

public function _construct()
{
  parent::__construct();
}

public function createComponentDeleteForm()
{
    $form = new \Nette\Application\UI\Form();

    $form->addSubmit('delete', 'Smazat');
    $form->addSubmit('cancel', 'Storno')->setValidationScope(NULL);
    // metodu pro zpracovani formulare ted pomineme
    return $form;
 }

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

//setter a getter pro element legend

presenter NewsPresenter:

public function createComponentDeleteForm()
  {
    $cmp = new DeleteForm();
    $cmp->setLegend('Smazání aktuality');
    return $cmp;
  }

šablona komponenty deleteForm.latte:

{control $control['deleteForm'] begin}
{control $control['deleteForm'] errors}

<fieldset>
  <legend>{$control->legend}</legend>
  <p>
    <!-- Zde potřebuju vypsat větu: "Opravdu si přejete smazat aktualitu $newsItem?" -->
  </p>
  <p>
    {$control['deleteForm']['delete']->control}
    {$control['deleteForm']['cancel']->control}
  </p>
</fieldset>

{control $control['deleteForm'] end}

a tohle je šablona metody renderDelete() delete.latte:

{block content}

  {control deleteForm}

{/block}

Proměnnou $newsItem si do šablony delete.latte předávám pomocí této metody v presenteru:

public function renderDelete($id = 0)
  {
    $newsItem = $this->getModel($this->model)->getNews()->get($id);

    if (!$newsItem) {
      $this->flashMessage('Požadovaný záznam nebyl nalezen v databázi!', 'warning');
      $this->redirect(':Admin:News:default');
    }

    $this->template->newsItem = $newsItem;
  }

Jenže jí už samozřejmě nemám dostupnou v šabloně komponenty deleteForm.latte.
Lze toho nějak docílit + abych mohl pro každé vykreslení formuláře dát jiný potvrzovací text?
Děkuji za odpověď.

Nox
Člen | 378
+
0
-

Teď novém configu Nette to půjde určitě skvěle(ji) – použit tvorbu komponent přes faktor- … no jo, ale co zase bez kontextu, by se musel komponentě předat celý kontext…no tak teď nevim :)

Ale jo, možná to půjde. Ala jak jsem se ptal tady: https://forum.nette.org/…dependencies

I když to má zas daň tu, že se může killnout lazy loading, pokud se používá

Takže tu máš asi 4 možnosti :) možná někdo přijde s dalšíma

  1. předat kontext, vytvářet přes factories
  2. vytvářet přes factories, ale nastavit v presenteru (viz odkaz)
  3. vytvářet normálně, ale nastavit v presenteru (viz odkaz)
  4. vytvářet normálně a všechny závislosti předat
chr1s
Člen | 15
+
0
-

Nox napsal(a):

Teď novém configu Nette to půjde určitě skvěle(ji) – použit tvorbu komponent přes faktor- … no jo, ale co zase bez kontextu, by se musel komponentě předat celý kontext…no tak teď nevim :)

Ale jo, možná to půjde. Ala jak jsem se ptal tady: https://forum.nette.org/…dependencies

I když to má zas daň tu, že se může killnout lazy loading, pokud se používá

Takže tu máš asi 4 možnosti :) možná někdo přijde s dalšíma

  1. předat kontext, vytvářet přes factories
  2. vytvářet přes factories, ale nastavit v presenteru (viz odkaz)
  3. vytvářet normálně, ale nastavit v presenteru (viz odkaz)
  4. vytvářet normálně a všechny závislosti předat

Nejsem si úplně jistej, zda vím, co mám přesně dělat. Co představují ty jednotlivé služby serviceA, serviceB atd?