Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drupal-template.php文件的逻辑_Php_Sql_Drupal_Function_Templates - Fatal编程技术网

Drupal-template.php文件的逻辑

Drupal-template.php文件的逻辑,php,sql,drupal,function,templates,Php,Sql,Drupal,Function,Templates,今天,我花了相当多的时间来扩展我继承的drupal站点,我确信我所面临的问题归根结底是我的定制SQL查询 后来我意识到SQL还可以(在PHPMYadmin中检查并在drupal网站中执行)。因此,我很高兴我从数据库中得到了我所需要的所有结果,通过它们循环并在页面上以特定的标记输出它们 我遇到的问题是循环显示在哪里。我似乎无法理解主题系统,也无法理解template.php中发生了什么 让我解释一下: 我需要更改的代码位于template.php文件中。我的理解是,这个文件允许您覆盖某些函数和主题

今天,我花了相当多的时间来扩展我继承的drupal站点,我确信我所面临的问题归根结底是我的定制SQL查询

后来我意识到SQL还可以(在PHPMYadmin中检查并在drupal网站中执行)。因此,我很高兴我从数据库中得到了我所需要的所有结果,通过它们循环并在页面上以特定的标记输出它们

我遇到的问题是循环显示在哪里。我似乎无法理解主题系统,也无法理解template.php中发生了什么

让我解释一下:

我需要更改的代码位于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在呈现页面时的假设如下(简化):

  • 加载核心。从数据库中获取内容。获取分类法和其他好东西,并将它们提供给模块和主题

  • 然后,查看所有模块以查看 如果他们有钩子,基于 它们的函数名,将修改 如果有,请运行函数。 如果他们没有,那就别管这页了

  • 然后,看看所有的主题 如果template.php有这样的钩子, 根据它们的函数名,will 修改页面。如果他们这样做,请运行 功能。如果没有,请将 佩奇一个人

  • 最后,查看tpl.php文件并使用这些文件显示页面

  • 所有这些都是一个很好的总结

    如果template.php中没有类似于将修改页面的函数,并且没有与正在查找的节点匹配的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() ;?>