Drupal 6 форм и массивов оптгрупп - PullRequest
1 голос
/ 08 октября 2009

Следующий массив создается путем преобразования xml в массив (с использованием xml2array). Однако это не совсем правильный формат, который мне нужен для optgroup в форме Drupal 6.

Array (
   [root] => Array ([attr] => Array ([id] => 1) [label] => Array ([value] => My Root)
      [node] => Array (
         [0] => Array ([attr] => Array([id] => 2) [label] => Array([value] => Category 1)
            [node] => Array(
               [0] => Array ([attr] => Array ([id] => 14) [label] => Array ([value] => Sub-Category 1))
               [1] => Array([attr] => Array ([id] => 15) [label] => Array([value] => Sub-Category2))

Я думаю, что массив слишком уменьшен до этого формата со значениями id, не поврежденными для подкатегорий. Однако я не могу подтвердить это с помощью документации drupal, поскольку они ничего не упоминают о назначении значений для опции.

Array (
   [Category 1] => Array(
      [14] => Sub-Category 1
      [15] => Sub-Category 2
   )
)

Итак, мои вопросы: 1) является ли правильный формат массива для оптгрупп Drupal с моими заданными значениями и 2) как мне уменьшить свой массив до соответствия?

Ответы [ 2 ]

7 голосов
/ 08 октября 2009

1) Правильный формат для массива группы параметров (я буду использовать список состояний в качестве примера):

$state_list = array(
  'AL'=>"Alabama",  
  'AK'=>"Alaska",  
  'AZ'=>"Arizona",  
  'AR'=>"Arkansas",
  ...
);

Будет отображен список имен состояний, доступных для инициалов состояния в виде ключей.

Чтобы использовать подгруппы, вы должны изменить вышеперечисленное, например:

$state_list = array(
  'A'=> array(
    'AL'=>"Alabama",  
    'AK'=>"Alaska",  
    'AZ'=>"Arizona",  
    'AR'=>"Arkansas",
    ...
  ),
  'C'=> array(
    'CA'=>'California',
    'CO'=>'Colorado',
     ...
  ),
  ...
);

Таким образом, вам понадобится следующий формат для ваших переведенных данных, как указано:

$options = array(
  'My Root' => array(
    'Category 1' => array(
      '14' => 'Sub-Category 1',
      '15' => 'Sub-Category 2'
    )
  )
)

Однако, если «Мой корень» - это имя элемента select, используйте его вместо этого (я покажу вам определение формы для каждого из них ниже):

$options = array(
  'Category 1' => array(
    '14' => 'Sub-Category 1',
    '15' => 'Sub-Category 2'
   )
)

Ваше определение API форм будет выглядеть так:

function mymodule_form() {
  $options = array(
    'My Root' => array(
      'Category 1' => array(
        '14' => 'Sub-Category 1',
        '15' => 'Sub-Category 2'
      )
    )
  );
  ...
  $form['Select Box Name'] = array(
    '#type' => 'select',
    '#title' => 'Select a Category',
    '#options'=> $options,
  );
  ...
  return $form;
}

Или вот так, если 'My Root' - это имя элемента select, а не одна из его категорий:

function mymodule_form() {
  $options = array(
    'Category 1' => array(
      '14' => 'Sub-Category 1',
      '15' => 'Sub-Category 2'
     )
  );
  ...
  $form['My Root'] = array(
    '#type' => 'select',
    '#title' => 'Select a Category',
    '#options'=> $options,
  );
  ...
  return $form;
}

В этом определении ваши подкатегории обозначаются целыми числами - я не уверен, что это то, что вы хотите. Часто разработчики Drupal используют массивы с одинаковыми ключами и значениями (например, '[CA} => [CA]'), чтобы упростить процесс.

Побочным эффектом этого формата является то, что «Категория 1» сама по себе не может быть выбрана (поскольку ваш источник XML имеет ключи как для «Корня», так и для «Категории 1», мне кажется, что их можно было выбрать в предыдущем воплощении ); Я не уверен, что метки подкатегорий в группе параметров HTML есть, поэтому я не уверен, является ли это проблемой или нет.

0 голосов
/ 08 октября 2009

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

Что касается присвоения значений опциям, это проще.

С Документы :

Значения: Массив в форме массива (t ('Отображаемое значение 1'), t ('Отображаемое значение 2')) или массива ('return_value1' => t ('Отображаемое значение 1'), 'return_value2 '=> t (' Display Value 2 ')), если требуются определенные возвращаемые значения.

Итак, ваш фрагмент выше будет выглядеть примерно так:

$form['Category 1'] = array(
  '#type' => 'radios',
  '#title' => t('Category 1'),
  '#options' => array(
                      '14' => t('Sub-Category 1'),
                      '15' => t('Sub-Category 2')
                      ),
  );
...