Jak vykreslit RadioList jednotlivě
- Zdeněk Topič
- Člen | 14
Prosím jak vykreslit RadioList prvek po prvku?
Hledal jsem, našel jsem stará témata, která moc nepomohla. Počet prvků
v RadioListu je dynamický. A ještě bych jim potřeboval přiřadit
nějakou třídu.
{foreach $form["privacy"] as $key => $value}
{$form["privacy"]->getControl($key)} <br>
{/foreach}
Vykreslí … nic.
Editoval Zdeněk Topič (25. 1. 2013 16:42)
- Zdeněk Topič
- Člen | 14
Prostě ne :)
$privacy = array(
0 => "Všichni",
2 => "Všichni mentoři",
3 => "Pouze vybraní mentoři",
4 => "Pouze členové",
);
$form->addOptionList("privacy", "Viditelnost", $privacy)
->setRequired("Tato položka je povinná.");
{foreach $form["privacy"] as $key => $label}
{input privacy:$key} {$label}<br>
{/foreach}
Component with name 'privacy:0' does not exist.
Editoval Zdeněk Topič (25. 1. 2013 19:04)
- Jan Tvrdík
- Nette guru | 2595
@Zdeněk Topič: Jak vypadá zkompilovaná šablona? Máš správně zaregistrovaná makra?
- thorewi
- Člen | 84
tak ja jen doplnim ze to co pouzivam ja je rozsireni klasickeho radiolistu v nette a kod je takovyto:
use Nette;
use Nette\Forms\Controls\RadioList;
use Nette\Utils\Html;
use Nette\Utils\Arrays;
class RadioListExtension extends Nette\Object
{
/**
* @throws Nette\StaticClassException
*/
final public function __construct()
{
throw new Nette\StaticClassException;
}
/**
* Registers hack methods
*/
public static function register()
{
RadioList::extensionMethod('getOneControl', callback(__CLASS__, 'getOneControl'));
RadioList::extensionMethod('getOneLabel', callback(__CLASS__, 'getOneLabel'));
}
/**
* @param RadioList $radio
* @param mixed $key
* @return Html
*/
public static function getOneControl(RadioList $radio, $key)
{
if (!isset($radio->items[$key])) {
return NULL;
}
$control = self::callBaseControl($radio, 'getControl');
$index = Arrays::searchKey($radio->items, $key);
$id = $control->id;
$value = $radio->getValue() === NULL ? NULL : (string) $radio->getValue();
if ($index > 0) {
$control->data('nette-rules', NULL);
}
$control->id = $id . '-' . $index;
$control->checked = (string) $key === $value;
$control->value = $key;
return $control;
}
/**
* @param RadioList $radio
* @param mixed $key
* @return Html
*/
public static function getOneLabel(RadioList $radio, $key)
{
if (!isset($radio->items[$key])) {
return NULL;
}
$control = self::callBaseControl($radio, 'getControl');
$index = Arrays::searchKey($radio->items, $key);
$id = $control->id;
$val = $radio->items[$key];
$label = Html::el('label', array('for' => $id . '-' . $index));
if ($val instanceof Html) {
$label->setHtml($val);
} else {
$label->setText($radio->translate((string) $val));
}
return $label;
}
/**
* @hack ugly one!
* @param object $object
* @param string $method
* @return mixed
*/
private static function callBaseControl($object, $method, $args = array())
{
return Nette\Reflection\Method::from('Nette\Forms\Controls\BaseControl', $method)->invokeArgs($object, $args);
}
}
funguje i s nejnovejsim Nette, tak treba to pomuze vyresit problem. Je samozrejem pak take potreba registrovat v Bootstrapu:
Namespace\RadioListExtension::register();
Editoval thorewi (25. 1. 2013 20:44)
- Zdeněk Topič
- Člen | 14
Jan Tvrdík napsal(a):
@Zdeněk Topič: Jak vypadá zkompilovaná šablona? Máš správně zaregistrovaná makra?
nette:
latte:
macros:
- Nextras\Forms\Latte\Macros::install
<div class="controls">
<?php $iterations = 0; foreach ($form["privacy"] as $key => $label): ?>
<?php $_input = (is_object("privacy:$key") ? "privacy:$key" : $_form["privacy:$key"]); echo $_input->getControl()->addAttributes(array()) ?>
<?php echo Nette\Templating\Helpers::escapeHtml($label, ENT_NOQUOTES) ?><br />
<?php $iterations++; endforeach ?>
</div>
- Jan Tvrdík
- Nette guru | 2595
@Zdeněk Topič: Popsaný způsob registrace maker ve verzi 2.0.x nefunguje.
- Jan Tvrdík
- Nette guru | 2595
@Zdeněk Topič: Copak? Je ti doufám jasné, že ty makra jde ve 2.0.x normálně zaregistrovat, akorát ne pomocí configu. Viz třeba https://latte.nette.org/en/develop#….
- Zdeněk Topič
- Člen | 14
Tak, nešlo to ani když jsem to makro zaregistroval v presenteru, https://github.com/…ms-inputlist
jsem instaloval podle návodu, že jsem do bootstrapu přidal configuratoru
onCompile a dostal jsem tohle:
syntax error, unexpected T_AS
Zkompilovaná šablona:
<?php $_inputlist = is_object("privacy") ? "privacy" : $_form["privacy"];$iterations = 0; foreach ($iterator = $_l->its[] = new Nette\Iterators\CachingIterator($_inputlist->getItems() as $key => $label): $_inputlistKey = $key ?>
<?php echo $_inputlist->getItemControl($_inputlistKey)->addAttributes(array()) ?>
<?php echo $_inputlist->getItemLabel($_inputlistKey)->addAttributes(array()) ;if (!$iterator->isLast()): ?>
<br /><?php endif ?>
Z:
{inputlist privacy as $key => $label}
{input} {label /}{sep}<br>{/sep}
{/inputlist}
Už teda nevím co mám dělat.
Editoval Zdeněk Topič (26. 1. 2013 19:23)
- Vojtěch Dobeš
- Gold Partner | 1316
Omlouvám se, bug opraven, díky enumagovi za odhalení a opravení! Vydal jsem opravnou verzi 1.0.2.