it-swarm.com.de

Ansichten - Fügen Sie einen Wrapper um Felder oder Zeilen hinzu

Beispiel:

Ich habe eine Ansicht mit Feldern:

[field_name]    == Field collection item: Name
[field_title]   == Field collection item: Title
[field_text]    == Field collection item: Text

Ich kann diese Felder umbrechen, indem ich die ersten beiden von der Anzeige ausschließe und die Ausgabe des dritten Felds mit Token neu schreibe, zum Beispiel:

<div class="span4">
    <div class="some_style">
        <blockquote>[field_text]</blockquote>
        <h5>[field_name] // [field_title]</h5>
    </div>
</div>

Es scheint ein bisschen schwierig zu sein, deshalb hier meine erste Frage:

Gibt es ein Modul oder nur eine andere Möglichkeit, Felder in Ansichten zu verpacken?

Ich weiß Semantic Views Modul, das das Problem löst, aber es gibt keine empfohlenen Releases für Drupal 7.

Frage 2

Alle meine Felder werden wie im oben genannten Beispiel in ihr div eingeschlossen, aber dies ist nur die eine Zeile, und ich habe mehrere Zeilen. Ich muss sie alle in eine andere Div einwickeln.

Muss ich nur dafür eine Ansichtsvorlagendatei erstellen? die zum Beispiel enthält:

<?php if($rows): ?>
    <div class="rows">
        <?php print $rows; ?>
    </div>
<?php endif; ?>

Ich habe das Gefühl, dass ich etwas vermisse, wenn ich eine spezielle Vorlagendatei nur für einen Wrapper erstellen muss.

5
Jack-PL

Ich denke, es ist ziemlich sicher zu sagen, dass die meisten Leute Ihre beiden Fragen mit den Cascading-Funktionen von CSS beantworten.

Das HTML einer typischen Ansicht sieht beispielsweise folgendermaßen aus:

<div class="view view-NAME view-id-VIEWID view-display-id-VIEW-DISPLAY-id">
  <div class="view-content">
    <div class="views-row views-row-1 views-row-odd views-row-first">
      <div class="views-field views-field-FIELDNAME1">
        <span class="field-content">
           <!-- field content here -->
        </span>
      </div>
      <div class="views-field views-field-FIELDNAME2">
        <span class="field-content">
           <!-- field content here -->
        </span>
      </div>
    </div>
    <div class="views-row views-row-2 views-row-even">
     <!-- etc etc etc -->
    </div>
  </div>
</div>

Bei Ihrer ersten Frage erstellt Views bereits ein Div, das jede Zeile umschließt. Das ist das <div class="views-row ..."> einer. Sie können es pro Ansicht formatieren, indem Sie Folgendes tun:

.view-NAME .views-row {
  /* styles for the rows div goes here */
}

Und zu Ihrer zweiten Frage erstellt Views auch bereits ein <div> das alle Zeilen umschließt, das ist das <div class="view-content"> einer. Um es für eine bestimmte Ansicht zu gestalten, können Sie Folgendes tun:

.view-NAME .view-content {
  /* styles for the div wrapping your rows goes here */
}

Nun, etwas offensichtlich, hängt dies alles von Ihrem Thema ab. Ich bin mir bewusst, dass einige da draußen nicht alle Markups mögen Drupal erstellt standardmäßig viele der Standardvorlagen und hat sie überschrieben, um schlankere Markups zu erstellen.

Wenn dies in Ihrer Instanz der Fall ist, sollten Sie Views dennoch anweisen, jeder Zeile eine Klasse hinzuzufügen, wenn Sie möchten. Der Zugriff erfolgt über die allgemeinen Stileinstellungen (wo Sie auch jede Ansichtsvorlage anzeigen können, die für die jeweilige Ansicht verwendet wird).

Sie können Views auch anweisen, jedem Feld-Wrapper eine Klasse hinzuzufügen. Auf dieses wird über jedes Konfigurations-Widget zugegriffen.

ZUSATZ basierend auf Kommentar:

Die Ansichtsvorlage, mit der die Ausgabe des Ansichtsinhalts div erstellt wird, lautet views-view.tpl.php und der fragliche Code lautet:

<?php if ($rows): ?>
  <div class="view-content">
    <?php print $rows; ?>
  </div>
<?php elseif ($empty): ?>
  <div class="view-empty">
    <?php print $empty; ?>
  </div>
<?php endif; ?>

ohne dies zu ändern, haben Sie Recht. Views ermöglicht keine schnelle und einfache Vorverarbeitung der View, um andere Variablen in die Klassen dieses Divs einzufügen.

Sie können jedoch die Vorverarbeitungs-Hooks von Views verwenden, um eine zusätzliche Variable zu erstellen, sodass Sie nicht viele zusätzliche Vorlagen erstellen müssen, sondern nur eine weitere.

Kopieren Sie beispielsweise views-view.tpl.php zu Ihrem Thema (am einfachsten) oder Modul (erfordert spezielle Beschwörungsformeln für Views-Themen :) und ändern Sie es wie folgt:

<?php if ($rows): ?>
  <div class="view-content <?php print $my_special_content_class; ?>">
    <?php print $rows; ?>
  </div>
<?php elseif ($empty): ?>
  <div class="view-empty">
    <?php print $empty; ?>
  </div>
<?php endif; ?>

erstellen Sie anschließend einen Hook für die Vorverarbeitung von Ansichten in dieser Richtung:

function YOURTHEMEORMODULE_preprocess_views_view(&$vars) {

  $name=$vars['name'];
  $display_id=$vars['display_id'];

  if ($name=='VIEWYOUWANT' && $display_id=='DISPLAYYOUWANT') {
    $vars['my_special_content_class']='FOO';
  } else {
    $vars['my_special_content_class']=''; // so we don't have to isset() or !empty() it in our template :)
  }

}

Speichern Sie alles und leeren Sie Ihren Themen-Cache. Jetzt sollten Sie auf dem Weg sein.

ZWEITE ERGÄNZUNG:

Nach weiteren Überlegungen und einem 'doh!' Momentan können Sie dies ohne Vorlage in einem Vorprozess wie diesem tun:

function YOURTHEME_preprocess_views_view(&$vars) {

  $name=$vars['name'];
  $display_id=$vars['display_id'];

  if ($name=='VIEWYOUWANT' && $display_id=='DISPLAYYOUWANT') {
    $vars['rows']='<div class="FOO">' . $vars['rows'] . '</div>';
  }

}

wenn es dir nichts ausmacht, wenn ein anderer Div da drin ist. Und ich denke, Sie müssen/sollten dies in Ihrem Thema anstelle eines Moduls tun, damit Sie sicherstellen, dass dies in der richtigen Reihenfolge geschieht, z. B. möchten Sie, dass dies geschieht, nachdem Ansichten und Dinge mit den Dingen und dem Thema gesagt und getan wurden Hooks laufen immer nach den Modul-Hooks.

5
Jimajamma

Sie können auch die Funktion rewrite in der Ansicht verwenden.

Angenommen, Sie haben field_name, field_title und field_text und Sie möchten ein div mit einer Klasse namens content um diese hinzufügen:

  1. Klicken Sie in der Ansicht unter FIELDS auf field_name
  2. Scrollen Sie nach unten zu REWRITE RESULTS und prüfe Rewrite the output of this field
  3. Geben Sie in das angezeigte Textfeld etwas wie <div class="content">[field_name] BEACHTE , dass du das div nicht schließen sollst
  4. Speichern Sie das Feld
  5. Klicken Sie unter FIELDS auf field_text
  6. Scrollen Sie nach unten zu REWRITE RESULTS und prüfe Rewrite the output of this field
  7. Geben Sie in das angezeigte Textfeld </div>DIES SCHLIESST DEN INHALT DIV
  8. Speichern Sie Ihr Feld

Ich denke, dass das oben Genannte nicht immer funktioniert, je nachdem, welche Art von Wrapper-Elementen Ihr Feld hat.

1
Cyclonecode

Sie können Ansichtsfeld- oder Zeilenvorlagen verwenden, müssen jedoch für jedes Feld eine Vorlage erstellen.

Vielleicht hilft dir das Seite . Hier ist der Beispielcode:

<?php
/**
  * Generic preprocess that is still working on D7
  */
function MYTHEME_preprocess_views_view_fields(&$vars) {
  if (isset($vars['view']->name)) {
    $function = __FUNCTION__ . '__' . $vars['view']->name . '__' . $vars['view']->current_display;

    if (function_exists($function)) {
     $function($vars);
    }
  }
}

/**
  * Then the specific preprocess that worked without the above code for D6
  */
function MYTHEME_preprocess_views_view_fields__VIEWNAME__DISPLAY(&$vars) {
  // my specific preprocess code
}
?>

Verwandte: Spezifische Vorverarbeitungsfunktionen für Themen-Hook-Vorschläge werden nicht aufgerufen bei Drupal.org

0
smile

Versuchen Sie das Modul Views Rows Wrapper . Es umschließt alle N Zeilen mit dem Div/Span-Element mit einem benutzerdefinierten Klassen- oder ID-Namen.

0
JetSet

Um field_collections vorzuverarbeiten und die Ausgabe zu überschreiben, versuchen Sie das folgende Beispiel unter dropbucket , das Ihnen einen praktischen Ausschnitt von @ dane gibt:

function mytheme_preprocess_field(&$vars) {
  if($vars['element']['#field_name'] == "field_your_fc_field"){
    $fcs = array();
    foreach (element_children($vars['element']) as $key) {
      $fcs[] = array_pop($vars['element'][$key]['entity']['field_collection_item']);
    }
    // now you have all your fcs pulled out of that nasty array
    foreach ($fcs as $fc) {
      # code... that 
    }

    // I would recommend overrideing items markup for whatever black magic you desire
    $vars['items'] = array(
      '#markup' => "Whatever you need to render",
    );  
  }
}
0
kenorb

Um Feldern wie der Feldsammlung einen Wrapper hinzuzufügen, sollten Sie die Logik in hook_preprocess_HOOK (wo HOOK sein kann views_view_field ), machen Sie diese Variablen dann in einer Vorlagendatei verfügbar, zum Beispiel:

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_views_view_field(&$vars) {
  $view = $vars['view'];
  switch ($view->name) {
    case 'my_view':
      $node = entity_metadata_wrapper('node', $vars['row']->nid);
      $vars['name']  = $node->field_name->value();
      $vars['title'] = $node->field_title->value();
      $vars['text']  = $node->field_text->value();
    break;
  } // end: switch
}

Jetzt können Sie diese Variablen in der Vorlagendatei verwenden ($name, $title und $text), damit Sie es leicht einwickeln können.

0
kenorb

Sie können auch Semantic Views verwenden.

Mit diesem Ansichts-Plugin können unformatierte Stile, Feldzeilenstile und andere Ausgaben einfacher konfiguriert werden, ohne dass Vorlagendateien überschrieben werden müssen. Anstatt Zeilenstilvorlagen für Ansichten zu überschreiben, in denen Sie verschiedene HTML-Elemente (Tags) und Klassenattribute angeben möchten, können Sie diese in der Benutzeroberfläche von Ansichten angeben und das Überschreiben von Vorlagen für jede Ansicht vermeiden.

0
Sunil