Selectbox keys == values a dvojita mezera

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

Zdravim,

narazil jsem na takovy problem, pokud vytvorim formular se Selectboxem, jehoz polozky ($items) budou asociativni pole, kde klic bude stejny jako hodnota a mezi nima bude polozka, ktera ma vice mezer za sebou,
napr:

<?php
$items = array(
	'TE ST' => 'TE ST',
	'TE  ST' => 'TE  ST',
);
?>

jelikoz je v metode SelectBox::getControl $option->value($key2 === $value2 ? NULL : $key2)
tak se pri stejnych keys a values vubec value u option nezapise… proc taky, kdyz si prohlizec bere automaticky hodnotu mezi <option>xxx</option>, ale v pripade, kdy tam je vice mezer za sebou, nektere prohlizece toto znasobeni mezer ignoruji. Tzn na vystupu getValue() je NULL jelikoz neni v pripustnych hodnotach.
Tzn neni mozne zvolit druhou hodnotu TE__ST. (podtrzitko znazornuje mezeru – i zde se zdvojeni napravuje)
Problem se objevuje v prohlizecich Firefox, IE, Seamonkey, Opera, naopak v pohode je to v Chrome…

Je proti necemu, kdybych tu podminku $key2 === $value2 ? NULL : $key2 pri generovani optionu u selecboxu vyhodil?

TESTCASE:

<?php
class HomepagePresenter extends BasePresenter
{

	protected function createComponentForm($name) {
		$form = new Nette\Application\UI\Form($this,$name);
		$items = array(
        		'TE ST' => 'TE ST',
		        'TE  ST' => 'TE  ST',
		);

		$form->addSelect('items','Items',$items);
		$form->addSubmit('save');
		$form->onSuccess[] = callback($this,'save');
	}

	public function save($form) {
		Nette\Diagnostics\Debugger::barDump($form['items']->getValue(),'ITEM');
	}

}
?>

Editoval stefi023 (8. 12. 2011 22:10)

Elijen
Člen | 171
+
0
-

Tohle je spíše chyba renderování formuláře. Mezera by měla být nahrazena entitou, pak se prohlížeče budou chovat, jak očekáváš.

bojovyletoun
Člen | 667
+
0
-

mám 2 nápady

  1. zkus SelectBox::$useKeys
  2. zkus hodnoty pole nedávat jako text, ale jako Html. Můžeš tam experimenotvat s těmi mezerami

Příklad

$c->addSelect("view", null, array_map(
				function($r) {
					$it = Nette\Utils\Html::el('option')
					->setText($r->jmeno)->value($r->id);
					if ($r->color) {
						$it->style("background: $r->color");
					}
					return $it;
				}, $items);
stefi023
Člen | 71
+
0
-

1)
No $useKeys dela neco trosku jineho…
pokud $items neni asociovane pole, tak v pripade kdy $useKeys = true (coz je default), nahodi ciselne hodnoty do „value“ (0,1,2,…)
pokud $useKeys = false, tak se tyto „value“ nepouzije…

2)
hodnoty jako HTML? to mi prijde trochu nestastne – navic podle nette stylu – „write less, do more“ by se to asi imho melo chovat obracene… navic kdyz to nekdo nebude tusit, tak jak pak k tomu prijde, bude zdlouhave debugovat proc mu to nejde – stejne jako ja :)

David Grudl
Nette Core | 8228
+
0
-

Podmínku jsme odstranil, díky za report.