Rozsirovanie formulara komponenty o dalsie forularove prvky a nezavysle spracovanie a renderovanie prvku

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

Caute hladam riesenie na moj problem.
Mam komponentu UI\Control ktora ma v sebe formular, a chcem tento formular rozsirit o nejake formularove prvky, ale tak ze spracovanie (ukladanie, renderovanie) tohto prvku bude riesene mimo formulara. Rozsirenie a spracivanie noveho fieldu pre form mam vyriesene tak ze pridam do toho controlu componentu ktora to riesi, ale neviem ako vyriesit nezavysle renderovanie. nerobili ste to uz niekto? nejaka rada?

Toto je samozrejme zjednodusene riesenie pre priklad, Proste neviem ako vyrenderovat form prvok v innej sablone.

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

	/** @var array */
	public $onSave = array();

	/**
	 * @return \Nette\Application\UI\Form
	 * @throws InvalidArgumentException
	 */
	protected function createComponentForm() {
		$form = new \Nette\Application\UI\Form();

		$form->addText("title", "Titulok");

		$form->addSubmit('save', 'Uložiť')
			->onClick[] = array($this, 'processSave');
		return $form;
	}

	/**
	 * @param \Nette\Forms\Controls\SubmitButton $button
	 * @throws \Exception
	 */
	public function processSave(\Nette\Forms\Controls\SubmitButton $button) {
		$form = $button->getForm();
		// Process form

		$this->onSave($this, $form);
	}

	public function render() {
		$form = $this->getComponent('form');
		$this->template->_form = $this->template->form = $form;
		$this->template->render();
	}
}
// tovarnicka
	protected function createComponentPost(IPostFormControlFactory $postFormFactory) {
		$control = $postFormFactory->create(...);

		$metaContentProvider = new MetaContentProvider();
		$control->addComponent($metaContentProvider->create($control), 'metaContentProvider');

		return $control;
	}
// MetaContentProvider
class MetaContentProvider extends Control implements IPostMeta {

	/** @var  string */
	public $templateFile;

	protected $control;

	public function __construct() {
		parent::__construct();
		$this->templateFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MetaContentProvider.latte';
	}

	/**
	 * @param PostFormControl $control
	 * @return $this
	 */
	public function create(PostFormControl $control) {

		$this->control = $control;

		$control->onSave[] = array($this, 'processSave');

		$form = $control->getComponent('form');
		$form->onValidate[] = array($this, 'processValidate');

		$metaContainer = $form->addContainer('metaContent');

		$metaContainer->addTextArea("content", "Obsah");

		return $this;
	}

	/**
	 * @param Form $form
	 */
	public function processValidate(Form $form) {
		//
	}

	/**
	 * @param PostFormControl $control
	 * @param Form            $form
	 */
	public function processSave($control, $form) {
		$values = $form->getValues();
	}


	public function render() {
		$form = $this->control->getComponent('form');
		$this->template->_form = $this->template->form = $form;
		$this->template->setFile($this->templateFile);
		$this->template->render();
	}
// sablona meta - renderujem manualne
{formContainer metaContent}
	{label content/}
	{input content}
{/formContainer}
// v sablone komponenty formulara
<form n:name=form role="form">
	{label title/}
	{input title}
	...

	// komponenta rozsirujuceho formulara
	{control metaContentProvider}
</form>

Editoval duskohu (16. 2. 2017 10:41)