Symfony 1.4 отображать изображения в качестве выбора в виджете выбора - PullRequest
3 голосов
/ 23 февраля 2011

У меня есть форма с определенным виджетом выбора (DoctrineChoice). Выбор относится к определенному файлу изображения на сервере, и я использую опцию expander = true (для флажков / радиокнопок)

Есть ли способ отобразить виджет, отображая изображения каждой опции? По умолчанию я получаю только идентификатор опций в базе данных.

Используя firebug, я заметил, что сгенерированный HTML имеет тег с идентификатором каждого выбора, а также мне удалось изменить это с определенным изображением, поэтому я предполагаю, что все, что мне нужно сделать, это изменить текст для метки каждого выбора. Несмотря на то, что опция 'label' виджета просто меняет метку для всего выбора, так что это не сработает ...

Спасибо!

1 Ответ

2 голосов
/ 24 февраля 2011

Хорошо, после долгих исследований мне удалось найти какое-то решение, но, может быть, есть что-то более правильное?

Вместо использования sfWidgetFormDoctrineChoice я использовал sfWidgetFormSelectRadio (но Checkbox тоже может, ноЯ не знаю, может ли он работать с другими виджетами или даже выбирать виджеты тоже: / только потому, что этого требуют мои бизнес-правила, в данном конкретном случае было достаточно SelectRadio ...)

Опция выбора извиджет был заполнен результатами предыдущего запроса, который я использовал для заполнения предыдущего виджета DoctrineChoice, который был обработан ранее, поэтому идентификатор каждой записи был ключом и значением каждого выбора:

$imgs = Doctrine_Core::getTable('ProjImages')->getImages();
$choices = array('' => '');
foreach ($imgs as $img):
  $choices[$img->getId()] = $img->getId();
endforeach;

Далее ятакже передал опцию 'formatter' виджету:

$this->widgetSchema['img'] = new sfWidgetFormSelectRadio(array(
                    'choices' => $choices,
                    'formatter' => array($this, 'showAsImages')
                                ));
$this->validatorSchema['img'] = new sfValidatorChoice(array(
                     'choices' => $choices,
                     'required' => false
                     ));

Я использовал опцию 'required' => false в валидаторе, так как мне также нужна опция для выбора 'no image' в моем виджете, которыйотражается в массиве $ choices как первый ('' => '') выбор.

Наконец, я написал обратный вызов форматера:

public function showAsImages($widget, $inputs)
{
  $rows = array();
  foreach ($inputs as $input)
  {
    $domdoc = new DOMDocument();
    $domdoc->loadHTML($input['label']);
    $node = $domdoc->getElementsByTagName('label')->item(0);
    if ($node->nodeValue != "")
    {
      $img = Doctrine_Core::getTable('ProjImages')->find(array($node->nodeValue));
      $input['label'] = '<label '.$node->attributes->item(0)->name .
                        '="'.$node->attributes->item(0)->value.'">' .
                        '<img src="'.$img->getImg().'" alt="image" />' .
                        '</label>';
    }
    $rows[] = $widget->renderContentTag('li',
                    $input['input'].
                    $widget->getOption('label_separator').
                    $input['label']);
  }
  return $widget->renderContentTag('ul',
                       implode($widget->getOption('separator'), $rows),
                       array('class' => $widget->getOption('class')));
}

Я использовал исходный код для исходного форматера по умолчанию sfWidgetFormSelectRadio и, основываясь на нем, я изменил «метку» каждого входного элемента (весь остальной код в точности совпадает с исходным кодом, который я использовал).

И для метки каждого элемента ввода я использовал объект DOMDocument, чтобы получить значение (идентификатор изображения), затем сделал запрос в БД, чтобы получить изображение, и затем снова собрал метку.'с тегом image... Конечно, если мне удастся найти пустой выбор, я использую метку по умолчанию ...

И это все ... Я думаю, что обратный вызов форматтераможно получить дополнительную работу, поэтому приветствуются любые предложения или даже более эффективные решения проблемы ... Как вы можете видеть, я зависим от опции 'formatter' виджета, и насколько я вижу, только некоторыевиджеты принимают эту опцию ...

Спасибо за чтение!

...