2012-01-29 61 views
2

我有一個包含音頻文件字段的內容類型「音頻」。該字段接受多個值,因此每個節點可以包含任意數量的音頻文件。通常,當您構建RSS提要視圖時,它將爲每個節點生成一個<item>,並且每個節點都將有多個<enclosure>條目,每個音頻文件一個。但爲了我的目的,我需要視圖爲每個音頻文件值輸出單獨的<item>。因此,例如,如果所選節點中有3個音頻文件,則整個節點將在饋送中重複3次,每個節點只包含一個音頻文件機箱。Drupal 7:爲每個節點創建多個<item> s的RSS訂閱源?

原因是在我的具體情況下,我在自定義模塊中使用hook_node_view()將MRSS標記添加到視圖生成的每個節點。因此,而不是由<enclosure>包裝的音頻文件,它們將被封裝在<media:content>標籤中。根據MRSS規範,除非它們表示相同的內容,否則每<item>不應有多於一個<media:content>條目。這是因爲其他標籤如<title><description>屬於同一<item>中的所有<media:content>標籤。具有諷刺意味的是,定製鉤子是最簡單的部分,但首先我需要以我描述的方式輸出節點。

那麼有什麼方法可以使用新的Drupal 7視圖分組功能或其他一些方法來生成我正在尋找的輸出?我很想知道這個訣竅!否則,我將不得不使用自定義菜單條目,並失去使用Views獲得的所有優點(例如自動緩存並能夠在Views UI中工作)。

回答

2

創建「文件」視圖,然後在視圖UI右側的高級摺疊字段集下創建節點與文件的關係(聯接)。

這裏有一個快速瀏覽,你可以在這裏複製並導入到你的意見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'; 

?> 

至於圍繞整個RSS打印輸出正確的標記,你可以操縱視圖的模板。要修改每條記錄,請使用views-view-fields - test.tpl.php(例如)。對於整個視圖的包裝,請使用views-view-test.tpl.php(例如)。可用的模板位於視圖UI中第三條軌道(摺疊的)底部的「主題」鏈接下。只需將視圖模板文件拖放到主題的文件夾中即可。

Joe

+0

謝謝,這讓我走上了正軌。在這個週末裏,我開始編寫一個基於views_rss的views_mrss模塊來實現「MRSS - Fields」,這就使得我不必使用任何視圖模板。一旦達到標準,我會發布它。 – 2012-01-31 19:31:11

+0

儘管_File_視圖在某些情況下是正確的,並且幾乎解決了我提出的問題,但實際上它在一個重要方面失敗了:雖然您可以添加「文件內容」關係來獲取與文件關聯的內容,然後使用「內容:音頻」或(在我的實際情況下,「內容:視頻」)字段,因爲它返回與內容相關的音頻/視頻值。不幸的是,「File:fid」元素太籠統,無法獲得視頻的縮略圖。但帶有_Fields_顯示的_Content_視圖提供了我可以使用的完整媒體元素。 – 2012-02-02 18:36:07

+0

如果您希望根據連接的內容類型進行過濾:如果視圖過濾器「Content:Type」在視圖UI中不可用,請查看hook_views_query_alter()並查看是否可以更改聯接部分的mysql查詢。這在mysql語句中變得相當先進。有人在打鈴? --Joe – 2012-02-03 19:00:16