Ruční vykreslení komponenty ({control } funguje)

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

Ahoj,
pokouším se ručně vykreslit komponentu, přes {control komponenta} se vykreslí bez problému, ale pokud zkusím něco jako

<form n:name="komponenta"></form>

tak to neprojde a vyhodí tuhle chybu:
Argument 1 passed to Nette\Bridges\FormsLatte\FormMacros::renderFormBegin() must be an instance of Nette\Forms\Form, instance of App\Components\IconMenu given,

Což je podle mě blbost protože form vracím tady:

<?php

namespace App\Components;

class IconMenu extends \Nette\Application\UI\Control {

    private $articles;

public function __construct(\App\Model\Articles $articles) {
    parent::__construct();
    $this->articles = $articles;

}


protected function createComponentIconMenu () {


			$form = new \Nette\Application\UI\Form;

			$form->addButton('add', 'Add');
			$items = [];
			/*
			foreach ($this->loadedArticles as $id => $article) {
				$items[$id] = $article->title;
			}
			 */
			$form->addCheckboxList('article', 'article', $items);
			$form->addSubmit('edit', 'Edit');
				/*->onClick[] = $this->editButtonClicked; */
			$form->addSubmit('delete', 'Delete');
				/*->onClick[] = $this->deleteButtonClicked; */

			return $form;
		}

public function render() {

	$this['iconMenu']->render();


    }


}

A tady jí v HomepagePresenteru tvořím:

/**
		* @return \App\Components\IconMenu
		*/
		protected function createComponentIconMenu() {



		  return $this->iconMenuFactory->create();

		}

Tipuju, že to přes form n:name nejde, ale jak jinak ručně vykreslit komponentu?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Use <form n:name="komponenta-iconMenu"></form>.

David Matějka
Moderator | 6445
+
+3
-

ty tam mas totiz strom komponent:

presenter
--- iconMenu (vytvarene v preseneru)
    --- iconMenu (form vytvareny v te komponente)

Pokud bys primo v presenteru chtel vykreslit pouze ten form, musel bys

<form n:name="iconMenu-iconMenu">
</form>

ale spise doporucuju mit v komponente sablonu s

<form n:name="iconMenu">
</form>

(vsimni si, ze ted uz je tam pouze iconMenu, protoze je to primo pod komponentou)
a v renderu budes mit neco jako

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

a v presenteru komponentu vykreslis pomoci {control iconMenu} (a ta komponenta vykresli svoji sablonu s custom renderovanim formu)

Freestyler
Člen | 50
+
0
-

@matej21: Super, díky !!!. Funguje perfektně. Teď teda ještě jde o to, že ta komponenta je v podstatě box s tlačítkama (add, edit, delete, published, save, close etc.). A já bych rád v každém presenteru vykreslil jen ty tlačítka, která budou potřeba (tzn. když edituji článek, nepotřebuji tlačítko pro edit/add/delete, ale stačí mi save, close atd.).

Je lepší řešení než šablona pro každý „box“ tlačítek? A jak ho vykreslím, když v renderu definuji jednu šablonu. Napadlo mě udělat jednu šablonu a tam vždy ifCurrent. Je to správné řešení? Popř. jak to udělat lépe/jinak.

Díky.

Editoval Freestyler (26. 8. 2014 17:37)

David Matějka
Moderator | 6445
+
0
-

@Freestyler dej si na tu komponentu nejakej setter, kterym nastavis, jaky „mod“ se ma pouzit. Komponenta se dle toho pak vykresli…