2012-12-06 41 views
2

我在我的智慧結束這一個,所以我希望有人在這裏可以指出我在正確的方向。我有一個名爲portfolio_item的內容類型,其文本字段爲field_portfolio_description。我正在嘗試打印列表中存在的每個值,而不使用視圖。這是preprocess_page功能我至今在我的template.php文件中:試圖顯示在Drupal 7頁面模板上的字段類型的項目列表,而不使用視圖

function blocks_preprocess_page(&$vars, $hook) { 
    $node = menu_get_object(); 
    if ($node->type == 'portfolio_item') { 
    $portfolios = field_get_items('node', $node, 'field_portfolio_description'); 
    $items = array(); 
    foreach ($portfolios as $folio) { 
     $items['data'] = $folio['value']; 
    } 
    $vars['description'] = theme('item_list', array('items' => $items)); 
    } 
} 

最後我想用下面的調用它在我的頁面模板:

<?php print render($description); ?> 

我試過幾個不同的變化無濟於事。任何幫助/建議將不勝感激。

更新:好吧我終於得到了一些調試結果。我收到以下錯誤:注意:試圖在blocks_preprocess_page()(第24行/sites/all/themes/blocks/template.php)中獲取非對象的屬性,並且這是第24行:

if ($node->type == 'portfolio_item') { 

portfolio_item是內容類型的機器名稱,所以這不是問題。

更新2:好吧,我已經剝離了函數一直到$ node = menu_get_object();並做了var_dump(dpm不起作用),發現非對象錯誤導致在訪問頁面時portfolio_item不存在於輸出中。 portfolio_item唯一存在的時間是訪問實際投資組合項目時。

因此,我會以完全錯誤的方式解決這個問題。也似乎Views不會讓我顯示該領域中的項目的簡單列表。

我稍後可能會重新討論這一點,如果我找到解決方案,我一定會發布最終代碼。如果其他人有想法,我可以試試。再次感謝那些誰在

+0

顯而易見的事情來檢查...... 1。你的主題叫「塊」(如信息文件稱爲'blocks.info'。2.由於實行掛鉤您已清除緩存。3.您確認正在進入'if'條件,使你知道代碼應該被觸發4.有問題的節點100%肯定有該字段的數據另外,得到Devel模塊並使用'dpm()'函數檢查你的變量(它會立即告訴你是否缺少某些內容) – Clive

+0

@clive是的,我已經檢查了所有的這些事情,以確保我沒有錯過任何明顯。我有安裝devel模塊和我一直在與DPM功能亂搞,試圖縮小問題在哪裏,我會繼續保持,我確信我現在已經接近了,只有一件我想念的東西。謝謝你的迴應,如果你有更多的想法,我會所有的耳朵。 –

回答

0

插話說試試這個:

$node = menu_get_object(); 
if ($node->type == 'portfolio_item') { 
    $portfolios = field_get_items('node', $node, 'field_portfolio_description'); 
    $vars['description'] = array(
    '#theme' => 'item_list', 
    '#items' => $portfolios 
); 
} 

爲了使用渲染功能,你必須通過它渲染陣列。 field_get_items函數已經返回一個數組或可呈現的元素。然後,你所要做的就是將其返回值傳遞給一個結構合理的渲染數組。渲染功能會將其轉換爲標記。

theme('item_list', array('items' => $items)); 

這個主題函數調用返回的標記,這樣你就不會需要通過渲染功能,將它傳遞。另外一個原因,爲什麼你的代碼不能正常工作是因爲你重置$項目[「數據」]在每個迭代上

$items['data'] = $folio['value']; 

值應該是

$items['data'][] = $folio['value']; 

上面的解決方案應爲你做它是呈現標記

見的Drupal 7的方式:在Drupal 7渲染陣列 - http://drupal.org/node/930760

+0

謝謝你花時間回覆我繼續嘗試你的版本的功能,但我仍然即使清除緩存後也沒有收到任何內容。 @clive提到嘗試使用dpm()來嘗試縮小問題的範圍,這樣我就可以看到我是否能夠準確找到問題所在。如果你有任何其他的想法,我全部耳朵。再次感謝。 –

+0

從「blocks_preprocess_node」給它一個鏡頭。您將需要更新node.tpl.php文件。 –

0

hook_preprocess_page()已經得到一個節點對象;沒有必要重新加載它。然後,您的代碼只使用文本字段中包含的值之一,即使它循環訪問數組內容,因爲它始終將值保存在$items['data']中。

您應該編寫的代碼與以下代碼類似。

function blocks_preprocess_page(&$vars, $hook) { 
    $items = array(); 

    if (!empty($vars['node']) && $vars['node']->type == 'portfolio_item') { 
    $portfolios = field_get_items('node', $vars['node'], 'field_portfolio_description'); 
    foreach ($portfolios as $folio) { 
     $items[] = $folio['value']; 
    } 

    $vars['description'] = theme('item_list', array('items' => $items)); 
    } 
} 

您可以將字符串安全地傳遞到render(),因爲它首先檢查它得到的參數的數據類型。

function render(&$element) { 
    if (is_array($element)) { 
    show($element); 
    return drupal_render($element); 
    } 
    else { 
    // Safe-guard for inappropriate use of render() on flat variables: return 
    // the variable as-is. 
    return $element; 
    } 
} 
相關問題