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

Я ищу рендеринг определенного поля перед заголовком узла при отображении тизера в D7.

Фактически я хочу перейти из этого в this .

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

Любые предложения?

39 голосов | спросил irishbuzz 29 MarpmTue, 29 Mar 2011 14:18:52 +04002011-03-29T14:18:52+04:0002 2011, 14:18:52

11 ответов


52

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

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

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

& л; DIV >
  <h2> <? php print $ title; ? > & Lt; /h2 >
  <div class = "content">
    <? php print render ($ content); ? >
  & Lt; /дел >
& Lt; /дел >

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

& л; DIV >
  <? php print render ($ content ['field_name_of_image']); ? >
  <h2> <? php print $ title; ? > & Lt; /h2 >
  <div class = "content">
    <? php print render ($ content); ? >
  & Lt; /дел >
& Lt; /дел >

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

ответил googletorp 1 PMpFri, 01 Apr 2011 16:47:05 +040047Friday 2011, 16:47:05
9

Display Suite также довольно круто.

  

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

ответил stevepurkiss 29 MarpmTue, 29 Mar 2011 14:42:29 +04002011-03-29T14:42:29+04:0002 2011, 14:42:29
8

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

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

ответил Greta 26 J0000006Europe/Moscow 2012, 21:31:45
5

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

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

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

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

ответил Frederik 29 MarpmTue, 29 Mar 2011 14:38:45 +04002011-03-29T14:38:45+04:0002 2011, 14:38:45
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; ? >

          /*
           * Печатать пользовательский блок или 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 '<class class = "tabs primary">'. $ tabs. '</ul> </div>'; ENDIF; ? >
          <? php if ($ tabs2): print '<class class = "tabs secondary">'. $ tabs2. '</ul>'; ENDIF; ? >
          <? php if ($ show_messages & $ messages): print $ messages; ENDIF; ? >
          <? php print $ help; ? >
          <div class = "clear-block">
            <? php print $ content?>
          & Lt; /дел >
          <? php print $ feed_icons?>
          <div id = "footer"> <? php print $ footer_message. $ footer?> </div>
      & Lt; /дел > & Lt; /дел > & Lt; /дел > & Lt; /дел > <! - /.left-corner, /.right-corner, /# squeeze, /# center ->
...

template.php

/**
 * Переопределить или вставить переменные в шаблон страницы.
 * /
function phptemplate_preprocess_page (& $ variables) {
  $ node = $ variables ['node'];
  if ($ node-> type == MY_NODE_TYPE) {
    $ variables ['custom_block'] = 'bla bla bla';
  }
}
ответил dobeerman 30 MaramWed, 30 Mar 2011 02:59:02 +04002011-03-30T02:59:02+04:0002 2011, 02:59:02
4

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

ответил brad 28 MaramWed, 28 Mar 2012 04:06:37 +04002012-03-28T04:06:37+04:0004 2012, 04:06:37
3

Я думаю, вам следует использовать функции препроцесса в файле template.php

/**
 * Переопределить или вставить переменные в шаблон страницы.
 * /
функция THEMENAME_process_page (& $ variables) {
  //искать переменные $ ['page_title'], если я помню
}

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

/**
 * Переопределить или вставить переменные в шаблон узла.
 * /
функция THEMENAME_preprocess_node (& $ variables) {
  //
}

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

ответил dobeerman 29 MarpmTue, 29 Mar 2011 14:38:54 +04002011-03-29T14:38:54+04:0002 2011, 14:38:54
3

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

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

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

ответил Mirsoft 16 J000000Tuesday13 2013, 17:01:18
2

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

& л;? PHP
//это идет в template.php
//проверяем страницу типа узла, а затем добавляем в массив $ vars
//Объявление $ vars ['foo'] дает вам переменную $ foo для использования в page.tpl.php

функция 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;
? >
ответил user991554 24 MonEurope/Moscow2012-12-24T14:08:35+04:00Europe/Moscow12bEurope/MoscowMon, 24 Dec 2012 14:08:35 +0400 2012, 14:08:35
2

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

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

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

ответил AnAnD 24 MonEurope/Moscow2012-12-24T14:52:05+04:00Europe/Moscow12bEurope/MoscowMon, 24 Dec 2012 14:52:05 +0400 2012, 14:52:05
1

Вы можете сделать это с помощью панельного модуля

ответил houmem 18 32015vEurope/Moscow11bEurope/MoscowWed, 18 Nov 2015 10:15:26 +0300 2015, 10:15:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132