Drupal 7,访问_preprocess_html中的复选框字段值


Drupal 7, accessing a checkbox field value in _preprocess_html

我正试图使用_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变量中提取了。所以只需使用值,保持简单