„TextDisplay“ Control, jak na něj?
- TheKronnY
- Člen | 22
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
Pokud nechces mit prvek soucasti values, pouzij setOmitted: https://doc.nette.org/cs/forms#…
- TheKronnY
- Člen | 22
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?
- TheKronnY
- Člen | 22
<?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)
- Oli
- Člen | 1215
Nepomohlo by ti loadHttpData? Já si to třeba předávám takhle https://github.com/…electize.php#L191
- duke
- Člen | 650
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
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