Как "склеить" 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 в пн, 26/05/2008 - 18:31.

Ну что-ж сам себе и отвечу (может кому пригодиться)
У данного решения есть некоторые ограничения, нужно знать все выводимые поля из модуля профиль и название категории
в приводимом примере категория в имеет название 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('&nbsp;Поля обязательные к заполнению'),'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
и получем симпатичную форму регистрации


Опубликовано olk в пн, 26/05/2008 - 14:00.

К сожалению решено пока не до конца :) Да оформление работает, но обработка формы глючит ...
Как найду решение выложу обновление


Опубликовано Lvl в пн, 26/05/2008 - 14:21.

Может быть проще переделать массив значений через hook_form?


Опубликовано olk в пн, 26/05/2008 - 18:33.

На сколько я понимаю, 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;
}


Опубликовано olk в пн, 26/05/2008 - 18:45.

Ну и для поддержания общего стиля
в файл 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('&nbsp;Поля обязательные к заполнению'),'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('&nbsp;Поля обязательные к заполнению'),'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));
?>


Опубликовано olk в вт, 27/05/2008 - 04:32.

И еще маленькое дополнение. Если вы используете капчу в других формах, то исходя из заданного нами стиля она оттуда тоже исчезнет ... обходиться довольно просто, надо обрамить в нашей форме капчу дивами и скрывать именно див ... ну в простейшем случае например так:
перед выводом формы т.е. строкой 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;
}


Опубликовано Lvl в вт, 27/05/2008 - 06:19.

Через hook_form_alter имел ввиду. Да, модуль пришлось бы зарегестрировать. Может быть через тему и проще, кому как удобнее :)


Опубликовано gagaga в вт, 20/01/2009 - 22:56.

А как темизировать эту форму в 6?


Опубликовано aleksei.litvinov в сб, 31/01/2009 - 10:49.

Решение для 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-ом" все равно присутствует, но ее-то никто не видит (Прямо как рентгеновские лучи ;)).


Опубликовано ingumsky@drupal.org в ср, 04/02/2009 - 08:44.

Большое спасибо за решение! Добавил ссылку в сборник рецептов.


Новое на сайте

Ссылки партнёров