Drupal Form API - Использование циклов foreach для создания форм - PullRequest
4 голосов
/ 23 июня 2011

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

Я построил форму, используя цикл foreach, но когда я проверяю вывод, используя dpm($form); в функции _submit, #value для каждого элемента страницы изображений всегда равно тому, которое когда-либо было установлено для последнего изображения.

Вот мой код:

function titleicon_admin_settings() {


  $settings = variable_get('titleicon_settings', $default);

  //build an array of primary link titles
  $primary_links_items = menu_primary_links();
  foreach ($primary_links_items as $item) {
    $title = $item['attributes']['title'];
    $href = $item['href'];
    $titles[$href] = $title;
  }

  //build array of icons
  $directory = file_directory_path() . '/icons';
  $mask = '(jpg|jpeg|gif|png|JPG|JPEG|GIF|PNG)';
  $icons = file_scan_directory($directory, $mask);



  foreach ($icons as $icon) {
    $name = $icon->name;
    $path = base_path() . $icon->filename;
    $html = '<img src="' . $path . '" width="50" height="50" />';
    $default_value = $settings[$name]['page'];

    $form[$name] = array(
      '#type' => 'fieldset',
      '#title' => $name,
    );

    $form[$name]['path_to_icon'] = array(
      '#type' => 'value',
      '#value' => $path, 
    );

    $form[$name]['icon'] = array(
      '#type' => 'markup',
      '#value' => $html, 
    );

    $form[$name]['page'] = array(
      '#type' => 'select',
      '#title' => t('Show icon on page'),
      '#default_value' => $default_value,
      '#description' => t('Choose which page to show icon on.'),
      '#options' => $titles,
    );
  }

  $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save'), 
    );

  return $form;
}   

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Что имеет смысл. Если ваши поля объявлены так:

$form[$name]['path_to_icon'] = array(
  '#type' => 'value',
  '#value' => $path, 
);

тогда для каждого файла вы обновляете одну и ту же переменную - 'path_to_icon'. Ключ набора полей «$ name» здесь не имеет значения, поскольку он используется только для группировки полей формы вместе.

Вам нужно будет использовать что-то вроде:

$form[$name]['path_to_icon_'.$name] = array(
  '#type' => 'value',
  '#value' => $path, 
);

тогда вы получите несколько значений после публикации формы.

Однако, честно говоря, я бы не использовал $ name в качестве элемента имени переменной, вам лучше иметь что-то вроде автоинкрементного $ fid (идентификатор файла из таблицы файлов) или любой другой уникальный и SAFE-идентификатор для каждого файл ...

2 голосов
/ 05 марта 2013

Я должен сказать, что если вы поставите " # tree => TRUE " в объявлении вашего набора полей:

$form[$name] = array(
   '#type' => 'fieldset',
   '#title' => $name,
   '#tree' => TRUE
);

, вам не нужно ставить "_".$ name "во всех ваших элементах формы.Drupal сгруппирует все результаты формы в массивы с ключом $ name.

...