3 select-boxy do jedné buňky tabulky

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

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
+
0
-

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
+
0
-

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
+
0
-

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)

tomees
Člen | 59
+
0
-

Myslím, že hosiplan neměl namysli nepřívětivé ruční renderování ale spíš ty tři selectboxy za sebou…

Ani
Člen | 226
+
0
-

Ruční rendrování není zrovna znovupoužitelný. Když si uděláš vlastní kontrol, tak to máš „na celý život“.