我正试图使用_prreprocess_html访问自定义节点字段,但我在StackOverflow上看到的许多方法似乎都无法正常工作,我也不太明白为什么。
我有一个名为"public"的复选框字段,在节点上可用作"field_public"。我想知道它在预处理_ 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属性存在(未登录)时,值是提取的,而当我以管理员身份登录(节点对象没有语言属性)时,不是获取的,所以我必须从两个方面进行检查。我做错了什么?
获取字段值的最佳方法始终是:
$node->field_public[LANGUAGE_NONE][0]['value']
Language_One等于"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);
在这里,您只进行了两次查询,不知道为什么,node已经在$node变量中提取了。所以只需使用值,保持简单