Тематические формы в профиле 2
Недавно я был введен в модуль Profile2 для добавления полей в процесс регистрации, и я думаю, что это просто решает мою проблему. Кто-нибудь может показать мне, как оформить поля? Все, что мне нужно, это файлы .tpl, но я не думаю, что они есть, так как это форма, поэтому она использует API формы. Хотя я могу ошибаться.
3 answers
По умолчанию форма будет отображаться с использованием системы визуализации форм, которая не включает файлы шаблонов, вместо этого используются такие функции, как theme_textfield. Вы можете разрешить отображение всей формы или определенных элементов формы с помощью функции пользовательской темы с помощью клавиши #theme
.
Для определенных типов полей это может быть опасно, так как они требуют определенной разметки.
Ах да, я тоже когда-то думал, что API форм - это единственный способ стилизовать мои формы. Лично я думаю, что это боль в шее - возиться с крючками form_alter, пытаясь изменить элементы и добавить разметку HTML, необходимую для оформления вашей формы; Я бы предпочел просто использовать один.tpl.php досье на все это дело. И низко, и вот, ты можешь!
В следующем методе я определяю переменные из формы, которые могут быть выведены в файле шаблона, чтобы соответствовать любой структуре HTML, которую вы хотите. Это предполагает знание структуры формы. В этом случае я предполагаю, что структура вашей формы определена в нескольких местах, в зависимости от того, какие поля составляют ваши пользователи. Я бы предложил использовать hook_form_alter в вашем template.php распечатать массив форм, чтобы вы могли получить идентификатор формы и всю информацию об элементах.
Для этого метода я поместил весь свой код в template.php, но вы можете так же легко создать собственный модуль для этого.
-
Добавьте тему hook_theme() реализация
function YOURTHEME_theme($existing, $type, $theme, $path){ return array( 'YOUR_FORM_ID' => array( 'render_element' => 'form', 'template' => 'user-profile-form', 'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates', //add '/templates' only if you store template files in an additional folder ), ); }
Это сообщает системе тематизации Drupal, что в вашей ТЕМЕ/шаблонах есть файл шаблона, ожидающий его.
-
Далее мы определим некоторые переменные для передачи в этот шаблон в функции hook_preprocess_HOOK. Мы можем найти структурированный массив формы в $ variables['форма'] и назначить элементы формы переменным, которые мы хотели бы разбросать по нашему tpl.php файл.
function YOURTHEME_preprocess_YOUR_FORM_ID(&$variables) { $variables['rendered'] = drupal_render($variables['form']['some_form_element']); $variables['rendered'] = drupal_render($variables['form']['some_form_element_2']); }
В этом примере оба выбранных элемента формы будут помещены в переменная называется "визуализированная". Не зная структуры формы, указанной в Профиле2, я не знаю, как будут называться эти элементы; еще раз проверьте структуру формы!
-
Теперь, когда мы определили переменную, мы можем вывести ее в файл шаблона. Создайте файл шаблона с именем YOUR-FORM-ID.tpl.php в разделе "ВАША ТЕМА/шаблоны". Это демонстрационный пример:
<div id="new-form"> <?php echo $rendered; ?> </div>
При посещении страницы, на которой находится форма Profile2, теперь вы должны видеть только элемент some_form_element и some_form_элемент_2. Создайте различные переменные в функции предварительной обработки, чтобы отделить элементы формы и разместить их там, где вы хотите в YOUR-FORM-ID.tpl.php файл, добавляя любую разметку, которая вам нравится. Если вам нужно изменить определенные параметры каждого поля, вы можете поиграть с каждым элементом по отдельности, прежде чем он будет отображен в функции предварительной обработки, изменив любой из тегов API формы.
Похоже, здесь много информации; дайте мне знать, если у вас возникнут какие-либо вопросы!
Это правильный код -
function YOURTHEME_theme($existing, $type, $theme, $path){
return array(
'YOUR_FORM_ID' => array(
'render element' => 'form',
'template' => 'user-profile-form',
'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates',
//add '/templates' only if you store template files in an additional folder
),
);
}