3 select-boxy do jedné buňky tabulky
- Neas
- Člen | 43
Ahoj.
Rád bych udělal formulář vykreslený v tabulce (jako s normálním
rendererem), ale po uživateli vyžaduji zadat datum narození přes
3 select-boxy (rok, den a měsíc). A zde nastává kámen prazu: tyto
3 select-boxy bych rád dal do jedné buňky tabulky za sebe. Několik hodin
jsem pročítal dokumentaci a zkoušel různé fígle, jak je všechny nasadit
do té jedné buňky, ale nepřišel jsem na to, rád bych vás tedy požádal
v této věci o radu. S Nette dělám teprve 2 dny, používám verzi
0.9.7 s namespacy.
Editoval Neas (24. 10. 2011 1:41)
- Filip Procházka
- Moderator | 4668
Máš dvě možnosti.
- Udělat to takto, naprosto uživatelsky nepřívětivě a zlobit se s ručním renderováním (jinak to nejde, mno ještě můžeš udělat nový formulářový prvek = napsat si na to třídu).
- použiješ Datepicker a budeš to mít uživatelsky přívětivější, programově jednodušší a při čtení hodnoty budeš pracovat s objektem DateTime, který je krásný a voňavý, nikoliv s třemi inty, u kterých bys navíc musel řešit, jestli březen má 31 dní, nebo 30 ;)
- Ani
- Člen | 226
Já si na to udělal vlastní form control, mám tam teda 3 inputy (stačí si to nahradit za select a přidat výchozí hodnoty), což mi přijde nejjednoduší. (ono v datepickeru vybrat rok 1950 není taky zrovna userfriendly). Záleží pro koho to je.
Je to pro nette 2, takže by sis musel taky upravit NS, nejlíp když si to napíšeš v rámci sebe vzdělání znova, tohle můžeš použít jako příklad.
<?php
use Nette\Forms\Controls\BaseControl;
use Nette\Forms\Container;
use Nette\Utils\Html;
class DayOfBirth extends BaseControl
{
/** @var Nette\Web\Html container element template */
protected $container;
/** @var array */
protected $items = array (
0 => '',
1 => '',
2 => '',
);
/**
* Form container extension method. Do not call directly.
*
* @param FormContainer $form
* @param string $name
* @param string $label
* @param array $items
* @return CheckboxList
*/
public static function addDayOfBirth(Container $form, $name, $label)
{
$form[$name] = new self($label);
return $form[$name];
}
public function getValue()
{
$value = $this->value;
return $value[2] . '-' . $value[1] . '-' . $value[0];
}
public function setValue($value)
{
$this->value = is_array($value) ? $value : explode('-', $value);
return $this;
}
/**
* @param string $label
* @param array $items Options from which to choose
*/
public function __construct($label)
{
parent::__construct($label);
$this->control->type = 'input';
$this->container = /*Nette\Web\*/Html::el();
}
/**
* Returns container HTML element template.
*
* @return Nette\Web\Html
*/
public function getContainerPrototype()
{
return $this->container;
}
/**
* Generates control's HTML element.
*
* @param mixed $key
* @return Nette\Web\Html
*/
public function getControl($key = NULL)
{
$container = clone $this->container;
$control = parent::getControl();
$name = $control->name;
$id = $control->id;
$values = array_reverse(explode ('-', $this->getValue()));
foreach ($this->items as $k => $val) {
$control->name = $name . '[' . $k . ']';
$control->id = $id . '-' . $k;
$control->class = 'dob dob-' . $k;
$control->value = ($values[$k] != "") ? $values[$k] : $val;
$container->add((string) $control);
}
return $container;
}
/**
* Date validator
*
* @param type $item
* @param type $arg
* @return type
*/
public static function dateFormat($item, $arg){
$value = $item->value;
try {
new \DateTime($value[2] . '-' . $value[1] . '-' . $value[0]);
} catch (Exception $exc) {
return FALSE;
}
return TRUE;
}
}
?>
Editoval Ani (24. 10. 2011 11:34)
- Neas
- Člen | 43
Po dalším pročítání dokumentace stále dokola jsem se rozhodl pro ruční renderování. Datepicker se mi konkrétně do tohoto formuláře desingově nehodí, avšak určitě jej ještě využiji jinde, takže děkuji. Nicméně bych se ještě rád zeptal, proč považuješ ruční renderování za uživatelsky nepřívětivé?
Editoval Neas (26. 10. 2011 1:11)