2016-11-17 143 views
0

我一直在绞尽脑汁,但我会尽我所能来尽可能地描述问题。我有一个在template.php中编写的自定义函数,带有一些条件。当条件为真时,我想为变量赋值,然后通过该变量介绍节点预处理函数,该函数允许将变量呈现在节点模板上。将变量传递给_preprocess_node函数以在节点模板中使用

包含条件的函数:

function _mytheme_date_repeat_string($vars) { 

    $exdate_pos = strpos($rrule['WKST'], 'EXDATE:'); 
    if($exdate_pos > 0) { 

     $vars['testvar'] = 'abc123'; 
    } 
} 

的预处理功能,我想以使变量节点模板使用:

​​

在节点预期用法.tpl.php:

<?php print $new_variable; ?> 

我对PHP并不擅长,但我对编程有足够的了解,知道变量作用域可能是一个问题。什么是实施这个最好的方法?任何指导非常感谢。

谢谢, 马克。

+0

你可以使用$ GLOBALS数组来保存它http://php.net/manual/fr/reserved.variables.globals.php – Fky

回答

0

如果未被调用,则您的_mytheme_date_repeat_string()函数将永远不会执行。预处理功能(即开始mytheme_preprocess_任何功能,会自动由Drupal的主题系统调用。

你需要的是无论是移动的_mytheme_date_repeat_string()的代码mytheme_preprocess_node()或重构它并调用它。

function _mytheme_date_repeat_string($rrule) { 
    $exdate_pos = strpos($rrule['WKST'], 'EXDATE:'); 
    if($exdate_pos > 0) { 
     return 'abc123'; 
    } 
    else { 
     return NULL; 
    } 
} 

/** 
* Prepares variables for node templates. 
*/ 
function mytheme_preprocess_node(&$variables, $hook) { 

    // Get $rrule from somewhere 
    $rrule = ... ; 

    $testvar = _mytheme_date_repeat_string($rrule); 
    if ($testvar) { 
    $variables['new_variable'] = $testvar; 
    } 
} 

你的代码不会显示$rrule calue来自哪里,我想你会得到它的$variables['node']

+0

谢谢皮埃尔,这是一个淡化的版本我的代码不完整。在我的实际代码中,函数被返回并执行。我或多或少想知道如何将值保存到变量中,_within_该函数,并在模板使用的preprocess_node函数中的其他位置调用该变量。 –

+0

用反映真实情况的代码更新您的问题,我可以更新我的答案。如果你绕过'$ vars'并在所有函数中通过引用(即'&$ vars')接收它,那么你可以使用它来传递数据。请注意,这会导致难以阅读的代码,因为您不知道函数的签名,它们消耗和返回的内容。 –