Drupal-template.php文件的逻辑
今天,我花了相当多的时间来扩展我继承的drupal站点,我确信我所面临的问题归根结底是我的定制SQL查询 后来我意识到SQL还可以(在PHPMYadmin中检查并在drupal网站中执行)。因此,我很高兴我从数据库中得到了我所需要的所有结果,通过它们循环并在页面上以特定的标记输出它们 我遇到的问题是循环显示在哪里。我似乎无法理解主题系统,也无法理解template.php中发生了什么 让我解释一下: 我需要更改的代码位于template.php文件中。我的理解是,这个文件允许您覆盖某些函数和主题元素 在template.php文件中,这是我需要更改的代码:Drupal-template.php文件的逻辑,php,sql,drupal,function,templates,Php,Sql,Drupal,Function,Templates,今天,我花了相当多的时间来扩展我继承的drupal站点,我确信我所面临的问题归根结底是我的定制SQL查询 后来我意识到SQL还可以(在PHPMYadmin中检查并在drupal网站中执行)。因此,我很高兴我从数据库中得到了我所需要的所有结果,通过它们循环并在页面上以特定的标记输出它们 我遇到的问题是循环显示在哪里。我似乎无法理解主题系统,也无法理解template.php中发生了什么 让我解释一下: 我需要更改的代码位于template.php文件中。我的理解是,这个文件允许您覆盖某些函数和主题
//old function from original development
function abc($node,$submitted,$node_url) {
//execute code
}
因此,我在函数abc()中添加了代码,因为我希望在输出旧代码的地方输出代码
这是我的sql和循环的psuedo代码:
function abc($node,$submitted,$node_url) {
$sql = 'my sql query'
$results =db_query($sql);
while ($data = db_fetch_array($results)) {
//output my results here
}
}
让我相信sql是错误的是,我应该得到23个结果,但我得到了更多的重复条目。在浪费了大量时间寻找错误的位置并仔细检查sql之后,我意识到是函数多次执行sql和循环,而不是sql返回重复条目。我是这样做的:
function abc($node,$submitted,$node_url) {
$sql = 'my sql query'
$results =db_query($sql);
$x = 1;
while ($data = db_fetch_array($results)) {
if ($x == 1) {
echo '<p style="background-color:#ccc;">'. $x . '. '.$data['title'] . '</p>';
}else{
echo '<p>'. $x . '. '.$data['title'] . '</p>';
}
$x = $x + 1;
}
函数abc($node,$submitted,$node\u url){
$sql='我的sql查询'
$results=db_查询($sql);
$x=1;
而($data=db\u fetch\u数组($results)){
如果($x==1){
echo'”.$x.$data['title'.
”;
}否则{
回显“”.$x..$data['title']”。”;
}
$x=$x+1;
}
}
当代码执行时,我期望一个递增的数字会出现在尽可能多的重复条目中,并将第一个条目的背景颜色变为灰色,但事实并非如此。在结果23处,它将自身重置为1,并将该条目的背景着色为灰色,向我表明是函数多次执行sql和循环
我不完全确定这个abc()函数是什么,除了这样一个事实:当我将代码放入其中时,输出会显示在特定页面上我需要它的位置,而不会显示在其他地方(没有重复的条目)
当我从这个函数中取出代码时(仍然在template.php中),我的代码会输出到所有页面的头部,这是不可取的
有没有人对可能发生的事情有什么想法,我可以在哪里找到这个函数,或者知道我确定代码显示的方法
我一直在读一些关于主题等的书,但是使用其他人的代码正在变成一场混乱的噩梦
提前干杯 虽然template.php用于覆盖各种主题函数,但它也可以用于简单地存储在模板上调用的函数(您还可以强制template.php在自定义模块中可用,具体取决于原始开发人员对站点的处理方式)。因此,仅仅因为函数位于template.php中,就不会自动假定它是一个主题覆盖(如果您可以提供函数的实际名称,则有助于确定它是否是主题覆盖) 将代码从函数中删除但保留在template.php中会导致每个页面上都有输出的原因是template.php包含在每个页面中。理论上,您可以在template.php中放置更多函数。我在一个大型站点上工作,其中一个开发人员将函数分解为几个较小的文件,因此template.php只有2或3个函数和3或4个include()
知道函数的实际名称确实有助于确定这是自定义函数还是主题覆盖。首先,您不应该使用
echo
,因为它将在代码运行时打印(例如,加载时在页面顶部)而不是将模板显示在页面适当位置的变量。(这并不是说echo
永远不会工作,但使用它并不是最佳实践。)
前一个函数用于输出数据的是什么?(可能有一个名为abc.tpl.php
(如果函数名为abc
)的页面,可以帮助您找到合适的变量名
如果添加您正在使用的SQL字符串,我可能也能够诊断该问题
编辑:
根据您之前的评论,假设您正在尝试格式化一个blog节点(我是基于您提到的blog.tpl.php节点的缺乏):
Drupal在呈现页面时的假设如下(简化):
function abc($node,$submitted,$node_url) {
echo $node->taxonomy['color'];
$a = explode(",",$submitted);
$b = explode("-",$a[1]);
// THIS IS THE DESCRIPTION
if(strlen($node->content['body']['#value'])>180)
{
$c = str_split($node->content['body']['#value'],180);
$d = $c[0]."...";
}
else{
$d = $node->content['body']['#value'];
}
$multiple = $node->field_mul_event[0]['view'];
$eventcode = $node->field_event_code[0]['value'];
$strdata="";
$strdata.="specific markup to output here";
return $strdata;
select DISTINCT node.nid AS nid, node.title AS node_title,
content_type_blog.field_date_from_value AS node_data_field_date_from_field_date_from_value,
DATE_FORMAT(content_type_blog.field_date_from_value, '%%d/%%m/%%Y') AS dateFrom,
content_type_blog.field_date_from_value2 AS node_data_field_date_from_field_date_from_value2,
content_type_blog.nid AS node_data_field_date_from_nid,
field_mul_event_value AS multiEvent,
field_event_code_value AS eventCode,
node.type AS node_type,
content_type_blog.field_event_excerpt_value AS node_data_field_date_from_field_event_excerpt_value,
image_attach.iid AS image_attach_iid,
node_images.filepath AS imagePath,
color AS catColour
FROM node
node LEFT JOIN content_type_blog content_type_blog ON node.vid = content_type_blog.vid
LEFT JOIN image_attach image_attach ON node.nid = image_attach.nid
LEFT JOIN node_images node_images ON node.nid = node_images.nid
LEFT JOIN term_node term_node ON node.nid = term_node.nid
LEFT JOIN term_data term_data ON term_node.tid = term_data.tid
WHERE node.type LIKE 'blog' AND content_type_blog.field_date_from_value >= DATE(NOW()) AND content_type_blog.field_date_from_value2 >= DATE(NOW())
ORDER BY content_type_blog.field_date_from_value ASC
<?php print $fields['title']->content; ?>
<?php print $fields['introduction']->content; ?>
<?php print abc($node,$submitted,$node_url); ?>
function getData(){
$sql='my sql query';
results =db_query($sql);
$return_string = '' ;
while ($data = db_fetch_array($results)) {
//Loop through data and save to $db_data
$return_string .= $db_data;
}
return $return_string;
}
<?php if ($node->nid == xxx || $node->nid == yyy) print getData() ;?>