Добрый день.
Поделитесь, пожалуйста, опытом, есть ли способы темизации друпаловских форм, кроме классических (hook_form_alter, другие хуки, переопределение уже прописанных классов CSS и т.д.) ?
Например, недавно решал такую задачу.
Есть готовая верстка сделанная верстальщиком, и нужно было, чтобы форма ввода комментария выглядела вот таким вот образом:
И вот для того, чтобы привести стандартную форму к такому виду, пришлось написать вот такой вот код
{
// Настройка формы добавления комментария
// Обрамляем всю форму ввода комментария
$vars['content']['comment_form']['#prefix'] = '<div class="comment-panel">';
$vars['content']['comment_form']['#suffix'] = '</div>';
// Добавляем классы для формы ввода комментария
$vars['content']['comment_form']['#attributes'] = array(
'class' => array('form','form_standard', 'form_comment'),
);
// Настройка поля ввода текста комментария
$vars['content']['comment_form']['comment_body']['#prefix'] = '<li class="form-fields__item">';
$vars['content']['comment_form']['comment_body']['#suffix'] = '</li>';
$vars['content']['comment_form']['comment_body']['und'][0]['value']['#title_display'] = 'invisible';
$vars['content']['comment_form']['comment_body']['und'][0]['value']['#attributes'] = array(
'class' => array('field', 'field_type_textarea'),
'placeholder' => array('Ваш комментарий'),
);
$vars['content']['comment_form']['comment_body']['und'][0]['value']['#rows'] = 1;
// Настройка внешнего вида кнопки "Добавить"
$vars['content']['comment_form']['actions']['#prefix'] = '<li class="form-fields__item">';
$vars['content']['comment_form']['actions']['#suffix'] = '</li>';
$vars['content']['comment_form']['actions']['submit']['#prefix'] = '<span class="btn btn_green">';
$vars['content']['comment_form']['actions']['submit']['#suffix'] = '</span>';
$vars['content']['comment_form']['actions']['submit']['#attributes'] = array('class' => array('btn__in'));
$vars['content']['comment_form']['actions']['submit']['#value'] = 'Добавить';
// Убираем из формы выбор формата
$vars['content']['comment_form']['comment_body']['und'][0]['format']['#access'] = FALSE;
// Добавляем элементы для обрамления элементов формы
$vars['content']['comment_form']['list_begin'] = array(
'#weight' => -1000,
'#markup' => '<ul class="form-fields form-fields_inline">',
);
$vars['content']['comment_form']['list_end'] = array(
'#weight' => 1000,
'#markup' => '</ul>',
);
// Скрываем кнопку "Предварительный просмотр"
$vars['content']['comment_form']['actions']['preview']['#access'] = FALSE;
// Скрываем поле темы
$vars['content']['comment_form']['subject']['#access'] = FALSE;
// Скрываем поле автора
$vars['content']['comment_form']['author']['#access'] = FALSE;
}
Да и то, задача решилась частично, так как хоть форма теперь и выглядит, как задумывалось, но её код остался довольно громоздким по сравнению с тем, как сверстал верстальщик.
Вот так сверстал верстальщик:
<form class="form form_standard from_comment">
<ul class="form-fields form-fields_inline">
<li class="form-fields__item"><textarea placeholder="Ваш комментарий" class="field field_type_textarea"></textarea></li>
<li class="form-fields__item"> <span class="btn btn_green"><input type="submit" class="btn__in" value="Добавить"></span></li>
</ul>
</form>
</div>
А вот так получилось в итоге:
<form class="form form_standard form_comment" action="/comment/reply/4" method="post" id="comment-form" accept-charset="UTF-8">
<div>
<ul class="form-fields form-fields_inline">
<li class="form-fields__item">
<div class="field-type-text-long field-name-comment-body field-widget-text-textarea form-wrapper" id="edit-comment-body">
<div id="comment-body-add-more-wrapper">
<div class="text-format-wrapper">
<div class="form-item form-type-textarea form-item-comment-body-und-0-value">
<label class="element-invisible" for="edit-comment-body-und-0-value">Comment <span class="form-required" title="Это поле обязательно для заполнения.">*</span></label>
<textarea class="field field_type_textarea form-textarea required" placeholder="Ваш комментарий" id="edit-comment-body-und-0-value" name="comment_body[und][0][value]" cols="60" rows="1"></textarea>
</div>
</div>
</div>
</div>
</li>
<input type="hidden" name="form_build_id" value="form-IMbWa6LBhg4aO-nLOSYy9UKWWglyI6vWUYtlCK6FR0I" />
<input type="hidden" name="form_token" value="tLm1DJdighyhjN7fMBsLoyEE0pecvW_mdifiX3MZzEU" />
<input type="hidden" name="form_id" value="comment_node_notice_form" />
<li class="form-fields__item">
<div class="form-actions form-wrapper" id="edit-actions">
<span class="btn btn_green">
<input class="btn__in form-submit" type="submit" id="edit-submit" name="op" value="Добавить" />
</span>
</div>
</li>
</ul>
</div>
</form>
</div>
Так вот, хочу спросить, есть ли визуальные средства, которые позволяли бы без потери функционала генерировать код форм без всяких друпаловских врапперов и т.д. ?
То есть, чтобы код был как можно более приближен к коду ручной верстки.
Вложение | Размер |
---|---|
form-add-comment.png | 5.76 КБ |
Комментарии
Да, для любой формы можно сделать свой шаблон tpl.
переопределите theme_textfield и все остальное что вам нужно.
sergeybelya, вроде как в tpl уже html после theme функций попадает или я ошибаюсь?
Не ошибаетесь, но элементы формы в собственном tpl-файле можно выводить отдельно через drupal_render, т.е. "каркас" формы задается в шаблоне, например в табличном виде, так гораздо проще чем через hook_form_alter добавлять префиксы и суффиксы к полям, а если не нужны стандартные обертки элементов - то переопределить и соотв. функции темизации как указал drupby.
вроде как для любой формы можно свою функцию темизации сделать
единственное что придется переопределять функции темизации отдельных элементов
вот и я про тоже - самый идеальный вариант темизации формы это определенно через hook_theme(созданием для нее функции темизации или же шаблона)
если же нужны косметические правки то через форм альтер
Я использую шаблон формы через hook_theme, далее переопределяю theme_form_element и theme_container, в которых исключаю из вывода врапперы ... и то, от всех врапперов и вложенных DIV'ов избавиться не удалось.
Спасибо за ваш пример применил на своем сайте