Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π–ΡƒΡ€Π½Π°Π» PC Magazine/RE β„–11/2009Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 34

Автор PC Magazine/RE

<div class="node<?php if ($sticky) {

    print " sticky";

  } ?>

  <?php if (!$status) {

    print " node-unpublished";

  } ?>">

  <h2 class="title"><?php print $title?></h2>

  <span class="submitted"><?php print $submitted?></span>

  <div class="content"><?php print $content?></div>

</div>

Π€ΠΎΡ€ΠΌΡ‹

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ внСшнСго Π²ΠΈΠ΄Π° Ρ„ΠΎΡ€ΠΌ, ознакомимся с основами Drupal Forms API β€“ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Forms API нСсколько слоТнСС создания HTML-Ρ„ΠΎΡ€ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ изучСния Π»ΠΎΠ³ΠΈΠΊΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΅Π³ΠΎ использованиС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Forms API Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ряд Π²Π°ΠΆΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡:

β€’ Π»ΡŽΠ±ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнты Π² Ρ„ΠΎΡ€ΠΌΠ΅, созданной Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, Π½Π΅ ΠΌΠ΅Π½ΡΡ Π΅Π΅ исходного ΠΊΠΎΠ΄Π°;

β€’ Π»ΡŽΠ±ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· измСнСния исходной Ρ„ΠΎΡ€ΠΌΡ‹;

β€’ Ρ„ΠΎΡ€ΠΌΡ‹, созданныС с использованиСм Forms API, Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ ΠΎΡ‚ Π°Ρ‚Π°ΠΊ, связанных с ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹;

β€’ Π»ΡŽΠ±ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ внСшний Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹, Π½Π΅ измСняя Π΅Π΅ исходного ΠΊΠΎΠ΄Π°.

КаТдая Ρ„ΠΎΡ€ΠΌΠ° Π² Drupal прСдставляСт собой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ассоциативный массив. Π­Ρ‚ΠΎΡ‚ массив Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΠΎ всСх элСмСнтах Ρ„ΠΎΡ€ΠΌΡ‹, функциях ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ (Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹, validators) ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (сабмиттСры, submitters) Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Данная функция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ располоТСна Π² Ρ„Π°ΠΉΠ»Π΅ модуля, ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ модуля Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² PC Magazine/RE, 9/2009.

Рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

function test_form($form_state) {

  $form["example_text_field"] = array(

    '#type' => 'textfield',

    '#title' => 'Example text field',

  );

  $options = array(

    0 => 'zero',

    1 => 'one',

    2 => 'two',

  );


  $form["example_select"] = array(

    '#type' => 'select',

    '#title' => 'Example select list',

    '#options' => $options,

    '#description' => t('You can select only value "one" in this

      form'),

  );

  $form["submit"] = array(

    '#type' => 'submit',

    '#value' => t('Submit'),

  );

  return $form;

}

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²Ρ‹ΡˆΠ΅ функция Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· тСкстового поля, Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка с трСмя элСмСнтами ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Имя этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€“ Π΅Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ($form_id), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для отобраТСния ΠΈ измСнСния Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ сторонними модулями. Π§Ρ‚ΠΎΠ±Ρ‹ вывСсти Ρ„ΠΎΡ€ΠΌΡƒ Π½Π° экран, Π½ΡƒΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· hook_menu ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ страницу, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция drupal_get_form, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° $form_id Ρ„ΠΎΡ€ΠΌΡ‹, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° экранС:

function имя_модуля_menu() {

  $items = array();

  $items['test-form'] = array(

    'title' => 'Test form',

    'page callback' => 'test_form_page',

    'access arguments' => array('access content'),

    'type' => MENU_NORMAL_ITEM,

  );

  return $items;

}

function test_form_page() {

  return drupal_get_form('test_form');

}

Π’ массивС, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ test_form($form_state), Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ заполнСния ΠΏΠΎΠ»Π΅ΠΉ (структур), поэтому ядро Drupal послС наТатия Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Submit ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ form_id_validate ΠΈ form_id_submit. Π’ нашСм случаС, ΠΊΠ°ΠΊ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, это Π±ΡƒΠ΄ΡƒΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ test_form_validate ΠΈ test_form_submit:

function test_form_validate($form, &$form_state) {

  if($form_state['values']['example_select'] != 1) {

    form_set_error('example_select', t('You must select value

      "one" in select list :)'));

  }

}

function test_form_submit($form, &$form_state) {

  drupal_set_message('Form sumitted! Values:');

  drupal_set_message("textbox: " .

    $form_state['values']['example_text']);

  drupal_set_message("selectlist: " .

    $form_state['values']['example_select']);

}

Ѐункция-Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ провСряСт Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ спискС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ, Ссли ΠΎΠ½ΠΎ Π½Π΅ one, посылаСт сообщСниС ΠΎΠ± ошибкС с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ элСмСнт Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Π·Π²Π°Π» ΠΎΡˆΠΈΠ±ΠΊΡƒ. Ѐункция-сабмиттСр Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ значСния. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ случаС эта функция Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ программист ΠΌΠΎΠΆΠ΅Ρ‚ Π² массивС $form Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ test_form Π·Π°Π΄Π°Ρ‚ΡŒ свойство #submit, содСрТащСС ΠΌΠ°ΡΡΠΈΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ свойство #validate с ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ΠΎΠ² (см. листинг 4). Π—Π΅Π»Π΅Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ строки, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊ Ρ€Π°Π½Π΅Π΅ описанным функциям. Код модуля Ρ‚Π°ΠΊΠΆΠ΅ дополнится функциями ΠΈΠ· Π»ΠΈΡΡ‚ΠΈΠ½Π³Π° 5.

Листинг 4

function test_form($form_state) {

  $form["example_text_field"] = array(

    '#type' => 'textfield',

    '#title' => 'Example text field',

    '#description' => 'Text must contain more then

      3 symbols',

  );

  $options = array(

    0 => 'zero',

    1 => 'one',

    2 => 'two',

  );

  $form["example_select"] = array(

    '#type' => 'select',

    '#title' => 'Example select list',

    '#options' => $options,

    '#description' => t('You can select only value "one"

      in this form'),

   );

  $form["submit"] = array(

    '#type' => 'submit',

    '#value' => t('Submit'),

  );

  $form["#validate"] = array('test_validate_first',

    'test_validate_second');

  $form["#submit"] = array('test_submit_first',

    'test_submit_second');

  return $form;

}

Листинг 5

function test_validate_first($form, &$form_state) {

  if(mb_strlen($form_state['values']['example_text_field']) < 3) {

    form_set_error('example_text_field', t('Text must contain more then 3 symbols'));

  }

}

function test_validate_second($form, &$form_state) {

  if($form_state['values']['example_select'] != 1) {

    form_set_error('example_select', t('You must select value "one" in select list :)'));

  }

}

function test_submit_first($form, &$form_state) {

  drupal_set_message('First submitter');

  drupal_set_message("textbox: " . $form_state['values']['example_text']);

}

function test_submit_second($form, &$form_state) {

  drupal_set_message('Second submitter');

  drupal_set_message("selectlist: " . $form_state['values']['example_select']);

}

Π—Π΄Π΅ΡΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт тСкст, Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² тСкстовоС ΠΏΠΎΠ»Π΅; Ссли Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° оказываСтся ΠΌΠ΅Π½ΡŒΡˆΠ΅ Ρ‚Ρ€Π΅Ρ… символов, Ρ‚ΠΎ гСнСрируСтся сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.

ΠŸΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌ всСгда рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ стандартныС Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ сабмиттСры, Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΈΡ… явно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² этом случаС сторонниС программисты смогут Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ массивы #submit ΠΈ #validate своими функциями. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ стандартныС Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ сабмиттСры, Ρ‚ΠΎ сторонниС программисты смогут Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ своими, Π° это Π½Π΅ всСгда ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

На Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ: ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

Signwriter. Часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ страницы ΠΈΠ»ΠΈ мСню ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ экзотичСский ΡˆΡ€ΠΈΡ„Ρ‚, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° посСтитСлСй сайта. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Signwriter Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ с тСкстом, написанным Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ (ΡˆΡ€ΠΈΡ„Ρ‚ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π·Π°ΠΊΠ°Ρ‡Π°Π½ Π½Π° сСрвСр). Π§Π΅Ρ€Π΅Π· мСню администратор ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρƒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² страниц ΠΈ Π±Π»ΠΎΠΊΠΎΠ² созданными ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°ΠΌΠΈ, Π° Ρ‡Π΅Ρ€Π΅Π· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ вовсС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°ΠΌΠΈ любой тСкст.

Blocktheme. НС всСгда ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° сСрвСр ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π½Π° сайтС Π±Π»ΠΎΠΊ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, рСализованная Π² Drupal систСма масок ΠΈΠΌΠ΅Π½ для шаблонов Π½Π΅ для всСх Π·Π°Π΄Π°Ρ‡ Π±Ρ‹Π²Π°Π΅Ρ‚ достаточно Π³ΠΈΠ±ΠΊΠΎΠΉ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Blocktheme позволяСт Ρ‡Π΅Ρ€Π΅Π· интСрфСйс управлСния Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π·Π°Ρ€Π°Π½Π΅Π΅ созданных шаблонов.

Devel. ΠœΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт Π² Ρ€ΡƒΠΊΠ°Ρ… Drupal-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Ρ‚Π΅ΠΌ оформлСния ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Devel прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΠΎ всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ страницы ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΈ функциях Ρ‚Π΅ΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

PNG Fix. ΠœΠΎΠ΄ΡƒΠ»ΡŒ, ΠΈΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ PNG-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… IE 5.5 ΠΈ IE 6. НастраиваСтся Ρ€Π°Π±ΠΎΡ‚Π° модуля Ρ‡Π΅Ρ€Π΅Π· интСрфСйс администратора, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚Π΅ΠΌΡ‹ оформлСния Π½Π΅ трСбуСтся.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вСрнСмся ΠΊ основной Ρ‚Π΅ΠΌΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ β€“ Ρ‚Π΅ΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Drupal. Ѐункция drupal_get_form, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π½Π° Π²Ρ…ΠΎΠ΄ $form_id, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ вывСсти Π½Π° экран, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ form_builder, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΡƒΡŽ ΠΏΡ€Π°Π²Π° доступа Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ этих ΠΏΡ€Π°Π² Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ стандартный HTML-ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Ρ„ΠΎΡ€ΠΌΡ‹. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ созданный элСмСнт Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ id. Π‘Π°ΠΌΡ‹ΠΉ простой способ пСрСопрСдСлСния внСшнСго Π²ΠΈΠ΄Π° элСмСнтов Ρ„ΠΎΡ€ΠΌΡ‹ β€“ созданиС CSS-Ρ„Π°ΠΉΠ»Π° с описаниСм ΡΡ‚ΠΈΠ»Π΅ΠΉ Π½ΡƒΠΆΠ½Ρ‹Ρ… элСмСнтов Ρ„ΠΎΡ€ΠΌΡ‹. Если этого нСдостаточно, ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ #prefix ΠΈ #suffix, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ HTML-ΠΊΠΎΠ΄, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π΄ΠΎ ΠΈ послС созданного элСмСнта. Если ΠΈ этого ΠΌΠ°Π»ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ #theme, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π΅ΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π΅ΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ для Π²ΡΠ΅ΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈΠ»ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΅Π΅ элСмСнта. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Drupal для Ρ‚Π΅ΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ theme_form_id, поэтому использованиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° #theme Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ #theme, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· hook_theme (описаниС этого Ρ…ΡƒΠΊΠ° Π±Ρ‹Π»ΠΎ Π΄Π°Π½ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ внСшний Π²ΠΈΠ΄ созданного тСкстового ΠΏΠΎΠ»Ρ. Для этого сначала создадим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ…ΡƒΠΊΠ° hook_theme:

function Π½Π°Π·Π²Π°Π½ΠΈΠ΅_модуля_theme() {

  return array(

    'example_text_field_theme_function' => array(

      'arguments' => array('form' => NULL),

    ),

  );

}

Π—Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ массив $form["example_text_field"], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ test_form, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² Π½Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ #theme:

$form["example_text_field"] = array(

  '#type' => 'textfield',

  '#title' => 'Example text field',

  '#description' => 'Text must contain more then 3 symbols',

  '#theme' => 'example_text_field_theme_function',

);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ theme_example_text_field_theme_function ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ Π² Π½Π΅ΠΉ любой HTML-ΠΊΠΎΠ΄ для отобраТСния Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта:

function theme_example_text_field_theme_function($element) {

  $class = "";

  if(isset($element["#needs_validation"])) {