Доброго времени суток!!!
Вопрос состоит вот в чём, уже довольно долго ищу как изменить вывод формы аутентификации в друпале. Вариант с размещением кода формы в файле 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;
}
?>
Комментарии
И все-же напишу как линуксоид http://api.drupal.org/api/function/hook_form_alter/6, http://api.drupal.org/api/file/developer/topics/forms_api.html/6 читать лекцию на русском не буду, сервисов по переводу достаточно. Реально изучение FormAPI и API друпала в целом это одно из первого с чего надо начинать.
в 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;
}
?>
В таком виде устроит?
В собственном модуле:
<?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']);
}
?>
Спасибо, заработало. Единственное так и не нашёл способ добвавить в инпут onfocus
<?php
$form['name']['#attributes'] = array('onfocus'=> 'bla bla bla...');
?>
Я Вам ссылки на форм апи наверное зря давал учите мат часть, это позволит Вам избежать многих трудностей.
(Поправил дабы не вводить в заблуждение)
о спасибо не зря давали))) я много чего почерпнул, форму переделал как хотел)) тока этого не нашёл))
Кстати не работает как Вы сказали. вот моя функция:
<?php
$items = array();
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()\' ';
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;
}
?>
и она выдёт нужное мне поле в таком виде:
а должно получиться вот так:
zardoz, $form['name']['#attributes'] это массив
<?php
$form['name']['#attributes'] = array(
'onfocus' => 'if(this.value=="Логин")this.value=""; if(this.value=="") this.style.color="#000"; this.focus()'
);
?>
Я не писал про блок я писал про 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() друпала кирилицу :). Если к ней (к кирилице) такая тяга то лучше
В противном случае синтаксис такой
<?php l(t('my link'), 'link')?>
и дальше переводить через перевод строк в админке.Огромное спасибо за то что отозвались)) Всё заработало но сделал я не модулем а в темплейте. Мне интересно почему вы предлагаете сделать модулем? для того что бы во всех темах работало?
Кстати данное обсуждение многим я думаю поможет потому что при поиске я вменяемого описания решения данного вопроса на русском так и не нашёл.
Вот бы ещё ткнули носом в то как можно поменя обвязку html тегами элементы формы user_login_block. Потому что #prefix #suffix одевают уже одетые элементы...
Наверное скорее всего из-за привычки писать модуль под любой проект (удобнее работать с хуками + все изменения по проекту собраны в одном месте и не надо шариться по всему проекту), кстати от отображения в разных темах можно уйти добавив всего один 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 (вроде так если не ошибаюсь).
Нашёл где элементы формы одеваются...
<?php
$output = '<div class="form-item"';
$output .= " $value\n";
$output .= "</div>\n";
function theme_form_element($element, $value) {
// This is also used in the installer, pre-database setup.
$t = get_t();
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";
}
}
if (!empty(
$element['#description'])) {$output .= ' <div class="description">'. $element['#description'] ."</div>\n";
}
return
$output;}
?>
Учтите это применится ко всем формам на сайте.
Я знаю, спасибо))
zardoz, можешь выложить свой код? тоже хочу чтоб логин и пароль было написано в текстовом поле, но знания не позволяют(
Думаю не одному мне пригодится : )
<?php
_form_set_class($element, array('form-text'));
function названиевашейтемы_password($element) {
$size = $element['#size'] ? ' size="'. $element['#size'] .'" ' : '';
$maxlength = $element['#maxlength'] ? ' maxlength="'. $element['#maxlength'] .'" ' : '';
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
Большое спасибо за топик!
Благодаря нему разобрался во всем