Zend - Как получить отдельные радио-кнопки в viewscript - PullRequest
1 голос
/ 24 ноября 2011

Я устанавливаю переключатель следующим образом:

$gender = new Zend_Form_Element_Radio('gender');
$gender->setLabel('Gender')
    ->addMultiOptions(array('m'=>'Male','f'=>'Female'))
    ->setDecorators(array('ViewHelper'))
    ->setRequired(true)
    ->addValidator('NotEmpty', true, $required);

И я хочу получить входные данные, которые он создает по отдельности в окне просмотра.Я пробовал:

$fields = $this->element->getElements();
$fields['gender']->getMultiOption('m')

Но это просто получает значение «Мужской».Как я могу получить отдельные радиовходы, которые генерирует addMultiOptions?

Спасибо

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

Попробуйте использовать getMultiOptions () - метод:

$fields = $this->element->getElements();
$options = $fields['gender']->getMultiOptions();

Вот пример того, как визуализировать переключатели:

$fields = $this->element->getElements();
echo "<label>{$fields['gender']->getLabel()}</label>";
foreach($fields['gender']->getMultiOptions() as $value => $label) {
    echo '<input type="radio" value="' . $value . '" name="gender" /> ' . $label;
}
1 голос
/ 16 декабря 2015

Простой, но Zend-подобный способ рендеринга собственного радио - это создание собственного помощника вида:

<?php

class Zend_View_Helper_Radio extends Zend_View_Helper_Abstract {

    protected $name;
    protected $value;
    protected $id;

    public function radio($name, $value, $id = null) {
        $this->id = $id;
        $this->name = $name;
        $this->value = $value;
        return $this;
    }

    public function render() {
        $html = '';

        $html .= '<input type=radio';
        if ($this->id) {
            $html .= ' id="' . htmlspecialchars($this->id) . '"';
        }
        $html .= ' name="' . htmlspecialchars($this->name) . '"';
        $html .= ' value="' . htmlspecialchars($this->value) . '"';
        $html .= ' />';

        return $html;
    }

    public function __toString() {
        try {
        return $this->render();
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }
}

Затем вы можете визуализировать элементы так же, как уже упоминалось Хикару-Синдо, используя помощник:

foreach ($form->gender->getMultiOptions() as $value => $name) {
    echo '<label for="gender-', $value, '">';
    echo $this->radio('gender', $value, 'gender-' . $value);
    echo '<img src="/css/gender-', $value, '.png">';
    echo $name, '</label>';
};

Конечно, вы можете создать другой View Helper специально для вашего случая и затем отобразить как

$this->genderSelection($form->gender->getMultiOptions());
1 голос
/ 08 декабря 2011

Вероятно, лучшее решение - расширить класс радио, включив в него функцию renderMultiOption ($ opt).В этой функции продублируйте способ рендеринга переключателя в его опциях рендеринга акций (я думаю, вам также нужно взглянуть на Zend_Form_Element_Multi, но не уверен)

На самом деле это должно быть что-то, что включает в себя Zend, так какодной из основных причин для viewscript является упорядочение визуализированных элементов, а не отрисовка элементов вручную.Я думаю, что в этом случае стоило бы расширить класс, так как это сделает ваш viewScript более согласованным.Возможно, вы также захотите создать метод для визуализации одноэлементных аспектов переключателя - метки и тега открытия / закрытия для самого элемента.

Я собираюсь сделать это сам, поэтому, когда я это сделаю, я, вероятно, опубликую, как я это сделал.Нам нужно настроить радио-кнопки для печатной формы, но это не должно повлечь за собой написание разметки для радио-кнопок индивидуально.

...