Как я могу динамически добавить атрибут к каждому тегу параметра, сгенерированному sfWidgetFormPropelChoice?

В моем приложении Symfony 1.4 я создаю раскрывающийся список выбора как часть формы.

Позже я хочу применить jQuery (ddSlick) к этому выбору, чтобы изменить его стиль. Для этого мне нужно добавить атрибут к каждому тегу параметра.

Так, например, я бы хотел, чтобы мой выбор генерировал:

<select id="demo-htmlselect">
        <option value="0" data-imagesrc="http://dl.dropbox.com/u/40036711/Images/facebook-icon-32.png"
            data-description="Description with Facebook">Facebook</option>
        <option value="1" data-imagesrc="http://dl.dropbox.com/u/40036711/Images/twitter-icon-32.png"
            data-description="Description with Twitter">Twitter</option>
        <option value="2" selected="selected" data-imagesrc="http://dl.dropbox.com/u/40036711/Images/linkedin-icon-32.png"
            data-description="Description with LinkedIn">LinkedIn</option>
        <option value="3" data-imagesrc="http://dl.dropbox.com/u/40036711/Images/foursquare-icon-32.png"
            data-description="Description with Foursquare">Foursquare</option>

Any suggestions on how to achieve this? Perhaps with an alternate or extended widget?


person Geoff Maddock    schedule 10.07.2012    source источник
comment
Это не почти тот же вопрос, что и ваш другой ?   -  person j0k    schedule 11.07.2012
comment
Другой должен был быть более общим случаем, хотя я случайно пометил его как symfony.   -  person Geoff Maddock    schedule 11.07.2012
comment
Вы не принимаете, потому что это не работает?   -  person j0k    schedule 19.07.2012


Ответы (1)


Если вы хотите настроить выбранный рендеринг, вы должны расширить виджет по умолчанию и создать свой собственный рендеринг.

Итак, создайте этот файл, например: /lib/widget/myWidgetFormSelect.class.php с:

class myWidgetFormSelect extends sfWidgetFormSelect
{
  protected function getOptionsForSelect($value, $choices)
  {
    $mainAttributes = $this->attributes;
    $this->attributes = array();

    if (!is_array($value))
    {
      $value = array($value);
    }

    $value_set = array();
    foreach ($value as $v)
    {
      $value_set[strval($v)] = true;
    }

    $options = array();
    foreach ($choices as $key => $option)
    {
      $attributes = array(
        'value'            => self::escapeOnce($key),
        'data-imagesrc'    => self::escapeOnce($option['imagesrc']),
        'data-description' => self::escapeOnce($option['description'])
      );
      if (isset($value_set[strval($key)]))
      {
        $attributes['selected'] = 'selected';
      }

      $options[] = $this->renderContentTag('option', self::escapeOnce($option['title']), $attributes);
    }

    $this->attributes = $mainAttributes;

    return $options;
  }
}

Затем вы должны обмануть способ, которым вы дали $choices виджету. Здесь виджет ожидает такой массив:

$choices = array(
  0 => array(
    'title'       => 'Facebook',
    'imagesrc'    => 'http://dl.dropbox.com/u/40036711/Images/facebook-icon-32.png',
    'description' => 'Description with Facebook',
  ),
  1 => array(
    'title'       => 'Twitter',
    'imagesrc'    => 'http://dl.dropbox.com/u/40036711/Images/twitter-icon-32.png',
    'description' => 'Description with Twitter',
  ),
);
person j0k    schedule 11.07.2012