„TextDisplay“ Control, jak na něj?

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

Zdravím,

už nějakou dobu jsem se pokoušel vymyslet nějaký jednoduchý TextDisplay control pro form, ale nedokázal jsem si s tím ve výsledku poradit a potřeboval bych pomoct.
Můj hlavní problém je, že v případě, že do tohoto controlu dávám nějakou variabilní věc, tak v případě uživatelské chyby ve formuláři se při jeho redraw TextDisplay resetuje. A dále – Form ho považuje jako součást, tzn. v $values je uvedený, což dokáže zamávat s query do db.
Potřeboval bych radu jak na takovýto control.

Díky,
TheKronnY

David Matějka
Moderator | 6445
+
+4
-

Pokud nechces mit prvek soucasti values, pouzij setOmitted: https://doc.nette.org/cs/forms#…

TheKronnY
Člen | 22
+
0
-

A co mám udělat s tím controlem, když chci, aby při redrawu formuláře obsahoval původní informaci? Typu – formulář pro úpravu záznamu uživatele TextDisplay bude pro user_ud + nějaký html kód – ve chvíli, kdy bude třeba formulář redrawnout tak se jeho obsah vyresetuje, co s tím?

Aurielle
Člen | 1281
+
0
-

Jak tu hodnotu nastavuješ? Nestačilo by setValue() v továrničce?

TheKronnY
Člen | 22
+
0
-
<?php

namespace App\Forms\Controls;

use Nette,
	Nette\Utils\Html;

class TextDisplay extends Nette\Forms\Controls\BaseControl
{
	private $text;

	public function __construct($label = "", $text = null)
	{
		parent::__construct($label);
		$this->control = Html::el('div');
		$this->setOmitted();
	}

	public function setDefaultValue($value)
	{
		$form = $this->getForm(FALSE);
		if ($this->isDisabled() || !$form || !$form->isAnchored() || !$form->isSubmitted()) {
			$this->setValue($value);
		}
		return $this;
	}

	public function setValue($value)
	{
		$this->text = $value;
		return $this;
	}

	public function getValue()
	{
		return $this->text;
	}

	public function getControlPrototype()
	{
		return $this->control;
	}

	public function getControl()
	{
		return $this->getControlPrototype()->setHtml($this->getValue());
	}
}

Takhle to je celý ten control, ve chvíli kdy ho submitnu a ajaxem redrawnu, tak už obsah nemá :(

Editoval TheKronnY (18. 1. 2016 18:13)

TheKronnY
Člen | 22
+
0
-

Má někdo nápad, jak docílit toho, aby se původní hodnota v controlu alespoň udržela? To je prakticky jediné, o co mi jde :)

Oli
Člen | 1215
+
0
-

Nepomohlo by ti loadHttpData? Já si to třeba předávám takhle https://github.com/…electize.php#L191

David Matějka
Moderator | 6445
+
0
-

Uz se ptal @Aurielle, jak tu hodnotu nastavujes?

TheKronnY
Člen | 22
+
0
-

Tuším, že $this['userEditForm']->setDefaults($user_object) při tom prvním načtení.

duke
Člen | 650
+
0
-

Zkus do své třídy TextDisplay přidat:

public function loadHttpData()
{
}

Nicméně pak budeš muset ještě zajistit, aby byla hodnota nastavena při vytváření formuláře (buď voláním setValue nebo setDefaultValue, ale v případě setDefaultValue je nutno volat ještě před připojením formulářové komponenty k presenteru).

Této komplikaci se nicméně můžeš vyhnout tak, že přepíšeš i metodu setDefaultValue takto:

public function setDefaultValue($value)
{
	return $this->setValue($value);
}

Editoval duke (19. 1. 2016 17:26)

David Matějka
Moderator | 6445
+
0
-

no jelikoz to zobrazujes jako DIV, tak se to neodesle v http datech. a setDefaults (resp setDefaultValue) se vola pouze pokud nebyl formular odeslan

takze, jak radil @Aurielle, staci zavolat pro tento prvek setValue