Нужно переопределить функцию user_login_block()

Главные вкладки

Аватар пользователя zardoz zardoz 6 июня 2009 в 2:16

Доброго времени суток!!!

Вопрос состоит вот в чём, уже довольно долго ищу как изменить вывод формы аутентификации в друпале. Вариант с размещением кода формы в файле block-user-0.tpl.php у меня не заработал, точнее форма-то отображается прям как мне нада, но она не сабмитится, я уже пробовал рабочую форму друпала копировал и вставлял в этот файл не хочет сабмитить, я так думаю из-за того что в ней есть скрытые поля со значением сессии (с кучей символов. пробовал воткнуть $_REQUEST[session_name()] значения разные).

После всех этих манипуляций решил исследовать варианты на тему подмены функций стандартных. Вот не получается у меня никак изменить user_login_block() не трогая её в движке самого друпала. а после каждого обновления как то не охота менять этот файлик. Подскажите пожалуйста как победить это дело?
вообще задача состоит в том что бы из стандартной формы убрать Логин: *.... И названия ссылок поменять с регистрацией и забыли пароль. Тока пожалуйста не нужно писать как линуксоиды читай man. Хотя можно писать, только со ссылкой на русскоязычный ресурс с описанием решения данной проблемы.

Нужно что бы функция

<?php
function user_login_block() {
  
$form = array(
    
'#action' => url($_GET['q'], array('query' => drupal_get_destination())),
    
'#id' => 'user-login-form',
    
'#validate' => user_login_default_validators(),
    
'#submit' => array('user_login_submit'),
  );
  
$form['name'] = array('#type' => 'textfield',
    
'#title' => t('Username'),
    
'#maxlength' => USERNAME_MAX_LENGTH,
    
'#size' => 15,
    
'#required' => TRUE,
  );
  
$form['pass'] = array('#type' => 'password',
    
'#title' => t('Password'),
    
'#maxlength' => 60,
    
'#size' => 15,
    
'#required' => TRUE,
  );
  
$form['submit'] = array('#type' => 'submit',
    
'#value' => t('Log in'),
  );
  
$items = array();
  if (
variable_get('user_register'1)) {
    
$items[] = l(t('Create new account'), 'user/register', array('attributes' => array('title' => t('Create a new user account.'))));
  }
  
$items[] = l(t('Request new password'), 'user/password', array('attributes' => array('title' => t('Request new password via e-mail.'))));
  
$form['links'] = array('#value' => theme('item_list'$items));
  return 
$form;
}
?>

Выглядела минимум вот так

<?php
function user_login_block() {
  
$form = array(
    
'#action' => url($_GET['q'], array('query' => drupal_get_destination())),
    
'#id' => 'user-login-form',
    
'#validate' => user_login_default_validators(),
    
'#submit' => array('user_login_submit'),
  );
  
$form['name'] = array('#type' => 'textfield',
    
//'#title' => t('Username'),
    
'#maxlength' => USERNAME_MAX_LENGTH,
    
'#size' => 15,
    
'#required' => TRUE,
  );
  
$form['pass'] = array('#type' => 'password',
    
//'#title' => t('Password'),
    
'#maxlength' => 60,
    
'#size' => 15,
    
'#required' => TRUE,
  );
  
$form['submit'] = array('#type' => 'submit',
    
'#value' => t('Log in'),
  );
  
$items = array();
  if (
variable_get('user_register'1)) {
    
$items[] = l(t('Create new account'), 'user/register', array('attributes' => array('title' => t('Create a new user account.'))));
  }
  
$items[] = l(t('Request new password'), 'user/password', array('attributes' => array('title' => t('Request new password via e-mail.'))));
  
$form['links'] = array('#value' => theme('item_list'$items));
  return 
$form;
}
?>

Комментарии

Аватар пользователя glu2006 glu2006 6 июня 2009 в 10:51

И все-же напишу как линуксоид Smile http://api.drupal.org/api/function/hook_form_alter/6, http://api.drupal.org/api/file/developer/topics/forms_api.html/6 читать лекцию на русском не буду, сервисов по переводу достаточно. Реально изучение FormAPI и API друпала в целом это одно из первого с чего надо начинать.

Аватар пользователя stenli21 stenli21 6 июня 2009 в 12:01

в template.php вставляешь 2 функции:

1)

<?php
function назв_темы_theme () {
    return array (
        
'user_login_block' => array (
            
'arguments' => array('form' => NULL),
        ),
        
    );
}
?>

2)

<?php
function назв_темы_user_login_block ($form) {
    
$output '';
    unset (
$form['name']['#title']);
    unset (
$form['pass']['#title']);
    
$output .= drupal_render($form);
    return 
$output;
}
?>

В таком виде устроит?

Аватар пользователя glu2006 glu2006 6 июня 2009 в 12:11

В собственном модуле:

<?php
function имя модуля_form_alter(&$form$form_state$form_id) {
  if (
$form_id == 'user-login-form') {
    unset(
$form['name']['#title']);
    unset(
$form['pass']['#title']);
  }
}
или
function имя модуля_form_user_login_form_alter(&$form$form_state) {
  unset(
$form['name']['#title']);
  unset(
$form['pass']['#title']);
}
?>
Аватар пользователя glu2006 glu2006 6 июня 2009 в 18:26
<?php
$form
['name']['#attributes'] = array('onfocus'=> 'bla bla bla...');
?>

Я Вам ссылки на форм апи наверное зря давал Smile учите мат часть, это позволит Вам избежать многих трудностей.
(Поправил дабы не вводить в заблуждение)

Аватар пользователя zardoz zardoz 6 июня 2009 в 17:58

Кстати не работает как Вы сказали. вот моя функция:

<?php
function mama_user_login_block ($form) {
    
$output '';
    unset (
$form['name']['#title']);
    unset (
$form['pass']['#title']);
    
$form['name']['#value'] = 'Логин';
    
$form['name']['#attributes'] = 'onfocus=\'if(this.value==\"Логин\")this.value=\"\"; if(this.value==\"\") this.style.color=\"\#000\"; this.focus()\' ';

    

$items = array();
    if (
variable_get('user_register'1)) {
        
$items[] = l('регистрация''user/register', array('attributes' => array('title' => 'Зарегистрировать свой аккаунт.')));
    }
    
$items[] = l('забыли пароль''user/password', array('attributes' => array('title' => 'Напомнить пароль по e-mail.')));
    
$form['links'] = array('#value' => theme('item_list'$items));
    
$output .= drupal_render($form);
    return 
$output;
}
?>

и она выдёт нужное мне поле в таком виде:

<input type="text" maxlength="60" name="name" id="edit-name" size="15" value="Логин" />

а должно получиться вот так:

<input type="text" maxlength="60" name="name" id="edit-name" size="15" value="Логин" onfocus='if(this.value=="Логин")this.value=""; if(this.value=="") this.style.color="#000"; this.focus()' />
Аватар пользователя penexe penexe 6 июня 2009 в 18:14

zardoz, $form['name']['#attributes'] это массив

<?php
$form
['name']['#attributes'] = array(
  
'onfocus' => 'if(this.value=="Логин")this.value=""; if(this.value=="") this.style.color="#000"; this.focus()'
);
?>
Аватар пользователя glu2006 glu2006 6 июня 2009 в 18:35

Я не писал про блок я писал про form_alter так пробовали?
кстати вот еще ссылка http://api.drupal.org/api/file/developer/topics/forms_api_reference.html/6


<?php
function имя модуля_form_alter(&$form$form_state$form_id) {
  if (
$form_id == 'user-login-form') {
    unset(
$form['name']['#title']);
    unset(
$form['pass']['#title']);
    
$form['name']['#attributes'] = array('onfocus' => 'if(this.value=="Логин")this.value=""; if(this.value=="") this.style.color="#000"; this.focus()');
  }
}
или
function имя модуля_form_user_login_form_alter(&$form$form_state) {
  unset(
$form['name']['#title']);
  unset(
$form['pass']['#title']);
  
$form['name']['#attributes'] = array('onfocus' => 'if(this.value=="Логин")this.value=""; if(this.value=="") this.style.color="#000"; this.focus()');
}
?>

Да и во избежании последующих возможно возникнущих траблов не пишите в функцию l() друпала кирилицу :). Если к ней (к кирилице) такая тяга то лучше

<a href="" ...

В противном случае синтаксис такой <?php l(t('my link'), 'link')?> и дальше переводить через перевод строк в админке.

Аватар пользователя zardoz zardoz 6 июня 2009 в 19:31

Огромное спасибо за то что отозвались)) Всё заработало но сделал я не модулем а в темплейте. Мне интересно почему вы предлагаете сделать модулем? для того что бы во всех темах работало?

Кстати данное обсуждение многим я думаю поможет потому что при поиске я вменяемого описания решения данного вопроса на русском так и не нашёл.

Вот бы ещё ткнули носом в то как можно поменя обвязку html тегами элементы формы user_login_block. Потому что #prefix #suffix одевают уже одетые элементы...

Аватар пользователя glu2006 glu2006 6 июня 2009 в 19:55

Наверное скорее всего из-за привычки писать модуль под любой проект (удобнее работать с хуками + все изменения по проекту собраны в одном месте и не надо шариться по всему проекту), кстати от отображения в разных темах можно уйти добавив всего один if, примерно так:


<?php
function имя модуля_form_alter(&$form$form_state$form_id) {
  global 
$theme;
  if (
$form_id == 'user-login-form' && $theme == 'имя темы') {
    unset(
$form['name']['#title']);
    unset(
$form['pass']['#title']);
    
$form['name']['#attributes'] = array('onfocus' => 'if(this.value=="Логин")this.value=""; if(this.value=="") this.style.color="#000"; this.focus()');
  }
}
или
function имя модуля_form_user_login_form_alter(&$form$form_state) {
  global 
$theme;
  if (
$theme == 'имя темы') {
    unset(
$form['name']['#title']);
    unset(
$form['pass']['#title']);
    
$form['name']['#attributes'] = array('onfocus' => 'if(this.value=="Логин")this.value=""; if(this.value=="") this.style.color="#000"; this.focus()');
  }
}
?>

А переопределить html block-user-0.tpl.php только не забудьте что в теме должен присутвовать файл block.tpl.php (вроде так если не ошибаюсь).

Аватар пользователя zardoz zardoz 7 июня 2009 в 4:46

Нашёл где элементы формы одеваются...

<?php
function theme_form_element($element$value) {
  
  
// This is also used in the installer, pre-database setup.
  
$t get_t();

  

$output '<div class="form-item"';
  if (!empty(
$element['#id'])) {
    
$output .= ' id="'$element['#id'] .'-wrapper"';
  }
  
$output .= ">\n";
  
$required = !empty($element['#required']) ? '<span class="form-required" title="'$t('This field is required.') .'">*</span>' '';

  if (!empty(

$element['#title'])) {
    
$title $element['#title'];
    if (!empty(
$element['#id'])) {
      
$output .= ' <label for="'$element['#id'] .'">'$t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) ."</label>\n";
    }
    else {
      
$output .= ' <label>'$t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) ."</label>\n";
    }
  }

  

$output .= $value\n";

  if (!empty(

$element['#description'])) {
    
$output .= ' <div class="description">'$element['#description'] ."</div>\n";
  }

  

$output .= "</div>\n";

  return 

$output;
  
}
?>
Аватар пользователя gehbi4 gehbi4 17 июня 2009 в 21:41

zardoz, можешь выложить свой код? тоже хочу чтоб логин и пароль было написано в текстовом поле, но знания не позволяют(
Думаю не одному мне пригодится : )

Аватар пользователя zardoz zardoz 23 июня 2009 в 16:53
<?php
function названиевашейтемы_password($element) {
  
$size $element['#size'] ? ' size="'$element['#size'] .'" ' '';
  
$maxlength $element['#maxlength'] ? ' maxlength="'$element['#maxlength'] .'" ' '';

  

_form_set_class($element, array('form-text'));
  if (
$element['#id'] == 'edit-pass') {
      
$output '<input type="text" value="'.$element['#value'].'" name="'$element['#name'] .'" id="'$element['#id'] .'" '$maxlength $size drupal_attributes($element['#attributes']) .' />';}
  else {
      
$output '<input type="password" value="" name="'$element['#name'] .'" id="'$element['#id'] .'" '$maxlength $size drupal_attributes($element['#attributes']) .' />';
      }
  return 
theme('form_element'$element$output);
}
?>

В общем вот так сделал, единственное что если ткнуть по регистрации и там выбрать вкладку "Вход в систему" там не используется ни #vulue у элементов ни #attributes