Jak vykreslit RadioList jednotlivě

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

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

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)

enumag
Člen | 2118
+
0
-

Aktuálně existují dva checkbox/radiolisty, které si konkurují. Jeden je hrachův, jak už odkázal Jan Tvrdík, druhý je od Vojty Dobeše a najdeš jej zde (dokumentace na githubu).

Který je lepší sám nevím. ;-)

Editoval enumag (25. 1. 2013 20:04)

thorewi
Člen | 84
+
0
-

Hm, ja bych misto {input privacy:$key} zkusil pomlcku…

ale ja pouzivam jiny doplnek a pouzivam tam toto:

$nazevPrvku->getOneControl($i)->checked(true)

Nemuzu ale za boha ted najit odkaz kde jsme ten doplnek sehnal a ktery to je :) Az se najim pohledam :)

Jan Tvrdík
Nette guru | 2595
+
0
-

@Zdeněk Topič: Jak vypadá zkompilovaná šablona? Máš správně zaregistrovaná makra?

thorewi
Člen | 84
+
0
-

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

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

@Zdeněk Topič: Popsaný způsob registrace maker ve verzi 2.0.x nefunguje.

Zdeněk Topič
Člen | 14
+
0
-

Hmm, špatné špatné :/

Jan Tvrdík
Nette guru | 2595
+
0
-

@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#….

enumag
Člen | 2118
+
0
-

@Jan Tvrdík: Jde to i přes config, jen s trochu horší syntaxí.

Zdeněk Topič
Člen | 14
+
+1
-

Jo jo o tom vím samozřejmě :D

Zdeněk Topič
Člen | 14
+
0
-

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)

enumag
Člen | 2118
+
0
-

Vojta tam má bug… https://github.com/…tlist/pull/4

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Omlouvám se, bug opraven, díky enumagovi za odhalení a opravení! Vydal jsem opravnou verzi 1.0.2.

enumag
Člen | 2118
+
0
-

@vojtech.dobes: Není zač. ;-) Pozn. netestoval jsem, že to nyní už funguje. Pouze jsem viděl chybějící závorku a opravil jsem ji.