Как отобразить поле перед заголовком узла?


41

Я пытаюсь визуализировать определенное поле перед заголовком узла при отображении тизера в D7.

По сути, я хочу перейти от этого к этому .

Я посмотрел на обновление node.tpl.php, но я заметил, что он отделяется $titleот, $contentтак что я не уверен, как подойти к этому. После некоторых поисков я обнаружил, что люди предложили использовать модули CCK и ConTemplate, чтобы обойти это в Drupal-6, но мне интересно, есть ли более Drupal-7 решение.

Какие-либо предложения?


Помимо всех шаблонных решений на основе php, вы также можете пройти долгий путь только с помощью CSS. Отрицательные поля могут многое сделать. В вашем примере с jsfiddle это будет выглядеть так .
Marcvangend

Я думал об этом, но что происходит с длинными названиями ?
irishbuzz

Вы абсолютно правы, это работает, только если заголовок имеет фиксированную высоту. Как и у любого решения, у него есть свои слабые стороны. Лично я думаю, что (независимо от дизайна и технологии, которую вы используете) следует избегать длинных заголовков, обучая редакторов, но я понимаю, что это не всегда вариант.
Marcvangend

Ответы:


53

Это действительно довольно просто с Drupal 7.

С renderи hideвы знаете, есть возможность контролировать размещение одного элемента $contentбез необходимости распечатывать все элементы, которые были необходимы вам в Drupal 6.

Упрощенный шаблон узла выглядит так:

<div>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

Небольшая модификация будет отвечать вашим потребностям:

<div>
  <?php print render($content['field_name_of_image']); ?>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

Используя render, вы можете вывести элемент. Это умнее, чем просто печатать, так как Drupal будет следить за тем, что было отрендерено, чтобы избежать того, чтобы одно и то же печаталось дважды на месте. При рендеринге поля над заголовком вы также удаляете то, что отображается, когда $contentотображается.


2
Очень хорошо. В идеальном мире было бы лучше просто попросить Drupal обращаться с полем заголовка, как с любым другим полем, но, по крайней мере, в Drupal 7 у нас есть простые решения, подобные этому. Слава @googletorp!
irishbuzz

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

1
@berkes: Если вы печатаете поля по отдельности в D6, вы должны сохранить шаблон узла и отредактировать код, чтобы иметь возможность добавлять новые поля. Это большая разница по сравнению с D7, где вы можете продолжать добавлять поля и использовать пользовательский интерфейс для их сортировки.
googletorp

рендер действительно новый. Но его концепция не является. Есть несколько приемов для достижения того же. Я не хотел сказать, что в Drupal6 это так же просто, чисто и красиво. Просто, что это возможно тоже.
Беркес

@googletorp есть ли способ напечатать поле в page.tpl.php?
CocoSkin

9

Дисплей Люкс тоже довольно классный.

Display Suite позволяет вам полностью контролировать отображение вашего контента с помощью интерфейса перетаскивания. Расположите ваши узлы, представления, комментарии, пользовательские данные и т. Д. Так, как вам нужно, без необходимости прокладывать себе путь через десятки файлов шаблонов. Предопределенный список макетов (только D7) доступен для еще большего удовольствия от перетаскивания!


Это хороший модуль, но, к сожалению, он, кажется, только предлагает контроль над полями, не относящимися к заголовку, поэтому здесь нет никакой помощи. Спасибо все равно.
irishbuzz

На самом деле это не так, вам просто нужно установить все необходимые модули: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
расшифровать

@Decipher: установка 3 модулей для перемещения тега изображения над тегом h2? Вы, должно быть, шутите, верно :)
berkes

@berkes - Если вы устанавливаете Drupal для отображения одной веб-страницы, вы, должно быть, шутите, да? Я хочу сказать, что с этими установленными модулями вы можете сделать так много, так же, как с Drupal вы можете сделать так много, но вы также можете использовать его для решения черных задач.
Расшифровка

@ Decipher: Конечно, установка универсальных модулей открывает новые возможности для вашего сайта. Но плохой совет - устанавливать представления, view-gallery, cck, filefiend и image-field, чтобы просто отображать ряд изображений. Было бы неплохо посоветовать, если views, cck и остальные будут использоваться не только для этого списка изображений. Но ОП вообще не упоминала об этом.
Беркес

8

Посмотрите на модуль Title - http://drupal.org/project/title . Это может оказаться полезным для вашего сценария. По какой-то причине я установил / включил его, вероятно, похожий на ваш, и это, казалось, давало гибкость в размещении поля заголовка.

С тех пор я отключил его (и использую Display Suite), поэтому мой отзыв может быть немного отрывочным.


5

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

Вы можете использовать, page.tpl.phpчтобы полностью удалить печать $titleи добавить новое настраиваемое поле с именем Title с именем машины $ new_title или что-то в этом роде. Затем при редактировании узла скройте исходное поле «Заголовок», а на узле «Сохранить» используйте Computed Field или какой-либо другой пользовательский php, чтобы скопировать его $new_titleв $title.

После всего этого напишите css, чтобы $ new_title выглядел так же, как и заголовок страницы, и вы сможете размещать любые поля в любом порядке, просто перетаскивая их на экране управления полями. Поскольку вы скопировали $new_titleв $title, заголовок страницы в панели браузера все равно должен работать, и ничто не должно жаловаться на отсутствующие заголовки узлов.

Как я уже сказал, это взломать - но это будет работать. Дайте мне знать, если вам нужно больше информации


1
Спасибо за предложение Фредерик. Как вы указываете, это далеко от идеала, но выглядит как один из немногих возможных обходных путей. Я добавлю к вашему решению, предложив использовать модуль auto_nodetitle при использовании этого подхода. Я пока оставлю этот вопрос открытым, так как я действительно надеюсь, что есть какой-то лучший способ, и я могу начать вознаграждение. +1 за ваши усилия все равно.
irishbuzz

4

page.tpl.php (гирлянда)

...
      <div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
          <?php print $breadcrumb; ?>
          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          /*
           * Print custom block or var
           */
          <?php if ($custom_block): print '<div id="custom-block" class="clear-block">'. $custom_block .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
          <?php if ($show_messages && $messages): print $messages; endif; ?>
          <?php print $help; ?>
          <div class="clear-block">
            <?php print $content ?>
          </div>
          <?php print $feed_icons ?>
          <div id="footer"><?php print $footer_message . $footer ?></div>
      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
...

template.php

/**
 * Override or insert variables into the page template.
 */
function phptemplate_preprocess_page(&$variables) {
  $node = $variables['node'];
  if($node->type == MY_NODE_TYPE) {
    $variables['custom_block'] = 'bla bla bla';
  }
}

Я не уверен, что слежу за тем, что здесь происходит, поскольку первый фрагмент кода мало указывает на то, что является новым и что существует. Я также использую тему Zen, а не Garland, хотя необходимые изменения должны быть похожими. Во втором фрагменте кода вы вызываете hook_preprocess_page ()? Можете ли вы расширить с более конкретным примером?
irishbuzz

Во втором коде мы должны были определить новую переменную «custom_block». Посмотрите на часть первого кода, где мы печатаем «custom_block». <? php if ($ custom_block): print '<div id = "custom-block" class = "clear-block">'. $ custom_block. '</ div>'; ENDIF; ?> Просто определите правила для генерации этой переменной. Так? :)
доберман

4

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


Я все еще друпал, не мог бы ты объяснить, что ты имеешь в виду?
Кенни Уайлэнд

3

Я думаю, что вы должны использовать функции preprocess в вашем template.php

/**
 * Override or insert variables into the page template.
 */
function THEMENAME_process_page(&$variables) {
  // look for $variables['page_title'] if i remember
}

И как дополнительный

/**
 * Override or insert variables into the node template.
 */
function THEMENAME_preprocess_node(&$variables) {
  //
}

сбросьте переменные и делайте все что хотите. добавление / удаление / обновление.


1
Эти функции не изменяют порядок вывода полей заголовка и других узлов. Для этого вы должны изменить файл шаблона.
kiamlaluno

Я понял. Я думал, что вы хотели бы добавить значение поля в заголовок.
Доберман

3

Я решил эту проблему с помощью решения без кода, используя Display Suite и его функцию «Region to Block». Мне больше всего нравится это решение за его гибкость.

По сути, включите дополнительную часть «Регион для блокировки», включите отображение «Полнотекстовое содержимое» в Display Suite. (при условии, что вы хотите отобразить содержимое над заголовком в полноэкранном режиме, вы также можете использовать его для любого другого режима просмотра, кроме По умолчанию). Теперь в части «Управление отображением» в «Полнотекстовом контенте» внизу экрана должна появиться вкладка «Блокировать регионы». Введите там новое имя блока, сохраните и перетащите нужные поля в этот блок. Наконец, переместите новый созданный блок на экране блоков где-то выше заголовка узла.

Вы можете посмотреть видео с таким же подходом здесь: http://www.youtube.com/watch?v=y4wyjxyhbNA , конечно же, вам нужно поместить блок над заголовком (не на левую боковую панель) в конце.


2

Для дзен шаблонов ниже код работает для меня.

<?php
// this goes in template.php
// check if node type page and then add to $vars array
// declaring $vars['foo'] gives you a $foo variable to use in page.tpl.php

function YOURTHEMENAME_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) :
        if($vars['node']->type == 'page'):       
            $node = node_load($vars['node']->nid);
            $output = field_view_field('node', $node, 'field_image', array('label' => 'hidden'));       
            $vars['my_image_field'] = $output;               
        endif;
    endif;
}
?>

Итак, наконец, вы можете легко напечатать свое поле в page.tpl.php;

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>

Что касается page.tpl.php, я получал предупреждение о неопределенной переменной с этим с Business Responsive Theme, но когда я удалил условное выражение, оно работает нормально. Другими словами, я изменил <? Php if ($ my_image_field): print render ($ my_image_field); ENDIF; ?> to <? php print render ($ my_image_field); ?> Который, кажется, не выбрасывает предупреждения на всех моих страницах.
Эми Нибель

2

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

Мои предложения всем разработчикам, строящим тему на Drupal 7, будут состоять в использовании: Omega theme + Context и Delta modules. Это дает очень прочную основу для вашего макета.

И гибкость в расположении регионов, блоков и полей.


1

Вы можете сделать это с модулем панелей


Старый ответ здесь, но это поймал флаг. Было бы лучше немного объяснить, как панели могут быть использованы в этой ситуации.
mpdonadio

Панели огромные накладные расходы для просто перемещения поля в другую позицию.
Акко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.