Drupal 7:从挂钩菜单打印主题,性能良好

问题描述 投票:0回答:1

我正在使用自定义路线的挂钩菜单,如下所示:

function mymodule_menu() {
  $items = [];
  $items['myroute/%'] = array(
    'page callback'     => 'my_callback',
    'page arguments'     => array(1),
    'access arguments'  => array('access content'),
  );
  return $items;
}

在 theme_hook 中,我添加了一个新的模板功能,如下所示:

function mymodule_theme($existing, $type, $theme, $path) {
  $default = array(
    'path' => drupal_get_path('module', 'mymodule') . '/templates',
    'variables' => array(),
  );
  return array(
    'product_tile' => array_merge($default, array(
      'template' => 'product-tile',
    )),
  );
}

我创建了一个名为“product-tile.tpl.php”的模板文件,它适用于所有情况,并且是一个部分模板。

在回调函数中,我需要返回一个特定的.tpl.php模板,如下所示:

function my_callback($parameter) {

 $template_data = 'lorem ipsum';
 $output = theme('product_tile', array('content' => $template_data ));
 echo ($output);

}

重点是:“theme()”函数渲染数据的时间太长,它不仅渲染模板,还渲染整个 html 结构,这是不需要的,也不是模板的一部分。

例如:模板是:

<div id="my structure></div>

但是当我收到对 '/myroute/myparameter 的响应时,它不是打印我的模板,而是打印所有 html 结构,如下所示:

<html>
  <body>......lots of stuff here +js +css + all drupal stuff
      <div id="my structure></div>
  </body>
</html>

并且需要很多时间来打印(比如 10 秒或更多)。

我尝试使用cache_get和cache_set来缓存它,但是奇怪的事情发生了,比如随机的空响应。

有谁知道在 drupal 7 的挂钩菜单中打印部分模板的更高效的方法吗?这样速度实在是太慢了

提前致谢

php drupal drupal-7 hook-menu
1个回答
1
投票

您的自定义路由映射到

page callback
,该函数必须返回内容才能在页面内呈现以交付(而不仅仅是打印某些内容)。

此内容可以是:

  • HTML 字符串
  • drupal 渲染数组
  • 或菜单状态代码(
    MENU_ACCESS_DENIED
    MENU_NOT_FOUND
    等)

该内容(如果不是 HTML 字符串,一旦呈现)就是您在传递给活动主题的

page.tpl.php
$content
变量中实际获得的内容。 现在,您的问题可能只是由于使用此模板引起的(例如,如果它包含大量 PHP 或糟糕的实现,无论什么原因),但它可能是完全不同的东西:

  • ‘theme()’函数渲染数据的时间太长

    交付该页面所花费的时间并不一定意味着它是由该主题功能引起的。您可以检查渲染该特定模板实际所需的时间 - 而不是整个 HTML 页面 - 它可能

    not

    10 秒 : $page['content']

    由于渲染自定义模板时涉及一些繁重的 drupal 钩子和预处理函数,页面交付可能会很长,但这也可能是渲染页面其他区域(侧边栏、页眉、页脚等)的成本。

  • 当我收到对 /myroute/myparameter 的响应时,它不会打印我的模板,而是打印所有 html

    : 如上所述,路由路径的响应

    一个完整的 HTML 页面,其中包含相应菜单项中定义的“页面回调”的输出作为“内容”。 drupal 页面回调的预期行为正是“返回”要在该页面上显示的内容,加载完整的 HTML 页面。这就是为什么需要 $start = microtime(true); $output = theme('product_tile', array('content' => 'lorem ipsum')); $end = microtime(true); $time = $end - $start; # dpm() is brought by devel module dpm('product_tile rendering: ' . $time . 'sec.'); 语句(如果不是,请不要假设任何内容),不要在页面回调中使用 return

    print
    函数,要查看变量的内容,请使用诸如
    echo 之类的调试函数
    ):
    
    
    dpm
    
    

    	
© www.soinside.com 2019 - 2024. All rights reserved.