2015-11-19 108 views
0

我想使用_preprocess_html訪問自定義節點字段,但是我在StackOverflow上看到的許多方法似乎都不正確,我不太明白爲什麼。Drupal 7,訪問_preprocess_html中的複選框字段值

我有一個名爲'public'的複選框字段,它可以在節點上作爲'field_public'使用。我想知道它是否在preprocess_html模板函數中被選中或未選中。

如果我沒有登錄到該網站,請執行下列操作:

function MYTHEME_preprocess_html() { 
    $node = menu_get_object(); 
} 

然後我的字段值是$node->field_public[LANGUAGE_NONE][0]['value']爲我所期望的。但是,如果我登錄,它將更改爲$node->field_public[0]['value']

現在我只是做

$public = ($node->field_public[LANGUAGE_NONE][0]['value'] || $node->field_public[0]['value']) 

但我想它正確,沒有的我曾嘗試選擇似乎給我在這兩種情況下的值。我曾嘗試:

// node_build_content method 
$node = node_load($node->nid); 
node_build_content($node); 
$public = $node->content['field_public']; 

// entity api method 
$wrapper = entity_metadata_wrapper('node', $node); 
$public = $wrapper->field_public->value(); 

// field_get_item method 
$public = field_get_item('node',$node,'field_public'); 

在所有這些情況下的價值取出時langauage屬性存在(未登錄)和當我登錄的管理員是不是獲取(當節點對象沒有語言屬性),所以我必須回頭檢查兩種方式。我究竟做錯了什麼?獲得字段值

回答

0

最好的辦法是始終:

$node->field_public[LANGUAGE_NONE][0]['value'] 

Language_None等於「UND」,當你不使用多語言領域也將永遠得到的值好辦法。 [0]是一個索引,當字段只有一個值時,它將在此索引處 - 始終。

有沒有必要檢查一下這樣的:

$public = ($node->field_public[LANGUAGE_NONE][0]['value'] || $node->field_public[0]['value']) 

場總是有語言的關鍵第一。

所以使用它像:

$public = $node->field_public[LANGUAGE_NONE][0]['value']; 

或者,如果現場並不總是使用是安全的,而你呈現不同類型的內容:

$public = isset($node->field_public[LANGUAGE_NONE][0]['value']) ? $node->field_public[LANGUAGE_NONE][0]['value'] : null; 

它完全罰款來獲得簡單的值。如果你想得到其他結果,比如主題字段,你可以嘗試渲染字段或使用其他函數。

您的代碼:

$node = node_load($node->nid); 

這裏你只要把查詢兩次,不知道爲什麼,節點已經$節點變量中獲取。因此,只要使用價值,保持簡單

+0

除此之外,正如我所說,在preprocess_html()以admin身份登錄時,*不是*語言代碼。節點輸出只有'$ node-> field_public [0] ['value']',沒有語言代碼。這就是爲什麼我很困惑,因爲我看到的所有文檔都與你一致,並顯示了一個代碼。 –