RadioList::getOption() jenom jako string

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

Ahoj, dneska jsem narazil na problém s nastavením jakéhokoliv parametru jednomu option v RadioListu. Každá jeho metoda (teda dvě, getControl($key) a getOption($key)) vrací html ve stringu. Opravdu nikde není možnost získat normální objekt, který by uměl vracet prototype?

Majkl578
Moderator | 1364
+
0
-

https://api.nette.org/…dioList.html

FormControl::getControlPrototype()

jinak RadioList::getControl() by také měl vracet Html objekt (viz API).

Mikulas Dite
Člen | 756
+
0
-

Otestoval sem to a viděl bych to na problém RadioListu:

$form->addRadioList('radio', NULL ,array('jedna', 'dva'));
foreach ($form['radio']->getControl() as $option) {
	if ($option instanceof Object) {
		Debug::dump(TRUE);
	} else {
		Debug::dump(FALSE);
	}
	Debug::dump($option);
}
bool(FALSE)

string(106) "<input type="radio" name="radio" id="frm-radio-0" value="0" /><label for="frm-radio-0">jedna</label><br />"

bool(FALSE)

string(104) "<input type="radio" name="radio" id="frm-radio-1" value="1" /><label for="frm-radio-1">dva</label><br />"
Mikulas Dite
Člen | 756
+
0
-

Nette neumožňuje editaci jednotlivých položek RadioListu.

Rád bych napsal nějaké řešení s Html objektem. Je tu ale zádrhel: Jak spojit input radio a label?

  1. Pokud by to bylo přes nějaký další Html wrapper, například div, itarace na getControl() wrappery ho vracela místo radio controlů. getControl($key) by nebyl problém.
  2. Udělat nějaký speciální objekt děděný od Html, který by defaultně control vracel a na požádání funkce z RadioList::getLabel($key) by vracel label.
  3. Udělat zvlášť speciální gettery pro jednotlivé controly (tzn. něco jiného než getControl($key)) a pro labely. Ztíží manuální render každé položky zvlášť.
Mikulas Dite
Člen | 756
+
0
-

Vytvořil jsem novou třídu RadioListItem. Stará se právě o jednu dvojici input-label. Umožňuje RadioListu vracet přes metody getItemControl($key) a getItemLabel($key) jejich Html elementy a ty následně editovat. Žádný BC break nebyl potřeba, všechny originální NetteForm testy prošly úspěšně.

Fork na:
https://github.com/Rullaf/nette

Ukázky:

$form->addRadioList('name', 'label', array('jedna', 'dva', 'tri'));
$form['radio']->getControl(1)->class = 'radioClass';
//stejné jako:
$form['radio']->getItemControl(1)->class = 'radioClass';
$form['radio']->getItemLabel(1)->class = 'labelClass';
$form->addRadioList('radio', null, array('jedna' => 'aaa', 'dva' => 'bbb', 'tri' => 'ccc'))
$form['radio']->getControl('dva')->class = 'radioClass';
//stejné jako:
$form['radio']->getItemControl('dva')->class = 'radioClass';
$form['radio']->getItemLabel('dva')->class = 'labelClass';

A místo class se dá pochopitelně využít jakýkoliv jiný Html atribut, případně jakákoli metoda třídy Html.

Teď už se tahle feature má šanci do Nette dostat?

Editoval Mikulas Dite (9. 4. 2010 16:43)