web-dev-qa-db-fra.com

Vues - Ajoutez un wrapper autour des champs ou des lignes

Exemple:

J'ai une vue avec des champs:

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

Je peux encapsuler ces champs en excluant de l'affichage des deux premiers d'entre eux et en réécrivant la sortie du troisième champ avec des jetons, par exemple:

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

Cela semble un peu délicat, alors voici ma première question:

Existe-t-il un module ou tout simplement une autre façon d'encapsuler les champs dans les vues?

Je sais Semantic Views module qui résout le problème, mais il n'y a pas de versions recommandées pour Drupal 7.

Question n ° 2

Tous mes champs sont enveloppés dans leur div comme dans l'exemple mentionné ci-dessus, mais ce n'est qu'une seule ligne et j'ai plusieurs lignes. J'ai besoin de les envelopper tous dans une autre div.

Dois-je créer un fichier de modèle de vue uniquement pour cela? qui contient par exemple:

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

J'ai l'impression de manquer quelque chose quand je dois créer un fichier de modèle spécial uniquement pour un wrapper.

5
Jack-PL

Je pense qu'il est assez sûr de dire que la plupart des gens répondent à vos deux questions en utilisant les fonctionnalités de cascade de CSS.

Par exemple, le code HTML d'une vue typique ressemble un peu à ceci:

<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>

Donc, à votre 1ère question, Views crée déjà un div qui enveloppe chaque ligne, c'est le <div class="views-row ..."> une. Vous pouvez le styliser par vue en faisant quelque chose comme ceci:

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

Et à votre deuxième question, Views crée également déjà un <div> qui enveloppe toutes les lignes, c'est le <div class="view-content"> une. Pour le styliser pour une vue particulière, vous pouvez faire quelque chose comme ceci:

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

Maintenant, un peu évidemment, tout dépend de votre thème. Je suis conscient que certains n'aiment pas tout le balisage Drupal crée par défaut et a remplacé de nombreux modèles standard pour créer un balisage plus léger.

Si c'est le cas dans votre instance, vous devez toujours demander à Views d'ajouter une classe à chaque ligne si vous le souhaitez. Il est accessible via les paramètres de style globaux (où vous pouvez également consulter chaque modèle de vues utilisé pour la vue particulière).

Vous pouvez également demander à Views d'ajouter une classe à chaque wrapper de champ. On y accède depuis le widget de configuration par chaque champ.

AJOUT basé sur les commentaires:

Le modèle de vues qui crée la sortie du div de contenu de vue est views-view.tpl.php et le code en question est:

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

donc sans changer cela, vous avez raison, les vues ne permettent pas un prétraitement rapide et facile de la vue pour insérer d'autres variables dans les classes de cette div.

Vous pouvez cependant utiliser les crochets de prétraitement de Views pour créer une variable supplémentaire afin que vous n'ayez pas besoin de créer de nombreux modèles supplémentaires, mais plutôt un de plus.

Par exemple, copiez views-view.tpl.php à votre thème (le plus simple) ou à votre module (nécessite des incantations spéciales du thème Vues :) et modifiez-le comme suit:

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

puis créez un crochet de prétraitement des vues selon ces lignes:

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 :)
  }

}

Enregistrez tout et videz votre cache de thème et maintenant vous devriez être sur votre chemin.

DEUXIÈME AJOUT:

Après réflexion, et un "doh!" moment, vous pouvez le faire sans aucun modèle dans un prétraitement comme celui-ci:

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

}

si cela ne vous dérange pas un autre div enveloppé là-dedans. Et, je pense que vous devrez/devriez le faire dans votre thème au lieu d'un module afin de vous assurer que cela se produit dans le bon ordre, par exemple, vous voulez que cela se produise après que les vues soient toutes dites et faites avec les choses, et le thème les hooks s'exécutent toujours après les hooks du module.

5
Jimajamma

Vous pouvez également utiliser la fonction rewrite dans la vue.

En supposant que vous avez field_name, field_title et field_text et vous souhaitez ajouter un div avec une classe appelée content autour de ceux-ci:

  1. Dans la vue sous FIELDS cliquez sur field_name
  2. Faites défiler jusqu'à REWRITE RESULTS et vérifie Rewrite the output of this field
  3. Dans la zone de texte qui apparaît, remplissez quelque chose comme <div class="content">[field_name] NOTEZ que vous ne devez pas fermer le div
  4. Enregistrez le champ
  5. Sous FIELDS cliquez sur field_text
  6. Faites défiler jusqu'à REWRITE RESULTS et vérifie Rewrite the output of this field
  7. Dans la zone de texte qui apparaît, entrez </div>CECI FERME LA DIV. DE CONTEN
  8. Enregistrez-vous sur le terrain

Je suppose que ce qui précède ne fonctionnera pas toujours en fonction du type d'éléments de wrapper que votre champ possède.

1
Cyclonecode

Vous pouvez utiliser des modèles de champs ou de lignes de vues, mais vous devrez créer un modèle pour chaque champ.

Peut-être que ceci page vous aidera. Voici l exemple de code:

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

Connexes: les fonctions de prétraitement spécifiques pour les suggestions de hook de thème ne sont pas invoquées sur Drupal.org

0
smile

Essayez le module Views Rows Wrapper . Il encapsule toutes les N lignes avec l'élément Div/Span avec un nom de classe ou d'ID personnalisé.

0
JetSet

Pour prétraiter field_collections et remplacer la sortie, essayez l'exemple suivant trouvé sur dropbucket qui vous donne un extrait pratique par @ dane :

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

Pour ajouter un wrapper à des champs tels que la collecte de champs, vous devez définir la logique dans hook_preprocess_HOOK (où HOOK peut être views_view_field ), puis exposez ces variables dans un fichier modèle, par exemple:

/**
 * 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
}

Vous pouvez maintenant utiliser ces variables dans le fichier modèle ($name, $title et $text), vous pouvez donc envelopper facilement.

0
kenorb

Vous pouvez également utiliser Vues sémantiques .

Ce plugin Views rend les styles non formatés, les styles de ligne de champ et d'autres sorties plus facilement configurables sans avoir à remplacer les fichiers de modèle. Au lieu de remplacer les modèles de style de ligne pour les vues dans lesquelles vous souhaitez spécifier différents éléments HTML (balises) et attributs de classe, vous pouvez les spécifier dans l'interface utilisateur des vues et éviter de remplacer les modèles pour chaque vue.

0
Sunil