Как "склеить" fieldset ? (user_register) [решено]
Прислано: olk
пн, 26/05/2008 - 07:14
В данном случае вопрос каcается user_register ...
Как темизировать эту форму, что бы все поля (стандартные, из profile и капча) выводились одним куском (т.е. без разбивки fieldset-ом),
при этом желательно обойтись без написания модуля с переопределением hook_user ...
т.е. можно ли это решить только через template.php (user_register.tpl.php,page-user.tpl.php) ... ?
- olk's blog
- Для комментирования войдите или зарегистрируйтесь
Ну что-ж сам себе и отвечу (может кому пригодиться)
У данного решения есть некоторые ограничения, нужно знать все выводимые поля из модуля профиль и название категории
в приводимом примере категория в имеет название profile
и поля
profile_fullname
profile_org
profile_phone
в файле нашей темы в файл template.php добавляем функцию
<?php
function phptemplate_user_register($form) {
return _phptemplate_callback('user_register', array('form' => $form));
}
?>создаем файлик user_register.tpl.php со следующим кодом.
<?php
$header=array(array('data'=>t('Регистрация нового пользователя'),'colspan'=>'2'));
$rows=array();
$row=array();
$title=$form['account']['name']['#title'].': '.($form['account']['name']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['account']['name']['#description'];
unset($form['account']['name']['#title']);
unset($form['account']['name']['#description']);
$row[]=array('data'=>$title,'class'=>'title reg-user ');
$row[]=array('data'=>drupal_render($form['account']['name']),'class'=>'reg-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'reg-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
};
$row=array();
$title=$form['account']['mail']['#title'].': '.($form['account']['mail']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['account']['mail']['#description'];
unset($form['account']['mail']['#title']);
unset($form['account']['mail']['#description']);
$row[]=array('data'=>$title,'class'=>'title reg-user ');
$row[]=array('data'=>drupal_render($form['account']['mail']),'class'=>'reg-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'reg-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
};
$row=array();
$title=$form['account']['pass']['pass1']['#title'].': '.($form['account']['pass']['pass1']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['account']['pass']['#description'];
unset($form['account']['pass']['pass1']['#title']);
unset($form['account']['pass']['pass1']['#description']);
$row[]=array('data'=>$title,'class'=>'title reg-user ');
$row[]=array('data'=>drupal_render($form['account']['pass']['pass1']),'class'=>'reg-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'reg-user');
$title=$form['account']['pass']['pass2']['#title'].': '.($form['account']['pass']['pass2']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
unset($form['account']['pass']['pass2']['#title']);
unset($form['account']['pass']['pass2']['#description']);
$row=array();
$row[]=array('data'=>$title,'class'=>'title reg-user ');
$row[]=array('data'=>drupal_render($form['account']['pass']['pass2']),'class'=>'reg-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'reg-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
};
$row=array();
$title=$form['profile']['profile_fullname']['#title'].': '.($form['profile']['profile_fullname']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['profile']['profile_fullname']['#description'];
unset($form['profile']['profile_fullname']['#title']);
unset($form['profile']['profile_fullname']['#description']);
$row[]=array('data'=>$title,'class'=>'title reg-user ');
$row[]=array('data'=>drupal_render($form['profile']['profile_fullname']),'class'=>'reg-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'reg-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
};
$row=array();
$title=$form['profile']['profile_org']['#title'].': '.($form['profile']['profile_org']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['profile']['profile_org']['#description'];
unset($form['profile']['profile_org']['#title']);
unset($form['profile']['profile_org']['#description']);
$row[]=array('data'=>$title,'class'=>'title reg-user ');
$row[]=array('data'=>drupal_render($form['profile']['profile_org']),'class'=>'reg-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'reg-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
};
$row=array();
$title=$form['profile']['profile_phone']['#title'].': '.($form['profile']['profile_phone']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['profile']['profile_phone']['#description'];
unset($form['profile']['profile_phone']['#title']);
unset($form['profile']['profile_phone']['#description']);
$row[]=array('data'=>$title,'class'=>'title reg-user ');
$row[]=array('data'=>drupal_render($form['profile']['profile_phone']),'class'=>'reg-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'reg-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
};
$row=array();
$descr=$form['captcha']['captcha_response']['#description'];
$title= $form['captcha']['captcha_response']['#title'].': '.($form['profile']['profile_phone']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
unset($form['captcha']['captcha_response']['#description']);
unset($form['captcha']['captcha_response']['#title']);
unset($form['captcha']['captcha_image']['#title']);
$row[]=array('data'=>$title,'class'=>'title reg-user');
$row[]=array('data'=>drupal_render($form['captcha']['captcha_image']).drupal_render($form['captcha']['captcha_response']),'class'=>'reg-user');
$rows[]=array('data'=>$row,'class'=>'reg-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
};
$row=array();
$row[]=array('data'=>'<span class="form-required" title="This field is required.">*</span>'.t(' Поля обязательные к заполнению'),'class'=>'required reg-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'reg-user');
$row=array();
$row[]=array('data'=>drupal_render($form['submit']),'class'=>'reg-user');
$rows[]=array('data'=>$row,'class'=>'reg-user');
$row=array();
print_r(drupal_render($form['#method']));
print_r(theme('table',$header,$rows));
?>добавляем нужные стили в style.css
и получем симпатичную форму регистрации
- Для комментирования войдите или зарегистрируйтесь
К сожалению решено пока не до конца :) Да оформление работает, но обработка формы глючит ...
Как найду решение выложу обновление
- Для комментирования войдите или зарегистрируйтесь
Может быть проще переделать массив значений через hook_form?
- Для комментирования войдите или зарегистрируйтесь
На сколько я понимаю, hook_form -отработает только в модуле (т.е. требуется написание модуля ...) или я не прав и возможен перехват из темы ?
на самом деле такой объемный код только из-за табличного вывода ...
глючила обработка капчи ... пришлось пойти на небольшое извращение :) при помощи css
начиная со строки 115 код выглядит так:
<?php
$form['account']['#type']='hidden';
$form['profile']['#type']='hidden';
unset($form['affiliates']); // это на любителя - можно убрать
print_r(drupal_render($form));
print_r(theme('table',$header,$rows));
?>почему то при установке
<?php
$form['captсha']['#type']='hidden';
?>перестает нармально обрабатываться капча, поэтому сделано через css
в файл style.css добавлено
fieldset.captcha { display: none; }
- Для комментирования войдите или зарегистрируйтесь
Ну и для поддержания общего стиля
в файл template.php
<?php
function phptemplate_user_pass($form) {
return _phptemplate_callback('user_pass', array('form' => $form));
}
function phptemplate_user_login($form) {
return _phptemplate_callback('user_login', array('form' => $form));
}
?>и соответсвенно создаем два файлика user_login.tpl.php и user_pass.tpl.php
<?php
// проверка, если блок - то выводим как есть
if($form['#id'] == 'user-login-form'){
return print_r(drupal_render($form));
}
$header=array(array('data'=>t('Вход в систему'),'colspan'=>'2'));
$rows=array();
$row=array();
$title=$form['name']['#title'].': '.($form['name']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['name']['#description'];
unset($form['name']['#title']);
unset($form['name']['#description']);
$row[]=array('data'=>$title,'class'=>'title login-user');
$row[]=array('data'=>drupal_render($form['name']),'class'=>'login-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'login-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description login-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'login-user');
};
$row=array();
$title=$form['pass']['#title'].': '.($form['pass']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['pass']['#description'];
unset($form['pass']['#title']);
unset($form['pass']['#description']);
$row[]=array('data'=>$title,'class'=>'title login-user');
$row[]=array('data'=>drupal_render($form['pass']),'class'=>'login-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'login-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description login-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'login-user');
};
$row=array();
$row[]=array('data'=>'<span class="form-required" title="This field is required.">*</span>'.t(' Поля обязательные к заполнению'),'class'=>'required login-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'login-user');
$row=array();
$row[]=array('data'=>drupal_render($form['submit']),'class'=>'login-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'login-user');
print_r(drupal_render($form));
print_r(theme('table',$header,$rows));
?><?php
$header=array(array('data'=>t('Забыли пароль ?'),'colspan'=>'2'));
$rows=array();
$row=array();
$title=$form['name']['#title'].': '.($form['name']['#required']?'<span class="form-required" title="This field is required.">*</span>':'');
$descr=$form['name']['#description'];
unset($form['name']['#title']);
unset($form['name']['#description']);
$row[]=array('data'=>$title,'class'=>'title pass-user');
$row[]=array('data'=>drupal_render($form['name']),'class'=>'pass-user','width'=>'100%');
$rows[]=array('data'=>$row,'class'=>'pass-user');
if($descr) {
$row=array();
$row[]=array('data'=>$descr,'class'=>'description pass-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'pass-user');
};
$row=array();
$row[]=array('data'=>'<span class="form-required" title="This field is required.">*</span>'.t(' Поля обязательные к заполнению'),'class'=>'required pass-user','colspan'=>'2');
$rows[]=array('data'=>$row,'class'=>'pass-user');
$row=array();
$row[]=array('data'=>drupal_render($form['submit']),'class'=>'pass-user');
$rows[]=array('data'=>$row,'class'=>'pass-user');
$row=array();
print_r(drupal_render($form));
print_r(theme('table',$header,$rows));
?>- Для комментирования войдите или зарегистрируйтесь
И еще маленькое дополнение. Если вы используете капчу в других формах, то исходя из заданного нами стиля она оттуда тоже исчезнет ... обходиться довольно просто, надо обрамить в нашей форме капчу дивами и скрывать именно див ... ну в простейшем случае например так:
перед выводом формы т.е. строкой print_r(drupal_render($form));
вставляем код:
<?php
$form['captcha']['#prefix']='<div id="captcha-reg-user">';
$form['captcha']['#suffix']='</div>';
?>а в style.css вместо
fieldset.captcha { display: none; }
прописываем
#captcha-reg-user { display: none; }
- Для комментирования войдите или зарегистрируйтесь
Через hook_form_alter имел ввиду. Да, модуль пришлось бы зарегестрировать. Может быть через тему и проще, кому как удобнее :)
- Для комментирования войдите или зарегистрируйтесь
А как темизировать эту форму в 6?
- Для комментирования войдите или зарегистрируйтесь
Решение для D6
Несколько иной подход, но, в итоге, глазами пользователя видно то-же самое.
Манипуляции в файле template.php:
<?php
//hook theme
function ИМЯ_ТЕМЫ_theme() {
return array(
'user_register' => array(
'arguments' => array('form' => NULL),
),
);
}
...
//изменение формы регистрации
function ИМЯ_ТЕМЫ_user_register($form){
$output = '';
//меняем очередность fieldset-ов при помощи весов.
//Очередность самих полей можно изменить на странице администрирования профилей
//fielset-ы берутся из категорий полей аккаунта,
//в данном случае "Personal Information", "account" и "Options",
//причем, группа "options" зарезервирована системой (поля имя пользователя, пароль и эл. почта)
//и в нее, кстати, нельзя добавлять поля
$form['user_registration_help']['#weight'] = '-10';
$form['Personal Information']['#weight'] = '-9';
$form['account']['#weight'] = '-8';
$form['Options']['#weight'] = '-7';
//Здесь мне понадобилось добавить "обертку" для всей формы (вам может и не понадобиться)
$form['Personal Information']['#prefix'] = '<div id="registration-data"><h2>'. t('Create your account') .'</h2>';
$form['submit']['#suffix'] = '</div>';
//Здесь еще одна "обертка"
$form['user_registration_help']['#prefix'] = '<div id="registration-info">';
$form['user_registration_help']['#suffix'] = '</div>';
$output = drupal_render($form);
return $output;
}
?>Манипуляции в style.css:
#registration-data fieldset{ margin: 0; border: 0 none; padding: 0; } #registration-data legend{ display: none; }
Собственно, и все. Теперь форма выглядит как "единое целое". Осталось только ее немного дооформить при помощи стилей.
PS: Согласен, что "разбивка fieldset-ом" все равно присутствует, но ее-то никто не видит (Прямо как рентгеновские лучи ;)).
- Для комментирования войдите или зарегистрируйтесь
Большое спасибо за решение! Добавил ссылку в сборник рецептов.
- Для комментирования войдите или зарегистрируйтесь



Комментарии