Урок один. Создаем модуль на Drupal. Как с Drupal создать форму и вывести данные из формы на этой или другой страници. Хук hook

Пример 1. Как с Drupal создать форму и вывести данные из формы на этой или другой страници.

————————
| Создаем форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-

Для этого:
Создаем модуль.
Для этого:

- создаем папку и называем ее по названию модуля, например urokone и сохраняем его в my_site/sites/all/modules

- в этой папке создаем в notepad++ два файла в формате utf-8 without BOM. Что такое BOM и где скачать notepad++ смотрим в википедии.

Создаем два файла в этой папке и называем их
urokone.info
urokone.module

1.1. Минимальное содержимое файла urokone.info

; $Id$ name = Urokone   description = Simple form one core = 6.x

; $Id$ //если вы будите выставлаять ваш модуль на Drupal.org то он добавит автоматически свои параметры
name = urokone // название вашего модуля
description = Simple form one //описание
core = 6.x //в нашем случае мы пишем для Drupal 6.

1.2. Минимальное содержимое файла urokone.module

Минимальное содержание этого файла, для того что бы открыть страницу с модулем (с формой), это функция меню.

<?php   function urokone_menu() { $items = array();   $items['urokone'] = array( 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), );   return $items; }

$items['urokone'] = array( ); // эта сторочка означает, что форму c названием (Form_ID) urokone_formone, которую я собираюсь вставить в этот модуль можно будет найти после активации если кликнуть на локальном сервере

127.0.0.1/my_site/urokone

Теперь активируем модуль
Для этого:
- кликните в администраривной панели на Administer -> modules
ваш новые модуль будет находится в разделе others. Кликаем чекбокс напроив нашего модуля.
У меня на локальном сервере это выглаядит так:


И кликаем на кнопку Save Configuration. Когда сделаем следующие изменения в модуле надо будет очистить кеш. Administer->Performance->Clear cashed data

2. Пишим весь модуль.

———————————–
2.1 | Создаем меню |
———————————–
|
————————————————————————-
2.2. | Создаем условия доступа для различных пользователей |
————————————————————————–
|
——————–
2.3. | Создаем help |
——————–
|
—————————————————————————-

2.4. | Создаем форму |
———————–
|
———————————————————————————————-
2.5. | Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке)
————————————————————————————————

2.1. Создаем меню.

Для создания меню используем hook – это функции дрюпала. Например hook
function hook_menu()
для нашего модуля мы должны измеить по названию нашего модуля на

function urokone_menu() { $items = array();   $items['urokone'] = array( 'title' => 'Как подтвердить факт отправленния ненулевых данных в форму?', 'description' => 'Urokone first form', 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), 'access arguments' => array('access administration pages'), 'type' => MENU_NORMAL_ITEM, );   return $items; }

2.2. Создаем условия доступа различных пользователей.
Используем хук hook_perm()

function urokone_perm() { return array('access urokone content', 'access administration pages'); } // function urokone_perm() 2.3. Создаем help

Используем хук hook_help()

function urokone_help($path, $arg) { $output = ''; //declare your output variable switch ($path) { case "admin/help#urokone": $output = '<p>'. t("Displays information about site") .'</p>'; break; } return $output; } // function urokone_help

Здесь можно сохранить модуль. Помните (Administrator-> modules -> Save configurations) и посмотреть появление строчки “Displays information about site” , если пойти Administer – > help -> urokone

Если на этой страницы кликнуть на urokone то увидим страницу со строкой “Displays information about site”. Мы в хуке help можем заменить эту строку на подробное описание нашего модуля.

———————————————————————————————
Теперь нам осталось
————————
| Создать форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-
———————————————————————————————-

2.4. Создаем форму

Используем функцию urokone_formone()

Например я хочу сделать такую форму:

Для этого в Drupla мы пишем функцию urokone_formone().

function urokone_formone($form_state) { $form = array();   $form['one_one'] = array( '#type' => 'checkbox', '#title' => 'if ($_REQUEST["text"]) {echo "Data was send";}', '#default_value' => variable_get('one_one', false),   );   $form['one_two'] = array( '#type' => 'checkbox', '#title' => t('if ($_REQUEST("text")) {echo "Data was send";}'), '#default_value' => variable_get('one_two', false), );   $form['one_three'] = array( '#type' => 'checkbox', '#title' => t('if {$_REQUEST["text"]} {echo "Data was send";}'), '#default_value' => variable_get('one_three', false), );       return system_settings_form($form); } // end urokone_formone

Заходим на 127.0.0.1/lesson/urokone

При этом в результате работы функции return system_settings_form($form); появляютя две кнопки “Save configuration” и “Reset to default”

2.5. Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке. Используем хук hook_block.

function urokone_block($op='list', $delta=0) {   if ($op == "list") { $block = array(); $block[0]["info"] = t('urokone'); return $block; } else if ($op == 'view') { switch ($delta) { case 0: $block_content = ''; $block['subject'] = 'urokone';   $one_one= variable_get('one_one', false); $one_two= variable_get('one_two', false); $one_three= variable_get('one_three', false);   if ($one_one or $one_two or $one_three) { if ($one_one) $block['content'] .= 'your answer is correct '; if ($one_two) $block['content'] .= 'your answer is not correct '; if ($one_three) $block['content'] .= 'your answer is not correct'; } break;   } return $block; } } // end urokone_block

Теперь надо активировать новый блок urokone который мы создали. Идем в Administer -> blocks.
Находим наш блок urokone в списке Disabled.

Меняю регион с “none” на другоe. Я например выбрала “Left sidebar”.
И нажимаю на кнопку внизу Save blocks.

Теперь зайдем еще раз на страницу с нащей формой 127.0.0.1/lesson/urokone и кликнми на какой нибудь чекбокс. Например на вророй чекбокс с правильным ответом.
У нас слева в блоке urokone появится сообщение о том на какой чекбокс мы кликнули.

Прикрепленный файл Размер tut1_1.png 29.72 кб tut1_2.png 24.68 кб tut1_3.png 23.3 кб tut1_4.png 47.17 кб tut1_5.png 14.56 кб tut1_6.png 33.72 кб tut1_7.png 56.37 кб tut1_8.png 40.71 кб

Источник: http://www.drupal.ru/node/74258

Контактная форма, форма заказа в custom блоке

Иногда нужно быстро сделать контактную форму или форму заказа и поместить ее как блок на какой-нибудь странице, но нет времени на разработку модуля (или не хватает знаний). Предлагаю модуль simpleForm2. он позволяет создать практически любую форму и любое количество таких форм на сайте. Для построения формы нужно хотя бы поверхностное знание HTML.
Вот страница проекта на drupal.org: simpleForm2
Сразу скачать можно отсюда.

Источник: http://www.drupal.ru/node/73738

Как можно программно создать форму для изменения значений ССК поля ноды

Иногда может потребоваться изменять значения какого-то CCK поля ноды не обновляя всю ноду.
Выкладываю заготовку для решения такой задачи (по мотивам тестового задания restyler).
В нижеприведенном коде создаются пути типа ‘test-form/%node’, на страницах с этими адресами выводится форма для заполнения одного CCK поля (сейчас захардкоденного, но легко меняется на выбираемое из админки или даже несколько полей) и кнопка сабмита для отправки формы. После отправки поле соответственного нода будет обновлено, в том числе работает с полями множественного выбора. Например, если зайти на страницу ‘test-form/4′ и есть такой нод и у него есть поле ‘field_test’, то после сабмита формы на этой странице у нода 4 в поле field_test будут обновленные значения.
Валидацию не делал, надо доделывать, если будете использовать где-то.

<?php

/**
 * Implementation of hook_menu().
 */
function test_module_menu() {
  $items = array();
  $items['test-form/%node'] = array(
    'page callback' => 'drupal_get_form',
    'page arguments' => array('test_form', 1),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function test_form(&$form_state, $node) {
  $form['#node'] = $node;
  $field_name = 'field_test';
  $field = content_fields($field_name, $node->type);  
  $form['#field_info'][$field_name] = $field;  
  module_load_include('inc', 'content', 'includes/content.node_form');
  $form_element = content_field_form($form, $form_state, $field);
  $form += (array)$form_element;
  $form['submit'] = array(
    '#weight' => 100,
    '#type' => 'submit', 
    '#value' => t('Save'),
  );  
  return $form;
}

function test_form_submit($form, &$form_state) {
  //$f_name = 'field_test';
  $node = $form['#node'];
  $type_name = $node->type;
  $type = content_types($type_name);
  foreach ($type['tables'] as $table) {
    $schema = drupal_get_schema($table);
    $record = array();
    foreach ($schema['content fields'] as $field_name) {
      if (isset($form_state['values'][$field_name])) {
        $field = content_fields($field_name, $type_name);
        // Multiple fields need specific handling, we'll deal with them later on.
        if ($field['multiple']) {
          continue;
        }
        $db_info = content_database_info($field);
        foreach ($db_info['columns'] as $column => $attributes) {
          $record[$attributes['column']] = $form_state['values'][$field_name][0][$column];
        }
      }
    }
    if (count($record) || empty($schema['content fields'])) {
      $record['nid'] = $node->nid;
      $record['vid'] = $node->vid;
      if (db_result(db_query("SELECT COUNT(*) FROM {". $table ."} WHERE vid = %d", $node->vid))) {
        content_write_record($table, $record, array('vid'));
      }
      else {
        content_write_record($table, $record);
      }
    }
  }

  // Handle multiple fields.
  foreach ($type['fields'] as $field) {
    if ($field['multiple'] && isset($form_state['values'][$field['field_name']])) {
      $db_info = content_database_info($field);
      // Delete and insert, rather than update, in case a value was added.
      db_query('DELETE FROM {'. $db_info['table'] .'} WHERE vid = %d', $node->vid);
      foreach ($form_state['values'][$field['field_name']] as $delta => $item) {
        if($delta === $field['field_name']. '_add_more') continue; 
        $record = array();
        $not_empty = 0;
        foreach ($db_info['columns'] as $column => $attributes) {
          if($item[$column] && !$not_empty) $not_empty = 1;
          $record[$attributes['column']] = $item[$column];
        }
        $record['nid'] = $node->nid;
        $record['vid'] = $node->vid;
        $record['delta'] = $delta;
        //drupal_set_message(var_export($record, TRUE));
        if($not_empty) content_write_record($db_info['table'], $record);
      }
    }
  }
  cache_clear_all('content:'. $node->nid .':'. $node->vid, content_cache_tablename());
}
?>

Источник: http://www.drupal.ru/node/52555

© 2009 Обзор CMS