Как получить полный список зарегистрированных типов публикаций в Drupal 7. Задача типична для бек-енда при создании форм страниц настроек. Потому покажу в статье пример реализации поля для формы с выбором типов публикаций.
В API Drupal существует специальная функция для извлечения списка типов публикаций: node_type_get_types(). Также можно обратиться к таблице node_type, где перечислены зарегистрированные типы (но это не drupal-way).
Функция возвращает массив объектов вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Array ( [article] => stdClass Object ( [type] => article [name] => Article [base] => node_content [module] => node [description] => Use articles for time-sensitive content like news, press releases or blog posts. [help] => [has_title] => 1 [title_label] => Title [custom] => 1 [modified] => 1 [locked] => 0 [disabled] => 0 [orig_type] => article [disabled_changed] => ) ... |
Форма с полем выбора типов публикаций
Объявление формы с набором чекбоксов + кнопка сохранения данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function MYMODULE_settings_form($form, &$form_state) { $form = array(); $type_list = _MYMODULE_get_nodetype_list(); $form['nodes'] = array( '#type' => 'checkboxes', '#options' => $type_list, '#title' => t('Content types'), '#default_value' => variable_get('mymodule_nodes', '') ? explode(',', variable_get('mymodule_nodes', '')) : array(), ); $form['submit'] = array( '#type' => "submit", '#value' => t('Save'), ); return $form; } |
Сохранение данных формы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/** * Implements submit form hook (save settings). */ function MYMODULE_settings_form_submit(&$form, &$form_state) { $values = $form_state['values']; $types = array(); foreach ($values['nodes'] as $value) { if ($value) { $types[] = $value; } } variable_set('mymodule_nodes', implode(",", $types)); drupal_set_message(t('Settings were saved successfully.')); } |
Функция хелпер, читающая список типов нод.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * Retrieve the node types list * * @return array */ function _MYMODULE_get_nodetype_list() { $types = node_type_get_types(); $list = array(); foreach ($types as $type => $data) { $list[$type] = check_plain($data->name); } return $list; } |