ページ表示でフィールド値を変更しようとしています。 field_get_items() を使用してフィールド値を簡単に取得できますが、他のフィールドの値によっては、PHPロジックに基づいてテキストや表示を操作する必要がある場合がありますテンプレートファイル。 hook_page_alter() または hook_preprocess_HOOK() を使用してそれを実行しようとしています。
hook_page_alter()
またはhook_preprocess_HOOK()
を使用してページを表示すると、テキストを変更できません。これら2つの関数が機能していること、およびDB($page['content']
)から値をプルできることを確認できますが、変数をオーバーライドして設定することはできません。例えば:
function standard_submission_page_alter(&$page) {
$node = menu_get_object();
$page['content']['system_main']['nodes'][$node->nid]['field_title_nickname']['#items'][0]['value'] = 'A new nickname title!';
}
function standard_submission_preprocess_page(&$vars) {
$vars['node']->field_title_nickname['und'][0]['value'] = 'A new nickname title 2x';
}
このfield_title_nickname
テキストフィールド値の変更が受け入れられず、表示されない理由に関するアイデアはありますか?それは元々データベースにあったものに戻り続けます。
PHPロジックに基づいてテキストや表示を操作する必要がある場合、テンプレートではなくカスタムモジュールで hook_node_view() を使用して行います。ファイル。
function MYMODULE_node_view($node, $view_mode = 'full', $langcode = NULL) {
if( $view_mode == 'full' ){
if( some conditions here ){
$node->content['field_title_nickname'] = array(
'#markup' => '<div>A new nickname title 2x</div>'
);
}
}
}
これを行うには、template.phpにtemplate_preprocess_field(&$ variables、$ hook)を実装します。
function THEMENAME_preprocess_field(&$variables, $hook) {
if ($node = menu_get_object()) {
if ($node->type == 'car') {
if($variables['element']['#field_name'] == 'field_price') {
$variables['items']['0']['#markup'] = $new_value; //new value;
}
}
}
}
ここを確認してください: http://tassaf.moriamedia.com/change-field-value-in-node-view/
Display Suite を使用する場合 hook_ds_pre_render_alter() を実装して、エンティティレンダリング配列を変更します。
例:
/**
* Implements hook_ds_pre_render_alter().
*/
function MYMODULE_ds_pre_render_alter(&$layout_render_array, $context, &$vars) {
$entity_type = $context['entity_type'];
if ($entity_type == 'node') {
$layout_render_array['ds_content']['Foo']['#markup'] = 'Bar';
}
}