Як відобразити поле перед назвою вузла?


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 це так само просто, чисто і приємно. Просто, що це теж можливо .
berkes

@googletorp чи є спосіб надрукувати поле у ​​page.tpl.php?
CocoSkin

9

Дисплей-люкс теж досить крутий.

Дисплейний пакет дозволяє вам повністю контролювати спосіб відображення вашого вмісту за допомогою інтерфейсу перетягування. Впорядкуйте свої вузли, представлення даних, коментарі, дані користувачів тощо так, як вам потрібно, без необхідності працювати через десятки файлів шаблонів. Заздалегідь визначений список макетів (лише D7) доступний для ще більше задоволення від перетягування!


Це крутий модуль, але, на жаль, він здається, що він пропонує лише керувати полями без заголовка, тому тут немає ніякої допомоги. Дякую всім однаково.
irishbuzz

Насправді це неправда, вам просто потрібно встановити всі необхідні модулі: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Дешифрувати

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

@berkes - Встановлюючи Drupal для відображення однієї веб-сторінки, ви маєте жартувати, правда? Моя думка, що з встановленими модулями ви можете зробити так багато, як і з Drupal, ви можете зробити так багато, але ви також можете використовувати його для вирішення найголовнішого завдання.
Розшифровка

@Decipher: Безперечно, встановлення загальних модулів приносить нові можливості на ваш сайт. Але погано радимо встановлювати перегляди, галерею перегляду, cck, filefiend та поле зображення, щоб просто відображати ряд зображень. Було б радимо, якщо представлення, cck та інше будуть використані для більше, ніж лише цей список зображень. Але ОП про це взагалі не згадували.
berkes

8

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

З тих пір я його відключив (і використовую Display Suite), тому моє відкликання може бути дещо схематичним.


5

Це хакітське рішення, і я впевнений, що хтось придумає щось більш елегантне, але на випадок, коли ви застрягли, і ніхто цього не робить ...

Ви можете взагалі page.tpl.phpвидалити друк $titleі додати нове користувацьке поле під назвою Title з назвою машини $ new_title або щось подібне. Потім на вузол редагування, приховати оригінальний заголовок вікна, а на вузлі Зберегти використання комп'ютерної поля або деякі призначені для користувача 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';
  }
}

Я не впевнений, що я слідкую за тим, що відбувається тут, оскільки перший фрагмент коду мало вказує на те, що є нового і що існує. Я також використовую тему дзен, а не Гарленд, хоча необхідні зміни повинні бути схожими. У другому фрагменті коду ви викликаєте прив'язку_preprocess_page ()? Чи можете ви розширити більш конкретний приклад?
irishbuzz

У другому коді ми визначили нову змінну 'custom_block'. Подивіться на частину першого коду, де ми друкуємо «custom_block». <? php if ($ custom_block): print '<div id = "custom-block" class = "clear-block">'. $ custom_block. '</div>'; ендіф; ?> просто визначте правила для створення цієї змінної. Тому? :)
dobeerman

4

Це не стосується питання Teaser в оригінальній публікації, але для людей, які натрапляють на це і просто хочуть, щоб це сталося в повному обсязі, ось варіант без коду: відображати поле в блоці (використовуючи представлення, наприклад) і розмістіть цей блок над блоком вмісту, але в тому самому регіоні.


Я досі drupal n00b, ти можеш пояснити, що ти маєш на увазі?
Кенні Віланд

3

Я думаю, вам слід використовувати функції попередньої обробки у вашому 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

Я бачу. Я думав, що ви хочете додати значення поля до заголовка.
dobeerman

3

Я вирішив це рішенням без коду, використовуючи програму Display Suite та його додаткову функцію "Region to Block". Найбільше мені подобається це рішення за його гнучкість.

По суті, увімкніть додаткову частину "Регіон до блоку", увімкніть відображення "Повнотекстового вмісту" в Набір екранів. (якщо припустити, що ви хочете відобразити вміст над заголовком у повноекранному дисплеї, аналогічно ви можете використовувати його для будь-якого іншого режиму перегляду, крім замовчування). Тепер у частині "Керування дисплеєм" частини "Повнотекстового вмісту" в нижній частині екрана повинна з'явитися вкладка "Блокувати регіони". Введіть туди нове ім'я блоку, збережіть і перетягніть потрібні поля до цього блоку. Нарешті, перемістіть новостворений блок на екрані "Блоки" десь над заголовком вузла.

Ви можете переглянути відео з таким же підходом тут: 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, я отримував попередньо визначене змінне попередження щодо цього з діловою чутливою темою, але коли я видалив умовне, воно працює добре. Іншими словами, я змінив <? Php if ($ my_image_field): print render ($ my_image_field); ендіф; ?> до <? php візуалізація друку ($ my_image_field); ?> Що, здається, не кидає жодних попереджень на всі мої сторінки.
Емі Нібель

2

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

Мої пропозиції для всіх розробників, що будують тему на Drupal 7, будуть: використовувати тему Omega + модулі контексту та Delta. Це дає дуже сильну основу для вашого планування.

І гнучкість в облаштуванні регіонів, блоків та полів.


1

Можна виконати модуль панелей


Тут відповідь стара, але цей спіймав прапор. Було б краще трохи пояснити, як можна використовувати панелі в цій ситуації.
mpdonadio

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