Jak wyświetlić pole przed tytułem węzła?

41

Chcę wyświetlić pewne pole przed tytułem węzła podczas wyświetlania zwiastuna w D7.

Skutecznie chcę przejść od tego do tego .

Patrzyłem na aktualizację node.tpl.php, ale zauważam, że różni się $titleod, $contentwięc nie jestem pewien, jak podejść do tego. Po kilku poszukiwaniach odkryłem, że ludzie zasugerowali użycie modułów CCK i ConTemplate , aby obejść ten problem w Drupal-6, ale zastanawiam się, czy istnieje inne rozwiązanie Drupal-7.

Jakieś sugestie?

irishbuzz
źródło
Oprócz wszystkich rozwiązań opartych na php, możesz przejść długą drogę tylko z CSS. Marże ujemne mogą wiele zdziałać. W twoim przykładzie jsfiddle wyglądałoby to tak .
marcvangend,
Zastanawiałem się nad tym, ale co się dzieje z długimi tytułami ?
irishbuzz,
Masz całkowitą rację, działa to tylko wtedy, gdy tytuł ma stałą wysokość. Jak każde rozwiązanie ma swoje słabe punkty. Osobiście uważam, że (niezależnie od projektu i technologii, której używasz) długie tytuły powinny być zapobiegane przez edukację redaktorów, ale zdaję sobie sprawę, że nie zawsze jest to opcja.
marcvangend,

Odpowiedzi:

53

Jest to naprawdę dość proste w przypadku Drupala 7.

Dzięki renderi hidewiesz, że masz możliwość kontrolowania umieszczenia pojedynczego elementu $contentbez konieczności drukowania wszystkich elementów, które były potrzebne w Drupal 6.

Uproszczony szablon węzła wygląda następująco:

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

Mała modyfikacja zaspokoi Twoje potrzeby:

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

Za pomocą rendermożesz wyprowadzić element. Jest to bardziej sprytne niż zwykłe drukowanie, ponieważ Drupal będzie śledził to, co zostało renderowane, aby uniknąć dwukrotnego wydrukowania tego samego miejsca. Podczas renderowania pola nad tytułem usuwasz również to, co jest renderowane podczas $contentrenderowania.

googletorp
źródło
2
Bardzo dobrze. W idealnym świecie lepiej byłoby po prostu powiedzieć Drupalowi, aby traktował pole tytułowe jak każde inne pole, ale przynajmniej w Drupal 7 mamy takie proste rozwiązania. Kudos @googletorp!
irishbuzz
Dla przypomnienia: nie różni się to niczym od Drupala6, w przeciwieństwie do tego, co sugeruje powyższy komentarz.
berkes
1
@berkes: Jeśli drukujesz pola indywidualnie w D6, musisz zachować szablon węzła i edytować kod, aby móc dodawać nowe pola. Jest to duża różnica w porównaniu do D7, w którym możesz ciągle dodawać pola i używać interfejsu użytkownika do ich sortowania.
googletorp
render jest rzeczywiście nowy. Ale jego koncepcja nie jest. Istnieje kilka sztuczek, aby osiągnąć to samo. Nie chciałem powiedzieć, że w Drupal6 jest to tak samo proste, czyste i miłe. Tylko, że jest to możliwe .
berkes
@googletorp jest sposób wydrukować pole w page.tpl.php?
CocoSkin,
9

Display Suite jest również całkiem fajny.

Display Suite pozwala przejąć pełną kontrolę nad sposobem wyświetlania treści za pomocą interfejsu przeciągnij i upuść. Ułóż swoje węzły, widoki, komentarze, dane użytkownika itp. Tak, jak chcesz, bez konieczności przeglądania dziesiątek plików szablonów. Wstępnie zdefiniowana lista układów (tylko D7) jest dostępna dla jeszcze większej zabawy z przeciąganiem i upuszczaniem!

stevepurkiss
źródło
To fajny moduł, w porządku, ale niestety wydaje się, że oferuje kontrolę tylko w polach nietytułowych, więc tutaj nie ma pomocy. Dziękuję mimo wszystko.
irishbuzz
Właściwie to nie jest prawda, wystarczy zainstalować wszystkie wymagane moduły: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Odcyfrowywanie
@Decipher: Instalujesz 3 moduły, aby przenieść znacznik obrazu nad znacznik h2? Pewnie żartujesz, prawda :)
berkes
@berkes - Instalując Drupala, aby wyświetlić jedną stronę, chyba żartujesz, prawda? Chodzi mi o to, że z zainstalowanymi modułami możesz zrobić tak wiele, podobnie jak Drupal, możesz zrobić tak wiele, ale możesz także użyć go do rozwiązania trudnego zadania.
Odszyfruj
@Decipher: Instalowanie ogólnych modułów zapewnia nowe możliwości w Twojej witrynie. Ale nie zaleca się instalowania widoków, galerii widoków, cck, przyjaźni plików i pola obrazu, aby po prostu wyświetlić rząd obrazów. Dobrze by było, gdyby widoki, cck i reszta były używane do więcej niż tylko tej listy obrazów. Ale OP w ogóle o tym nie wspomniał.
berkes
8

Zobacz moduł tytułu - http://drupal.org/project/title . Może się to przydać w twoim scenariuszu. Zainstalowałem / włączyłem go z jakiegoś powodu, prawdopodobnie podobnego do twojego, i wydawało się, że daje elastyczność w umieszczaniu pola tytułu.

Od tego czasu go wyłączyłem (i używam Display Suite), więc moje przypomnienie może być nieco szkicowe.

Greta
źródło
5

To hackish rozwiązanie i jestem pewien, że ktoś wymyśli coś bardziej eleganckiego, ale na wypadek, gdybyś utknął, a nikt nie ...

Możesz użyć page.tpl.phpdo $titlecałkowitego usunięcia drukowania i dodać nowe niestandardowe pole o nazwie Tytuł z nazwą komputera $ new_title lub coś w tym rodzaju. Następnie podczas edycji węzła ukryj oryginalne pole tytułu, a na węźle Zapisz użyj pola obliczeniowego lub niestandardowego php, aby skopiować $new_titleje $title.

Po tym wszystkim napisz trochę css, aby $ new_title wyglądał tak, jak poprzednio tytuł strony i powinieneś być w stanie umieścić dowolne pola w dowolnej kolejności, po prostu przeciągając i upuszczając na ekranie zarządzania polami. Ponieważ skopiowano $new_titledo $title, tytuł strony na pasku przeglądarki powinien nadal działać i nic nie powinno narzekać na brakujące tytuły węzłów.

Jak powiedziałem, jest to hack - ale zadziałałoby. Powiadom mnie, jeśli będziesz potrzebować więcej informacji

Frederik
źródło
1
Dzięki za sugestię Frederik. Jak wskazujesz, jest to dalekie od ideału, ale wygląda na jedno z niewielu możliwych obejść. Dodam do twojego rozwiązania, sugerując, że moduł auto_nodetitle powinien być używany, jeśli zastosujesz takie podejście. Na razie pozostawię pytanie otwarte, ponieważ mam nadzieję, że istnieje lepszy sposób i mogę rozpocząć nagrodę. +1 za twój wysiłek mimo wszystko.
irishbuzz
4

page.tpl.php (girlanda)

...
      <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';
  }
}
dobeerman
źródło
Nie jestem pewien, czy śledzę to, co się tutaj dzieje, ponieważ pierwszy fragment kodu niewiele wskazuje na to, co jest nowe i co istnieje. Używam również motywu Zen zamiast Garland, chociaż wymagane zmiany powinny być podobne. Czy w drugim fragmencie kodu wywołujesz funkcję hook_preprocess_page ()? Czy możesz rozwinąć się bardziej konkretnym przykładem?
irishbuzz
W drugim kodzie zdefiniowaliśmy nową zmienną „custom_block”. Spójrz na część pierwszego kodu, w której drukujemy „custom_block”. <? php if ($ custom_block): print '<div id = "custom-block" class = "clear-block">'. $ custom_block. '</div>'; endif; ?> po prostu zdefiniuj reguły generowania tej zmiennej. Więc? :)
dobeerman
4

To nie dotyczy pytania zwiastuna w oryginalnym poście, ale dla osób, które natkną się na to i chcą, aby stało się to w pełnym widoku, oto opcja bez kodu: wyświetl pole w bloku (używając widoków, na przykład) i umieść ten blok nad blokiem treści, ale w tym samym regionie.

ćwiek
źródło
Nadal jestem drupalem n00b, czy możesz wyjaśnić, co masz na myśli?
Kenny Wyland
3

Myślę, że powinieneś użyć funkcji wstępnego przetwarzania w pliku template.php

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

I jako dodatkowe

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

zrzucaj zmienne i rób co chcesz. dodaj / usuń / aktualizuj.

dobeerman
źródło
1
Funkcje te nie zmieniają kolejności wyświetlania tytułu i innych pól węzłów. W tym celu należy zmienić plik szablonu.
kiamlaluno
Rozumiem. Myślałem, że chciałbyś dodać wartość pola do tytułu.
dobeerman
3

Rozwiązałem to za pomocą bezkodowego rozwiązania za pomocą Display Suite i jego dodatkowej funkcji „Region to Block”. Najbardziej podoba mi się to rozwiązanie ze względu na jego elastyczność.

Zasadniczo włącz część „Region do blokowania” dodatków, włącz wyświetlanie „Treści pełnotekstowej” w Display Suite. (zakładając, że chcesz wyświetlać zawartość powyżej tytułu na ekranie z pełnym węzłem, podobnie możesz użyć jej w dowolnym innym trybie widoku oprócz Domyślnego). Teraz w części „Zarządzaj wyświetlaniem” w części „Treść pełnotekstowa” u dołu ekranu powinna pojawić się karta „Blokuj regiony”. Wpisz tam nową nazwę bloku, zapisz i przeciągnij i upuść żądane pola do tego bloku. Na koniec przenieś nowo utworzony blok na ekranie Bloki gdzieś powyżej tytułu węzła.

Możesz zobaczyć wideo z tego samego podejścia tutaj: http://www.youtube.com/watch?v=y4wyjxyhbNA , oczywiście musisz umieścić blok nad tytułem (nie na lewym pasku bocznym) na końcu.

Mirsoft
źródło
2

Dla szablonów zen poniższy kod działa dla mnie.

<?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;
}
?>

Wreszcie możesz łatwo wydrukować swoje pole w page.tpl.php;

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>
użytkownik991554
źródło
jeśli chodzi o page.tpl.php, otrzymałem niezdefiniowane ostrzeżenie o zmiennej z tym motywem Business Responsive, ale kiedy usunąłem warunek, działa dobrze. Innymi słowy, zmieniłem <? Php if ($ my_image_field): print render ($ my_image_field); endif; ?> do <? php print render ($ my_image_field); ?> Które wydaje się nie rzucać żadnych ostrzeżeń na wszystkie moje strony.
Amy Niebel
2

Wiem, że używałbyś już jakiegoś motywu do zbudowania i teraz próbujesz dodać pola u góry tytułu.

Moimi sugestiami dla wszystkich programistów budujących motyw na Drupal 7 byłoby użycie: motyw Omega + moduły kontekstowe i Delta. Daje to bardzo mocne podstawy dla Twojego układu.

I elastyczność w ustawianiu regionów, bloków i pól.

AnAnD
źródło
1

Możesz to zrobić za pomocą modułu paneli

houmem
źródło
Stara odpowiedź tutaj, ale to złapało flagę. Lepiej byłoby trochę wyjaśnić, w jaki sposób można użyć paneli w tej sytuacji.
mpdonadio
Panele to ogromne obciążenie, które wystarczy przesunąć pole w innej pozycji.
Akko