2012-01-29 3 views
2

J'ai un type de contenu "Audio" qui comprend un champ de fichier audio. Ce champ accepte plusieurs valeurs, donc chaque nœud peut contenir n'importe quel nombre de fichiers audio. Habituellement, lorsque vous créez une vue de flux RSS, elle génère un <item> par nœud, et chacun d'eux aura plusieurs entrées <enclosure>, une par fichier audio. Mais pour mes besoins, j'ai besoin de l'affichage pour sortir un <item> séparé pour chacune des valeurs de fichier audio. Donc, si, par exemple, il y a 3 fichiers audio dans un nœud sélectionné, le nœud entier sera répété dans le flux 3 fois, et chacun contiendra une seule enceinte de fichiers audio.Drupal 7: Faire un flux RSS avec plusieurs <item> s par nœud?

La raison en est que dans mon cas spécifique, j'utilise hook_node_view() dans un module personnalisé pour ajouter des balises MRSS à chacun des nœuds générés par la vue. Donc, plutôt que les fichiers audio enveloppés par <enclosure>, ils seront enveloppés dans <media:content> tags. Conformément à la spécification MRSS, vous ne devez pas avoir plus d'une entrée <media:content> par <item> à moins qu'ils ne représentent le même contenu. C'est parce que les autres étiquettes comme <title> et <description> appartiennent à tous les tags <media:content> dans le même <item>. Ironiquement, le hook de personnalisation est la partie la plus facile, mais je dois d'abord obtenir la vue pour sortir les nœuds de la manière que j'ai décrite.

Alors est-il possible d'utiliser la nouvelle fonctionnalité de regroupement de vues Drupal 7 ou une autre méthode pour générer la sortie que je recherche? J'aimerais connaître le truc! Sinon, je vais devoir utiliser une entrée de menu personnalisée et perdre tous les avantages (tels que la mise en cache automatique et la possibilité de travailler dans l'interface utilisateur de Views) que j'obtiens avec Views.

Répondre

2

Créez une vue de "fichiers" puis, sous le groupe de champs Advanced replapsed situé sur le côté droit de l'interface utilisateur Views, créez une relation (une jointure) du noeud avec le fichier.

Voici une vue rapide, vous pouvez copier ici et importer dans vos vues ui:

<?php 
    $view = new view; 
    $view->name = 'test'; 
    $view->description = ''; 
    $view->tag = 'default'; 
    $view->base_table = 'file_managed'; 
    $view->human_name = 'test'; 
    $view->core = 7; 
    $view->api_version = '3.0'; 
    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ 

    /* Display: Master */ 
    $handler = $view->new_display('default', 'Master', 'default'); 
    $handler->display->display_options['title'] = 'test'; 
    $handler->display->display_options['access']['type'] = 'perm'; 
    $handler->display->display_options['cache']['type'] = 'none'; 
    $handler->display->display_options['query']['type'] = 'views_query'; 
    $handler->display->display_options['query']['options']['query_comment'] = FALSE; 
    $handler->display->display_options['exposed_form']['type'] = 'basic'; 
    $handler->display->display_options['pager']['type'] = 'full'; 
    $handler->display->display_options['pager']['options']['items_per_page'] = '10'; 
    $handler->display->display_options['style_plugin'] = 'default'; 
    $handler->display->display_options['row_plugin'] = 'fields'; 
    /* Relationship: File Usage: Content */ 
    $handler->display->display_options['relationships']['file_to_node']['id'] = 'file_to_node'; 
    $handler->display->display_options['relationships']['file_to_node']['table'] = 'file_usage'; 
    $handler->display->display_options['relationships']['file_to_node']['field'] = 'file_to_node'; 
    $handler->display->display_options['relationships']['file_to_node']['required'] = 0; 
    /* Field: File: Name */ 
    $handler->display->display_options['fields']['filename']['id'] = 'filename'; 
    $handler->display->display_options['fields']['filename']['table'] = 'file_managed'; 
    $handler->display->display_options['fields']['filename']['field'] = 'filename'; 
    $handler->display->display_options['fields']['filename']['label'] = ''; 
    $handler->display->display_options['fields']['filename']['alter']['alter_text'] = 0; 
    $handler->display->display_options['fields']['filename']['alter']['make_link'] = 0; 
    $handler->display->display_options['fields']['filename']['alter']['absolute'] = 0; 
    $handler->display->display_options['fields']['filename']['alter']['word_boundary'] = 0; 
    $handler->display->display_options['fields']['filename']['alter']['ellipsis'] = 0; 
    $handler->display->display_options['fields']['filename']['alter']['strip_tags'] = 0; 
    $handler->display->display_options['fields']['filename']['alter']['trim'] = 0; 
    $handler->display->display_options['fields']['filename']['alter']['html'] = 0; 
    $handler->display->display_options['fields']['filename']['hide_empty'] = 0; 
    $handler->display->display_options['fields']['filename']['empty_zero'] = 0; 
    $handler->display->display_options['fields']['filename']['link_to_file'] = 1; 
    /* Field: Content: Body */ 
    $handler->display->display_options['fields']['body']['id'] = 'body'; 
    $handler->display->display_options['fields']['body']['table'] = 'field_data_body'; 
    $handler->display->display_options['fields']['body']['field'] = 'body'; 
    $handler->display->display_options['fields']['body']['relationship'] = 'file_to_node'; 
    /* Field: Content: Date */ 
    $handler->display->display_options['fields']['field_date']['id'] = 'field_date'; 
    $handler->display->display_options['fields']['field_date']['table'] = 'field_data_field_date'; 
    $handler->display->display_options['fields']['field_date']['field'] = 'field_date'; 
    $handler->display->display_options['fields']['field_date']['relationship'] = 'file_to_node'; 
    $handler->display->display_options['fields']['field_date']['alter']['alter_text'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['make_link'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['absolute'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['external'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['replace_spaces'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['trim_whitespace'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['nl2br'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['word_boundary'] = 1; 
    $handler->display->display_options['fields']['field_date']['alter']['ellipsis'] = 1; 
    $handler->display->display_options['fields']['field_date']['alter']['strip_tags'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['trim'] = 0; 
    $handler->display->display_options['fields']['field_date']['alter']['html'] = 0; 
    $handler->display->display_options['fields']['field_date']['element_label_colon'] = 1; 
    $handler->display->display_options['fields']['field_date']['element_default_classes'] = 1; 
    $handler->display->display_options['fields']['field_date']['hide_empty'] = 0; 
    $handler->display->display_options['fields']['field_date']['empty_zero'] = 0; 
    $handler->display->display_options['fields']['field_date']['hide_alter_empty'] = 1; 
    $handler->display->display_options['fields']['field_date']['settings'] = array(
     'format_type' => 'long', 
     'fromto' => 'both', 
     'multiple_number' => '', 
     'multiple_from' => '', 
     'multiple_to' => '', 
     'show_repeat_rule' => 'show', 
    ); 
    $handler->display->display_options['fields']['field_date']['group_rows'] = 1; 
    $handler->display->display_options['fields']['field_date']['delta_offset'] = '0'; 
    $handler->display->display_options['fields']['field_date']['delta_reversed'] = 0; 
    $handler->display->display_options['fields']['field_date']['delta_first_last'] = 0; 
    $handler->display->display_options['fields']['field_date']['field_api_classes'] = 0; 
    /* Field: Content: Link */ 
    $handler->display->display_options['fields']['view_node']['id'] = 'view_node'; 
    $handler->display->display_options['fields']['view_node']['table'] = 'views_entity_node'; 
    $handler->display->display_options['fields']['view_node']['field'] = 'view_node'; 
    /* Field: Content: Title */ 
    $handler->display->display_options['fields']['title']['id'] = 'title'; 
    $handler->display->display_options['fields']['title']['table'] = 'node'; 
    $handler->display->display_options['fields']['title']['field'] = 'title'; 
    /* Sort criterion: File: Upload date */ 
    $handler->display->display_options['sorts']['timestamp']['id'] = 'timestamp'; 
    $handler->display->display_options['sorts']['timestamp']['table'] = 'file_managed'; 
    $handler->display->display_options['sorts']['timestamp']['field'] = 'timestamp'; 
    $handler->display->display_options['sorts']['timestamp']['order'] = 'DESC'; 

    /* Display: Page */ 
    $handler = $view->new_display('page', 'Page', 'page'); 
    $handler->display->display_options['path'] = 'test'; 

?> 

En ce qui concerne le balisage correct entourant l'impression toute RSS, vous pouvez manipuler les modèles de vues. Pour modifier chaque enregistrement, utilisez views-view-fields - test.tpl.php (par exemple). Et pour l'encapsulation autour de la vue entière, utilisez views-view-test.tpl.php (par exemple). Les modèles disponibles se trouvent sous le lien "Thèmes" en bas du troisième rail (celui qui a été réduit) sur l'interface utilisateur de Views. Il suffit de déposer les fichiers modèles de vues dans le dossier de votre thème et drush cc tout.

Joe

+0

Merci, ça m'a permis d'être sur la bonne voie. Au cours du week-end, j'ai commencé à écrire un module views_mrss basé sur views_rss implémentant "MRSS - Fields" et c'est ainsi que je n'ai pas besoin d'utiliser de modèles de vues. Je vais le publier une fois que c'est à la hauteur. –

+0

Même si une vue _File_ est correcte dans certains cas, et répond presque à ma question, elle échoue à un point important: Bien que vous puissiez ajouter une relation "Contenu du fichier" pour obtenir le contenu associé au fichier, vous pouvez t utilisez alors le champ "Contenu: Audio" ou (dans mon cas, "Contenu: Vidéo") car cela renvoie _all_ les valeurs audio/vidéo associées au contenu. Et malheureusement, l'élément "File: fid" est trop général pour dériver la vignette de la vidéo. Mais une vue _Content_ avec un affichage _Fields_ fournit des éléments multimédias complets que je peux utiliser. –

+0

dans le cas où vous souhaitez filtrer en fonction du type de contenu de la jointure: Si le filtre de vues "Contenu: Type" n'est pas disponible dans l'interface, consultez hook_views_query_alter() et vérifiez si vous pouvez modifier la partie de jointure de la requête mysql. Cela devient assez avancé dans les instructions mysql. Quelqu'un a sonné? - Joe –