Темизация блока "Вход в систему" [РЕШЕНО]

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

Аватар пользователя msidiagnos01 msidiagnos01 23 сентября 2010 в 9:06

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

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

function тема_user_login_block($form) {
$output = '';
$items['links']=array();
if (variable_get('user_register', 1)) {
$items['links']['#value'] =l(t('Create new account'), 'user/register', array('attributes' => array('title' => t('Create a new user account.'))));;
}
$form['submit']['#type'] = 'submit';
$form['submit']['#value']= t('Log in');
$form['name']['#title'] = t('Username');
$form['pass']['#title'] = t('Password');
$output .= drupal_render($form['name']);
$output .= drupal_render($form['pass']);
$output .= drupal_render($form['submit']);
$output .= drupal_render($form['links']);
$output .= drupal_render($form);
return $output;
}
?>

И теперь я могу расставлять поля в том порядке, как мне хочется. Но как быть, если мне необходимо располагать поля не одно под другим, а примерно так:

"Название поля" "Форма"
"Название поля" "Форма"
"Кнопка"
"Ссылка 1" "Ссылка 2"

Также я настраивал вывод этого блока в произвольном месте страницы и пока не нашел ничего лучше, чем <?php $module = 'user'; $delta = 0; $block = (object) module_invoke($module, 'block', 'view', $delta); include "block-user-0.tpl.php";?>
Вывел этот блок в шапку и после логина на месте этого блока остается прямоугульник (проще говоря, блок после логина должен пропадать, а это происходит лишь частично)

Комментарии

Аватар пользователя AI AI 23 сентября 2010 в 17:20

"msidiagnos01" wrote:
"Название поля" "Форма"
"Название поля" "Форма"

Учите css.

.form-item label {
display:inline;
}

"msidiagnos01" wrote:
include "block-user-0.tpl.php";

Это жестоко с вашей стороны. Инклюдить не нужно. Читайте и научитесь. Только качественно читайте. Ответы почти на ВСЕ вопросы есть на этом сайте. Поверьте.

Аватар пользователя msidiagnos01 msidiagnos01 24 сентября 2010 в 3:06

Без инклуда
<?php if (!$user->uid) {$block = module_invoke('user', 'block', 'view', 0);print $block['content'];}?>

Это хозяйство обернул в свой класс, дабы не портить другие формы, и при помощи css сделал:
Имя пользователя__Форма
Пароль___________Форма

(___ означает пробелы естественно=)), т.е как раз то, что было нужно.

Осталось переделать кнопку (внешний вид, это несложно) и ссылки Регистрация и Напомнить пароль расположить в линию, а не списком, как это делается по умолчанию. Хотя, если я не ошибаюсь эти две ссылки стандартные страницы друпала и можно их просто вывести в page.tpl.php как обычные ссылки.

2AI Иногда советы учить матчасть толкают на идеи. Хотя хотелось бы услышать твое мнение по выводу блока, правильно ли будет таким образом, ибо есть масса статей и про вывод блока инклудом своего шаблона и про тот, что описан в этом посте. В любом случае спасибо, решение проблемы близится к концу.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 24 сентября 2010 в 3:52

msidiagnos01: не совсем понятно, чем вы тут занимаетесь.

"msidiagnos01" wrote:
<?php if (!$user->uid) {$block = module_invoke('user', 'block', 'view', 0);print $block['content'];}?>

Зачем вы намертво печатаете блок в странице, если им можно управлять из админки? Блок, загруженный таким способом не кэшируется. Во-вторых, у вас будут траблы в дальнейшем, когда вы захотите поменять расположение этого блока

Ссылки по теме http://drupal.org/node/478328
http://drupal.org/node/19855

Аватар пользователя msidiagnos01 msidiagnos01 24 сентября 2010 в 15:29

Сделал свой регион, там где нужно вывести блок ну и всё выше описанное по статье http://drupal.org/node/478328.

Но честно говоря напрягает, способов много, ньюансы и последствия каждого мне неизвестны. Спасибо volocuga@drupal.org

Аватар пользователя msidiagnos01 msidiagnos01 24 сентября 2010 в 15:58

Пока не придумал ничего интересней, чем создать файл block-user-0.tpl.php, чтобы он был приоритетней перед block.tpl.php и там уже настраивать все классы под блок входа в систему.

Аватар пользователя msidiagnos01 msidiagnos01 9 мая 2011 в 23:03

Итак подитожим.

В template.php определяем функцию для вашей темы

<?php
function имя_темы_theme(){
return array(
'user_login_block' => array(
'template' => 'user-login-block',
'arguments' => array('form' => NULL),
)
);
}
?>

Далее создаем файл user-login-block.tpl.php со следующим содержанием:

<div id="block-user-0" class="clear-block block block-user">
  <div class="content">
      <div>
        <div class="form-item" id="edit-name-wrapper">
          <label for="edit-name">Username: <span class="form-required" title="This field is required.">*</span></label>
          <input type="text" maxlength="60" name="name" id="edit-name" size="15" value="" class="form-text required" />
        </div>
        <div class="form-item" id="edit-pass-wrapper">
          <label for="edit-pass">Password: <span class="form-required" title="This field is required.">*</span></label>
          <input type="password" name="pass" id="edit-pass"  maxlength="60"  size="15"  class="form-text required" />
        </div>
        <input type="submit" name="op" id="edit-submit" value="Log in"  class="form-submit" />
        <div class="item-list">
          <ul>
            <li class="first"><a href="/user/register" title="Create a new user account.">Create new account</a></li>
            <li class="last"><a href="/user/password" title="Request new password via e-mail.">Request new password</a></li>
          </ul>
        </div>
       <input type="hidden" name="form_build_id" id="<?php echo form_clean_id ( 'form-' . drupal_get_token ()) ?>" value="<?php echo ( 'form-' . drupal_get_token ()) ?>"  />
       <input type="hidden" name="form_id" id="edit-user-login-block" value="user_login_block"  />
      </div>
  </div>
</div>

Тут всё понятно, что, где и как выводится. Если сайт мультиязычный, то вместо Username: можете вписать <?php print t('Username')?>, если необходимости нет, вписывайте, что будет необходимо. (t('Username') вы также можете переопределить в переводу интерфейса). Остальные заголовки по аналогии и при необходимости.

Если больше ничего не делать, то дизайн будет браться из block.tpl.php. Если же есть необходимость для данного блока сделать свой дизайн, создаете файл block-user-0.tpl.php, в котором <?php echo $block->content; ?> и <?php echo $block->subject; ?> заворачиваете в нужную вам разметку, дивы, таблицы и т.д., свойства которых определяете в css.

Спасибо всем отписавшимся, в конечном итоге я остановился на этом.