Wie zeige ich ein Feld vor dem Knotentitel an?

41

Beim Anzeigen eines Teasers in D7 möchte ich ein bestimmtes Feld vor dem Knotentitel rendern.

Eigentlich möchte ich von hier zu hier gehen .

Ich habe versucht, die node.tpl.php zu aktualisieren, aber ich stelle fest, dass sie sich $titlevon der node.tpl.php trennt $content, und bin mir nicht sicher, wie ich das angehen soll. Nach einiger Suche habe ich festgestellt , dass Menschen mit vorgeschlagen haben , CCK und in Erwägung zieht diese in Drupal-6 - Module zu umgehen , aber ich frage mich , ob es eine Drupal-7 - Lösung ist.

Irgendwelche Vorschläge?

irishbuzz
quelle
Abgesehen von allen PHP-basierten Template-Lösungen können Sie auch einen langen Weg nur mit CSS zurücklegen. Negative Margen können viel bewirken. In Ihrem jsfiddle Beispiel würde es aussehen wie diese .
Marcvangend
Ich hatte darüber nachgedacht, aber was passiert bei langen Titeln ?
Irishbuzz
Sie haben vollkommen recht, dies funktioniert nur, wenn der Titel eine feste Höhe hat. Wie jede Lösung hat sie ihre Schwachstellen. Persönlich denke ich, dass (unabhängig von dem verwendeten Design und der verwendeten Technologie) lange Titel vermieden werden sollten, indem die Redakteure geschult werden, aber mir ist klar, dass dies nicht immer eine Option ist.
Marcvangend

Antworten:

53

Mit Drupal 7 ist das ganz einfach.

Mit renderund haben hideSie die Möglichkeit, die Platzierung eines einzelnen Elements zu steuern, $contentohne alle in Drupal 6 benötigten Elemente selbst ausdrucken zu müssen.

Eine vereinfachte Knotenvorlage sieht folgendermaßen aus:

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

Eine kleine Modifikation würde Ihre Bedürfnisse erfüllen:

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

Mit renderkönnen Sie ein Element ausgeben. Dies ist schlauer als das einfache Drucken von Inhalten, da Drupal den Überblick über die gerenderten Inhalte behält, um zu vermeiden, dass dasselbe Objekt zweimal auf der Stelle gedruckt wird. Wenn Sie das Feld über dem Titel rendern, entfernen Sie auch, was gerendert wird, wenn $contentgerendert wird.

googletorp
quelle
2
Sehr schön. In einer idealen Welt ist es vielleicht besser, Drupal anzuweisen, das Titelfeld wie jedes andere Feld zu behandeln, aber zumindest in Drupal 7 haben wir einfache Lösungen wie diese. Ein dickes Lob an @googletorp!
Irishbuzz
Für das Protokoll: Dies unterscheidet sich kaum von Drupal6, im Gegensatz zu dem, was der obige Kommentar andeutet.
Berkes
1
@berkes: Wenn Sie Felder in D6 einzeln ausdrucken, müssen Sie die Knotenvorlage pflegen und den Code bearbeiten, um neue Felder hinzufügen zu können. Dies ist ein großer Unterschied zu D7, bei dem Sie weiterhin Felder hinzufügen und diese auch über die Benutzeroberfläche sortieren können.
googletorp
rendern ist ja neu. Aber das Konzept ist nicht. Es gibt mehrere Tricks, um dasselbe zu erreichen. Ich wollte damit nicht sagen, dass dies in Drupal6 genauso einfach, sauber und schön ist. Nur dass es auch möglich ist.
Berkes
@googletorp gibt es eine Möglichkeit, ein Feld in page.tpl.php zu drucken?
CocoSkin
9

Die Display Suite ist auch ziemlich cool.

Mit der Display Suite können Sie über eine Drag & Drop-Oberfläche die vollständige Kontrolle über die Anzeige Ihrer Inhalte übernehmen. Ordnen Sie Ihre Knoten, Ansichten, Kommentare, Benutzerdaten usw. so an, wie Sie möchten, ohne sich durch Dutzende von Vorlagendateien arbeiten zu müssen. Eine vordefinierte Liste von Layouts (nur D7) sorgt für noch mehr Drag & Drop-Spaß!

stevepurkiss
quelle
Es ist ein cooles Modul, aber leider bietet es nur die Kontrolle für Nicht-Titel-Felder, also keine Hilfe. Trotzdem vielen Dank.
Irishbuzz
Eigentlich stimmt das nicht, Sie müssen nur alle erforderlichen Module installieren: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Decipher
@Decipher: Installieren von 3 Modulen, um ein Image-Tag über das H2-Tag zu verschieben? Sie müssen
Spaß machen
@berkes - Wenn Sie Drupal installieren, um eine Webseite anzuzeigen, machen Sie wohl Witze, oder? Mein Punkt ist, dass Sie mit diesen installierten Modulen so viel tun können, genau wie mit Drupal, aber Sie können es auch verwenden, um eine grundlegende Aufgabe zu lösen.
Entschlüsselung am
@Decipher: Die Installation generischer Module eröffnet Ihrer Site mit Sicherheit neue Möglichkeiten. Es ist jedoch nicht ratsam, Ansichten, Bildergalerien, cck, filefiend und image-field zu installieren, um einfach eine Reihe von Bildern anzuzeigen. Es wäre ratsam, wenn Ansichten, cck und der Rest für mehr als nur diese Bilderliste verwendet werden. Das OP erwähnte dies jedoch überhaupt nicht.
Berkes
8

Schauen Sie sich das Titelmodul an - http://drupal.org/project/title . Dies könnte sich für Ihr Szenario als nützlich erweisen. Ich habe es aus irgendeinem Grund installiert / aktiviert, wahrscheinlich ähnlich wie bei Ihnen, und es schien Flexibilität zu geben, wie das Titelfeld platziert werden soll.

Ich habe es seitdem deaktiviert (und benutze Display Suite), daher ist mein Rückruf möglicherweise etwas lückenhaft.

Greta
quelle
5

Dies ist eine hackische Lösung, und ich bin sicher, dass sich jemand etwas Eleganteres einfallen lässt, aber für den Fall, dass Sie nicht weiterkommen und es niemandem gelingt ...

Sie können page.tpl.phpdas Drucken von $titleinsgesamt entfernen und ein neues benutzerdefiniertes Feld mit dem Namen "Titel" mit dem Computernamen "$ new_title" oder ähnlichem hinzufügen. Dann auf dem Knoten zu bearbeiten, zu verbergen den Original - Titel Feld und auf dem Knoten speichert Verwendung berechnetes Feld oder einige benutzerdefinierten PHP das kopieren $new_titlezu $title.

Nach alledem schreiben Sie ein paar CSS-Dateien, damit $ new_title so aussieht wie der Seitentitel zuvor und Sie sollten in der Lage sein, beliebige Felder in der von Ihnen gewünschten Reihenfolge zu platzieren, indem Sie sie einfach in den Bildschirm Felder verwalten ziehen und dort ablegen. Weil Sie kopiert $new_titlezu $title, sollte der Seitentitel in der Browserleiste noch Arbeit und nichts sollte über fehlende Knotentitel beschweren.

Wie ich schon sagte, es ist ein Hack - aber es würde funktionieren. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen

Frederik
quelle
1
Danke für den Vorschlag Frederik. Wie Sie angeben, ist es alles andere als ideal, sieht aber wie eine der wenigen möglichen Problemumgehungen aus. Ich werde Ihrer Lösung hinzufügen, indem ich vorschlage, das auto_nodetitle- Modul zu verwenden, wenn Sie diesen Ansatz wählen . Ich werde die Frage vorerst offen lassen, da ich wirklich hoffe, dass es einen besseren Weg gibt und ich vielleicht ein Kopfgeld anfangen kann. +1 für deine Mühe egal.
Irishbuzz
4

page.tpl.php (Girlande)

...
      <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
quelle
Ich bin mir nicht sicher, ob ich verstehe, was hier vor sich geht, da der erste Codeausschnitt nur einen geringen Hinweis darauf gibt, was neu und was vorhanden ist. Ich verwende auch das Zen-Thema anstatt Garland, obwohl die erforderlichen Änderungen ähnlich sein sollten. Rufen Sie im zweiten Code-Snippet eine hook_preprocess_page () auf? Können Sie mit einem konkreten Beispiel erweitern?
Irishbuzz
Im zweiten Code hatten wir eine neue Variable 'custom_block' definiert. Schauen Sie sich einen Teil des ersten Codes an, in dem "custom_block" gedruckt wird. <? php if ($ custom_block): print '<div id = "custom-block" class = "clear-block">'. $ custom_block. '</ div>'; endif; Definieren Sie einfach Regeln für die Generierung dieser Variablen. Damit? :)
Dobeerman
4

Dies gilt nicht für die Teaser-Frage im ursprünglichen Beitrag, aber für Personen, die über diese Frage stolpern und sie nur in der vollständigen Ansicht ausführen möchten, gibt es eine codefreie Option: Zeigen Sie das Feld in einem Block an (mithilfe von Ansichten, zum Beispiel) und platzieren Sie diesen Block über Ihrem Inhaltsblock, aber in derselben Region.

Brad
quelle
Ich bin immer noch ein Drupal n00b, kannst du erklären, was du meinst?
Kenny Wyland
3

Ich denke, Sie sollten Vorverarbeitungsfunktionen in Ihrer template.php verwenden

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

Und als Zusatz

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

Dump-Variablen und machen Sie alles, was Sie wollen. hinzufügen / entfernen / aktualisieren.

Dobeerman
quelle
1
Diese Funktionen ändern nicht die Reihenfolge, in der der Titel und andere Knotenfelder ausgegeben werden. Dazu sollten Sie die Vorlagendatei ändern.
kiamlaluno
Ich dachte, Sie möchten dem Titel einen Feldwert hinzufügen.
Dobeerman
3

Ich habe dieses Problem durch eine codefreie Lösung mit der Display Suite und der Funktion "Zu blockierende Regionen " behoben . Ich mag diese Lösung am meisten wegen ihrer Flexibilität.

Aktivieren Sie grundsätzlich den Extras-Teil "Region to Block" und aktivieren Sie die Anzeige "Volltextinhalt" in der Display Suite. (Angenommen, Sie möchten den Inhalt über dem Titel in der Vollknotenanzeige anzeigen, können Sie ihn auch für jeden anderen Ansichtsmodus außer Standard verwenden.) Nun sollte im Bereich "Anzeige verwalten" unter "Volltextinhalt" am unteren Bildschirmrand die Registerkarte "Blockregionen" angezeigt werden. Geben Sie dort einen neuen Blocknamen ein, speichern und ziehen Sie die gewünschten Felder per Drag & Drop in diesen Block. Verschieben Sie zuletzt den neu erstellten Block im Blockbildschirm irgendwo über den Knotentitel.

Sie können das Video des gleichen Ansatzes hier sehen: http://www.youtube.com/watch?v=y4wyjxyhbNA , natürlich müssen Sie den Block über dem Titel (nicht in der linken Seitenleiste) am Ende platzieren.

Mirsoft
quelle
2

Für Zen-Vorlagen funktioniert der folgende Code für mich.

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

Schließlich können Sie Ihr Feld ganz einfach in page.tpl.php ausdrucken.

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>
user991554
quelle
In Bezug auf die page.tpl.php habe ich mit Business Responsive Theme eine undefinierte Variablenwarnung erhalten, aber als ich die Bedingung entfernt habe, funktioniert sie einwandfrei. Mit anderen Worten, ich habe <? Php if ($ my_image_field) geändert: print render ($ my_image_field); endif; ?> nach <? php print render ($ my_image_field); ?> Welches scheint keine Warnungen über alle meine Seiten zu werfen.
Amy Niebel
2

Ich weiß, dass Sie bereits ein Thema zum Erstellen verwendet haben und jetzt versuchen, die Felder oben im Titel hinzuzufügen.

Meine Vorschläge an alle Entwickler, die ein Thema auf Drupal 7 erstellen, lauten: Omega-Thema + Kontext- und Delta-Module. Dies gibt eine sehr starke Grundlage für Ihr Layout.

Und Flexibilität bei der Anordnung von Regionen, Blöcken und Feldern.

UND
quelle
1

Sie können dies mit dem Modul Panels tun

houmem
quelle
Alte Antwort hier, aber das hat eine Fahne gefangen. Es ist besser zu erklären, wie Panels in dieser Situation verwendet werden können.
mpdonadio
Panels ist ein enormer Aufwand, um ein Feld in eine andere Position zu bewegen.
Akko