Человеческая форма комментирования
Статья эвакуирована с DrupalDance.com
Ввиду повального незнания о возможностях темизации Друпала и использования Form API, большая часть разработчиков лишается возможности делать приятные сайты.
Данная статья призвана возбудить все-таки у людей интерес к использованию средств темизации.
Недавно я был участником дискуссии на тему идеальной формы комментирования. Так вот, помните на что похожа стандартная друпаловская форма комментариев?

Эта форма содержит в себе абсолютно все минусы, которые могут быть. Она громоздка, скучна и непонятна рядовому пользователю.
А на что в действительности способен Друпал?
Для начала, немного теории. Любую форму в пятой версии Друпала можно темизировать создав в файле шаблона template.php функцию phptemplate_FORM_ID($form), где FORM_ID - это идентификатор формы.
Форма комментирования имеет id равный comment-form, поэтому, для нее функция темизации будет называться phptemplate_comment_form:
function phptemplate_comment_form($form) {
}
Если вы все сделали правильно, то после того как вы впишите эту функцию в свой template.php, на сайте сразу пропадут все формы комментирования.
Дальше стоит разобраться, что находится в переменной $form, которая находится в параметрах функции. Вписываем волшебный print_r:
function phptemplate_comment_form($form) {
print_r($form);
}
После этого вы увидите кучу всякого кода сверху экрана. Если посмотреть в исходный код страницы, выглядеть это будет примерно так:

Это и есть массив формы. Справка по каждому из полей.
А теперь, к делу:
function phptemplate_comment_form($form) {
  // убираем имя автора (если юзер залогинен)
  if ($form['_author'])
    unset($form['_author']['#type']);
  // убираем все форматы форматирования из формы
  unset($form['comment_filter']['format']);
  // формируем один единственный формат ввода
  // (будет сформирован формат, который выбран в админке по-умолчанию)
  // тут же мы избавляемся и от ссылки "Подробнее о форматировании"
  // просто не включив ее в состав формы
  $form['comment_filter'][1] = array(
    '#type' => 'value',
    '#value' => variable_get('filter_default_format', 1)
  );
  $tips = _filter_tips(variable_get('filter_default_format', 1), FALSE);
  $form['comment_filter']['format']['guidelines'] = array(
    '#title' => t('Formatting guidelines'),
    '#value' => theme('filter_tips', $tips, FALSE, $extra),
  );
  // убираем поле "домашняя страница" с формы
  // так как в большинстве случаев оно лишнее
  unset($form['homepage']);
  // скрываем подпись у главного поля комментирования
  $form['comment_filter']['comment']['#title'] = '';
  // устанавливаем меньшее количество строк у поля
  $form['comment_filter']['comment']['#rows'] = '7';
  // это условие спасает нас, в случае залогиненного юзера
  // (у залогиненных нет этих полей)
  if (($form['mail'])&&($form['name'])) {
    // оборачиваем всю правую часть в теги
    // ниже, в описании стилей можно увидеть, что класс side
    // выравнивается по правому краю
    $form['name']['#prefix'] = '
$form['name']['#suffix'] = '
';
    $form['mail']['#prefix'] = '
$form['mail']['#suffix'] = '
';
    // оборачиваем поле для ввода в свои теги
    $form['comment_filter']['#prefix'] = '
$form['comment_filter']['#suffix'] = '
';
  }
  // оборачиваем в теги надпись о форматировании
  // обратите внимание на css свойства класса guidelines
  $form['comment_filter']['format']['guidelines']['#prefix'] =
    '
$form['comment_filter']['format']['guidelines']['#suffix'] = '
';
  //подключаем файл с js-блиотекой на страницу
  drupal_add_js(path_to_theme().'/comments.js');
  //цепляем вызовы js-функций под код нашей формы
  $form['#suffix'] .= '
';
  //выводим форму
  $output .= drupal_render($form);
  return $output;
}
Для того, чтобы это все работало под Drupal 6, нужно добавить вот такую функцию в template.php или дополнить ее, если она уже существует:function названиетемы_theme() {
  return array(
  'comment_form' => array(
    'arguments' => array('form' => NULL),
  ),
);
а функцию темизации обозвать имя_темы_comment_form(). И не забудьте почитить кеш друпала!
JavaScript:
// файл comments.js в директории вашей темы
// (создать, если потребуется)
function replaceButtons(form) {
  $(form+' .form-submit').each(function(){
    id = $(this).attr('id');
    text = $(this).attr('value');
    $(this).css('display','none');
    $(this).after(''+text+'');
    $('a.'+id).click(function(){
      $('#edit-op').attr('value',$(this).text());
      $(form).submit();
      return false;
    });
  });
}
function insertGuidelinesLink(title) {
  $('.guidelines.nolink').before(''+title+'');
  $('.guidelines.nolink').removeClass('.nolink');
  $('#guidelink').click(function(){
    $(this).slideUp('fast');
    $('.guidelines').slideDown('fast');
    return false;
  });
}
стили:
.main{
  margin:0px 250px 0 0;
}
.side{
  width:230px;
  float:right;
  clear:right;
  margin:0 0 10px 0;
}
.main .form-item,.side .form-item{
  margin:0;
}
.side input.form-text{
  width:100%
}
#guidelink{
  font-size:10px;
  text-decoration:none;
  border-bottom:dashed 1px;
}
.guidelines{
  display:none;
  margin:10px 0 0;
}
Итого, форма будет выглядеть так:

Красота?
Решение полностью Drupal-правильное, W3C-валидное и кросс-браузерное.
P.S. Cовсем забыл про капчу. Пользуйтесь моей скрытой капчей и будет вам счастье.
См. также Темизация форм (D5-6)

Хотите что-то добавить?