Лаконичная замена блока «Вход» (+всплывающая форма входа)

18 марта 2008 в 9:58

Предлагаю избавляться от стандартного блока входа и заменять его более компактным, лаконичным и симпатичным решением, которое, помимо прочего, можно удобно встаивать практически в любом свободном месте вашей темы.

Представленный сниппет позволяет экономить пространство, не засорять дизайн увесистым блоком для входа, удачно вписывается во многие темы. такое решение модное!

ЛайвИнтернет:

Аскетичный Яndex:

1:
2:

YaHoo:

Google:

А вот так это будет выглядеть у нас (виды для гостя и для пользователя):

Разумеется, этот сниппет можно доработать, сделав картинку пользователя ссылкой на профиль. Тогда он станет еще симпатичнее!
Или еще похлеще: имя пользователя сделать ссылкой на профиль, а картинку - ссылкой на страницу правки профиля.

Код в приложении. Просто вставьте его в нужное место шаблона, не забыв подсунуть в шаблон и иконку пользователя с именем user.gif.
Отображение можно изменить путем добавления в css-файл стиля #login.

Недостатки

Если вы испольузете какие-то расширения (например, модуль OpenID), изменяющие форму входа, вам прийдется дорабатывать сниппет, хотя на странице входа (/user) Все будет штатно.

зы. Картинка нагло украдена с известного сервиса и пока носит лишь характер рабочей заглушки, замените ее своей.

Всплывающая форма. 7 июля 2009

Время течет непрерывно и все вокруг меняется. Пришло время измениться и образу входа.

От блока входа мы уже избавились, но приобрели новое неудобство: чтобы войти на сайт нам требовалось перейти на новую страницу. Это лишний траффик, от которого нужно всегда избавляться. Чтобы решить эту проблему, люди придумали всплывающие формы входа. Вы кликаете по ссылке входа, но не переходите к новой странице - форма входа тут же отображается на экране и вы можете вводить логин/пароль.

Но как это сделать? Да запросто.

Скачайте и установите модуль ThickBox. Это модуль для вского рода всплываний со спецэффектами, часто используется для показа картинок в галереях. Но его можно использовать и для нашего случая, причем для этого вообще ничего делать не надо - просто отметьте соотвествующую опцию в настройках модуля и все!

Модуль самостоятельно отыщет на странице ссылку на вход, с помощью jQuery обработает ее и сделает так, что при клике по ссылке будет всплывать форма входа!

ВложениеРазмер
Иконка простого текстового файла drupal_pretty_login.txt910 байт

Комментарии

Молодец! Давно хотел чего-нить подобного!
ИМХО удобно ссылку на профиль делать с имени пользователя - если для самого пользователя, то для редактирования (правки профиля), если для других пользователей или гостей - то только для просмотра.

19 марта 2008 в 14:56

Спасибо большое!
уже установила, нравится!
правда, почему то вылезли вопросики - ну это несложно вручную было заменить на русские буквы )

22 марта 2008 в 8:51

Zlata wrote:
Спасибо большое!
уже установила, нравится!
правда, почему то вылезли вопросики - ну это несложно вручную было заменить на русские буквы )

Думаю, в вашем случае было бы полезно убрать ссылку "Забыли пароль", т.к. происходит это редко и ссылка на восстановление есть на старнице входа, зато у вас все влезет в одну строку.

Вопросики из-за несоответствия кодировки, хотя я вроде в utf8 делал...

22 марта 2008 в 16:38

Slavyansk.net.ru wrote:
Zlata wrote:
Спасибо большое!
уже установила, нравится!
правда, почему то вылезли вопросики - ну это несложно вручную было заменить на русские буквы )

Думаю, в вашем случае было бы полезно убрать ссылку "Забыли пароль", т.к. происходит это редко и ссылка на восстановление есть на старнице входа, зато у вас все влезет в одну строку.

Вопросики из-за несоответствия кодировки, хотя я вроде в utf8 делал...

да, я хотела убрать, но не смогла кусок из кода убрать по незнанию Smile
а теперь еще раз попробовала - и получилось! Smile спасибо!! Smile

22 марта 2008 в 17:14

Переделал чуток ваш скрипт.
В template.php добавляем код:

function phptemplate_flat_login() {
    global $user;
    if (!$user->uid) {
      $message .= '<img src="'. base_path() . path_to_theme() .'/user.png" border="0" align="absmiddle"> '.
      l(t('Вход'),'user/login', array('attributes' => array('rel'=>'nofollow')) ).
      ' : '.l(t('Регистрация'), 'user/register', array('attributes' => array('rel'=>'nofollow')) ).
      ' : '.l(t('Забыли пароль?'), 'user/password', array('attributes' => array('rel'=>'nofollow')));
    } else {
      $message .= '<img src="'. base_path() . path_to_theme() .'/user.png" border="0" align="absmiddle"> ' .
      l($user->name, 'user/'.$user->uid).
      ' : '.l(t('Изменить'), 'user/' . $user->uid . '/edit').
      ' : '.l(t('Выход'), 'logout');
    }
    return $message;
}

В page.tpl.php вставляем:

<div id="login"><?php echo phptemplate_flat_login();?></div>

Стиль и сахар - по вкусу...
Иконку взял из famfamfam.
Посмотреть можно в шапке сайта: http://drupalcookbook.ru/

27 мая 2008 в 13:39

Да, только к такому решению привязывать thickbox обязательно. Иначе вы обрубаете функционал и заставляете пользователя грузить еще одну страницу просто так, чтобы только залогиниться.

Хотя thickbox мне не очень нравится - форма входа грузится только по клике на ссылку входа, хотя в идеале проверка на яваскипт и подгрузка этой формы входа должна идти сразу с разрузкой страницы, чтобы она появлялась сразу без всяких прелоадеров.

27 мая 2008 в 15:39

Избаловали вас аяксы всякие Smile

Я исхожу из того, что пользователь логинится один раз на пару недель, пока куки позволяют ему заходить на сайт автоматически. Загрузить раз в неделю-другую страницу входа, простите, не за падло.

28 мая 2008 в 9:34

Согласен с Али. При этом нужно учесть, что для одного сайта форма входа должна быть в центре на главной, а для других она нужна редко...

Я кстати в своём варианте добавил микроформат rel="nofollow" для ссылок - мне кажется, что ссылки на страницу регистрации на по всему сайту совершенно не нужно индексировать. Ваше мнение?

28 мая 2008 в 10:54

Переписал код, чтобы было легче им управлять и настраивать. Элементы выводятся в виде списка в одну строку...
В template.php:

function phptemplate_flat_login() {
    global $user;
    if (!$user->uid) {
      $message= '<ul>
                  <li>'
.l('Вход','user/login', array('attributes' => array('rel'=>'nofollow')) ).'</li>
                  <li>'
.l('Регистрация', 'user/register', array('attributes' => array('rel'=>'nofollow')) ).'</li>
                  <li>'
.l('Забыли пароль', 'user/password', array('attributes' => array('rel'=>'nofollow'))).'?</li>
                </ul>'
;
    } else {
      $message= '<ul>
                  <li>'
.l($user->name, 'user/'.$user->uid).'</li>
                  <li>'
.l('Изменить', 'user/' . $user->uid . '/edit').'</li>
                  <li>'
.l('Выход', 'logout').'</li>
                </ul>'
;
    }
    return $message;
}

В page.tpl.php обернул всё тегами <noindex> для Яндекса:

<noindex><div id="login"><?php echo phptemplate_flat_login();?></div></noindex>

Стили (style.css):

/*Inline Login form */
#login ul{background: url('images/user.png') 0 center no-repeat;padding: 0 0 0 0.5em;margin:0;} /* Картинка юзера слева */
#login ul li {display: inline; padding-left:1em;} /* Выводим в одну строку элементы списка и отступы между ними */

Пока так.

28 мая 2008 в 19:39

VladSavitsky wrote:
Drupal CookBook - Готовить может каждый!Решение было сохранено на сайте DrupalCookBook.ru:

Компактный блок входа и регистрации пользователей.

Авторы, предложившие решения, также указаны в сохранённой статье.
Скажите, пожалуйста, а как вывести компактную регистрацию через блок, чтобы можно было отключать его на определенных страницах? Спасибо

26 марта 2009 в 10:45

VladSavitsky, при использовании вашего варианта возникает проблемка при заходе на сайт без авторизации:

warning: htmlspecialchars() expects parameter 1 to be string, array given in z:\home\node.ru\www\includes\bootstrap.inc on line 635.

разведка боем показала, что причина в добавлении

, array('attributes' => array('rel'=>'nofollow'))

Пока убрал - ошибка исчезла.

29 мая 2008 в 11:03

Вообще-то, это уже другой блок, но...
из нужного там только трекер, "Создать..." и ссылка на админку. Админка нужна толкьо админу, трекер выносится для удобства на видное место в любом месте типа "Новенькое". "Создать" я бы тоже куда-нить в сторону убрал.

27 августа 2008 в 17:18

Да, там не только "создать" У меня например

Входящие
Мои баллы
Мои друзья
Мои закладки
Мои учетные данные
Мой блог
Мой HR-Portal
Пригласить друга
Добавить:
HR-Лента

28 августа 2008 в 15:53

Valeratal wrote:
добавить снипет в блок
и блок выводить где надо :)
Блок выводится где надо, но пустой Smile В блок вставил <?php echo phptemplate_flat_login();?>, но не работает, подскажите пож-та, как надо?

26 марта 2009 в 11:48

Valeratal wrote:
я вставлял код из
drupal_pretty_login.txt

в блок
не забудьте включить фильтр php

Не работает на D6, может из-за того, что это только для D5?

26 марта 2009 в 14:00

да у меня вроде 6-ка и работает
на всякий случай даю код

<?php
  global $user;

  if (!$user->uid) {
        $message .= '<div id="login"><img src="'. base_path() . path_to_theme() .'/images/mini-user-light-blue.png" border="0" align="absmiddle"> ' . t('<a href="login">Вход</a> | <a href="register">Регистрация</a>', array('login' => url('user/login'), 'register' => url('user/register')));
        $message .= t(' | <a href="password">Забыли пароль?</a>', array('password' => url('user/password'))) . '</div>';
  }
  else {
        $message .= '<div id="login"><img src="'. base_path() . path_to_theme() .'/images/mini-user-light-blue.png" border="0" align="absmiddle"> ' . t('<b>user</b> ', array('user' => $user->name));
        $message .= t('<a href="view">Профиль</a> | <a href="logout">Выход</a>', array('view' => url('user/' . $user->uid), 'edit' => url('user/' . $user->uid . '/edit'), 'logout' => url('logout'))) . '</div>';
  }
  echo $message;
?>

26 марта 2009 в 14:02

Valeratal wrote:
да у меня вроде 6-ка и работает
на всякий случай даю код
Вставил ваш код в блок, формат ввода: PHP code, выбрал для блока регион, но вместо результата выполнения кода вижу сам код, причем какой-то порезанный:

<?phpuid) { $message .= '
' . t('Вход | Регистрация', array('login' => url('user/login'), 'register' => url('user/register'))); $message .= t(' | Забыли пароль?', array('password' => url('user/password'))) . '
'; } else { $message .= '
' . t('user ', array('user' => $user->name)); $message .= t('Профиль | Выход', array('view' => url('user/' . $user->uid), 'edit' => url('user/' . $user->uid . '/edit'), 'logout' => url('logout'))) . '
'; } echo $message; ?>   

Подскажите, пожалуйста, в чем может быть дело? Спасибо

26 марта 2009 в 19:52

Здравствуйте, если в блоке входа поменять ссылку: user/login на user/login?destination=main_page, то попадаешь сразу не в свой профиль, а на главную страницу. В связи с этим вопрос: Как нужно поменять php код блока, чтобы выводилась при входе в эккаунт эта ссылка: user/login?destination=main_page, а не user/login Насколько я понял, ссылку с параметрами напрямую вводить в php код нельзя? Спасибо

8 апреля 2009 в 0:00

Уважаемые, подскажите, пожалуйста, как сделать, чтобы после авторизации не перебрасывало автоматически на страницу профиля пользователя, а загружалась бы, например, главная страница

12 апреля 2009 в 15:51

Химический Али wrote:
поиск по слову destination
Нашел решение только для D5, для D6 решение найти не могу. Помогите, пожалуйста.

12 апреля 2009 в 19:29

Химический Али wrote:
можно модуль login_destination, а можно дописать к урлу входа ?destination=put/kuda/nado/perenapravit/posle/vhoda
Не получается чего-то. Sad
1. Модуль login_destination, похоже, делает редирект только из блока стандартной регистрации, но не из формы
2. Если напрямую прописать ссылку: my_site/user/login?destination=kuda_nado, то выводится ссылка такого вида: my_site/user/login%3Fdestination%3Dkuda_nado и как следтсвие - страница не найдена
3. Вообще, как я понял, за редирект отвечает функция:
function user_login_submit($form, &$form_state) {
global $user;
if ($user->uid) {
$form_state['redirect'] = 'user/'. $user->uid;
return;
}
}
в user.module модуля user. Может быть, можно как-то эту функцию переопределить, чтобы не править прямо в модуле?

13 апреля 2009 в 12:22
<?php
    
global $user;
    if (!
$user->uid) {
        
$path = isset($_GET['q']) ? $_GET['q'] : '';
        if (
$path != '') { $path '?destination='urlencode($path); }
      
$message .= '<a href="/user/login' $path '">Войти</a>' ' | '.l(t('Регистрация'), 'user/register');
    }
?>
13 апреля 2009 в 12:37

<a href="mailto:vadbars@drupal.org">vadbars@drupal.org</a> wrote:
Или поставьте модуль loginTobbogan
Так в том модуле можно вроде только поменять переадресацию при регистрации и переадресацию при подтверждении нового эккаунта? Или я что-то неправильно понял?

13 апреля 2009 в 16:46

Потребовалось, чтобы выводилась после регистрации не одна картинка на всех, а аватар
чуть изменил

 <?php

  

global $user;

  if (!

$user->uid) {

    

$message .= '<div id="login" class="clearfix"><img src="'base_path() .'/vniissok.mdmix.ru/user.gif" border="0" align="left" height="90" > ' t('<a href="login">Вход</a> <br> <a href="register">Регистрация</a>', array('login=> url('user/login'), 'register=> url('user/register')));
    
$message .= t(' <br> <a href="password">Забыли пароль?</a>', array('password=> url('user/password'))) . '</div>';
  } 
  else {
    
$message .= t('<div id="login" class="clearfix"><img src="/picture" align="left"> ', array('picture=> $user->picture)). t('<b>user</b><br> ', array('user=> $user->name));
    
$message .= t('<a href="view">Профиль</a> <br> <a href="logout">Выход</a>', array('view=> url('user/' $user->uid), 'edit=> url('user/' $user->uid '/edit'), 'logout=> url('logout'))) . '</div>';

  }
  echo 

$message;

?>

но как оказалось, не выводиться дефолтная аватарка, если у пользователя нет своей.
Можно ли как-то ввести проверку на отсутствие своей аватары и в зависимости от этого выводить или дефолтную, или ту которую загрузил пользователь?

10 августа 2010 в 2:21

Подскажите, а в d7 надо что-то менять в коде? Работает, но пишет Notice: Undefined variable: message в функции eval() (строка 9 в файле /modules/php/php.module(75) : eval()'d code).
Notice: Undefined variable: message в функции eval() (строка 5 в файле /modules/php/php.module(75) : eval()'d code).

22 января 2011 в 7:55