readonly pro celý formulář(komponentu)
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Filip Procházka
- Moderator | 4668
Když použiješ $form->setValues($array)
, tak se ti vždy
nastaví všechny hodnoty znovu jak byly při vytvoření i po odeslání, ale
prvky půjdou v prohlížeči editovat. Stačí takhle?
- natrim
- Člen | 73
Já bych na to pužil speciální renderer který hodnoty jen zobrazí.
Já používám např. toto:
<?php
/**
* Vykresli form bez inputu a buttonu
*/
class ZobrazForm extends ConventionalRenderer {
/**
* bez hlavicky
* @return string
*/
public function renderBegin() {
return '';
}
/**
* bez paticky
* @return string
*/
public function renderEnd() {
return '';
}
/**
* Renders single visual row.
* @param IFormControl
* @return string
*/
public function renderPair(IFormControl $control) {
$pair = $this->getWrapper('pair container');
if ($control instanceof FileUpload) {
} else {
$pair->add($this->renderLabel($control));
if ($control instanceof SelectBox || $control instanceof RadioList) {
$items = $control->getItems();
$value = ($control->getValue() == 0 ? 'Nevybráno' : $items[$control->getValue()]);
$pair->add($this->getWrapper("control container")->add(Html::el('span', array('id' => $control->getHtmlId()))->setText($value)));
} elseif ($control instanceof Checkbox) {
$value = ($control->getValue() == 1 ? 'Ano' : ($control->getValue() == 0 ? 'Ne' : $control->getValue()));
$pair->add($this->getWrapper("control container")->add(Html::el('span', array('id' => $control->getHtmlId()))->setText($value)));
} elseif ($control instanceof DatePicker) {
$pair->add($this->getWrapper("control container")->add(Html::el('span', array('id' => $control->getHtmlId()))->setText(date('d.m.Y', strtotime($control->getValue())))));
} else {
$pair->add($this->getWrapper("control container")->add(Html::el('span', array('id' => $control->getHtmlId()))->setText($control->getValue())));
}
}
$pair->class($this->getValue($control->getOption('required') ? 'pair .required' : 'pair .optional'), TRUE);
$pair->class($control->getOption('class'), TRUE);
if (++$this->counter % 2)
$pair->class($this->getValue('pair .odd'), TRUE);
$pair->id = $control->getOption('id');
return $pair->render(0);
}
/**
* nezobrazuj client script
* @return null
*/
public function getClientScript() {
return null;
}
/**
* Renders single visual row of multiple controls.
* @param array of IFormControl
* @return string
*/
public function renderPairMulti(array $controls) {
$s = array();
foreach ($controls as $control) {
if (!($control instanceof IFormControl)) {
throw new InvalidArgumentException("Argument must be array of IFormControl instances.");
}
if ($control instanceof SubmitButton) {
} elseif ($control instanceof ImageButton) {
} elseif ($control instanceof Button) {
$s[] = (string) $control->getControl();
}
}
$pair = $this->getWrapper('pair container');
$pair->add($this->renderLabel($control));
$pair->add($this->getWrapper('control container')->setHtml(implode(" ", $s)));
return $pair->render(0);
}
}
?>
použití
<?php
$form->setRenderer(new ZobrazForm);
?>
- Jack06
- Člen | 168
Ahoj, zkusil jsem to použít a to následovně:
presenter: http://codepad.org/UIFWFTCZ
renderer: http://codepad.org/jCFVagp7
Udělá mi to následující věc:
Formulář to vykreslí bez inputů ve skupinách ale ještě jednou pod tím
bez skupin.. Takže dvojí výpis.. když renderer nepoužiju, tak se to
vykreslí pouze jednou ale v inputech…