在每个页面上执行PHP? -- blocks 领域 和 hooks 领域 drupal 相关 的问题

Execute PHP on every page?


0
vote

问题

中文

我正在为drupal 6编写自定义模块,我需要执行一些php,无论用户访问哪个页面。

我看到hook_init在缓存的页面上没有运行,所以这是一个禁止。 hook_boot不起作用,因为它在页面要求中发生得太早请求让我使用我需要的一些功能。

所以我正在考虑使用hook_block指定一个块,但那钩只是让我拉出我的发型:
  function test_block($op='list', $delta=0, $edit=array()) {   switch ($op) {   case 'list':     $block['test_block']['info'] = t('Test block');     return $block;   case 'view':     $block = array();     switch ($delta) {     case 'test_block':       $block_content = '<?php echo 'WTF?'; ?>';       $block['subject'] = NULL;       $block['content'] = $block_content;       break;     }     return $block;   } }   

这个渲染为:

  <div class="content">     <!--?php echo 'WTF?'; ?-->     <a id="context-block-test-test_block" class="context-block editable edit-global"></a> </div>   
显然,这也不是我正在寻找的。为什么该块中的PHP没有正确呈现?即使我最终使用除了一个块以外的东西来解决我的问题,那么这个问题就会真正引发我的好奇心。

如果我不能使用hook_block,我如何在每个页面上获得一些php运行?我需要访问$用户global和drupal_goto()函数。

英文原文

I'm writing a custom module for Drupal 6, and I need to execute some PHP no matter which page the user accesses.

I see that hook_init is not run on cached pages, so that's a no-go. hook_boot doesn't work, either, because it happens too early in the page request to let me use some functions I need.

So I was thinking about specifying a block using hook_block, but that hook just makes me pull my hair out:

function test_block($op='list', $delta=0, $edit=array()) {   switch ($op) {   case 'list':     $block['test_block']['info'] = t('Test block');     return $block;   case 'view':     $block = array();     switch ($delta) {     case 'test_block':       $block_content = '<?php echo \'WTF?\'; ?>';       $block['subject'] = NULL;       $block['content'] = $block_content;       break;     }     return $block;   } } 

This renders as:

<div class="content">     <!--?php echo 'WTF?'; ?-->     <a id="context-block-test-test_block" class="context-block editable edit-global"></a> </div> 

Obviously, that's not what I'm looking for, either. Why does the PHP in that block not render correctly? Even if I end up using something other than a block to solve my problem, this issue really sparks my curiosity.

If I can't use hook_block, how do I get some PHP to run on every page? I need access to the $user global and to the drupal_goto() function.

     

回答列表

4
 
vote

代码有什么问题是输出块内容的代码需要执行,例如:

  $block['content'] = test_get_block_content();   

如果代码需要在页面中输出某些内容,则此代码是有意义的;如果需要执行的代码不需要在页面中输出任何内容,然后 hook_exit()始终执行,即使在缓存的页面上也是如此。该挂钩的文档报告以下文本:

如果您的代码必须运行,甚至用于缓存的页面浏览量,请仅使用此挂钩。如果您有必须在所有非高速缓存页面上运行一次的代码,请使用 hook_init()

为重定向用户,可以查看重定向模块来重定向用户。模块的目的是重定向在当前访问的页面上的用户,并且在从管理员用户决定的设置上。重定向用户的代码包含在此函数中,该函数是 hook_init():

  /**  * Implements hook_init().  */ function redirect_init() {   if (!redirect_can_redirect()) {     return;   }    $current_path = current_path();   $current_langcode = $GLOBALS['language']->language;   $current_query = drupal_get_query_parameters();   if ($redirect = redirect_load_by_source($current_path, $current_langcode, $current_query)) {     redirect_redirect($redirect);   }   // … }   

redirect_redirect() 函数是 redirect_page_cache_clear() 的包装器。

  function redirect_page_cache_clear($redirect = NULL) {   if (!variable_get('redirect_page_cache', 0)) {     return;   }    if (isset($redirect)) {     $path = url($redirect->source, array('absolute' => TRUE));     // Use a wildcard to catch paths with query strings.     cache_clear_all($path, 'cache_page', TRUE);   }   else {     // Clear the entire page cache.     cache_clear_all('*', 'cache_page', TRUE);   } }   

如果您将通过 998876610 实现将用户重定向的方法,则应考虑以类似的方式实现 function yourmodule_theme($existing, $type, $theme, $path){ return array( 'yourmodule_block' => array( 'template' => 'yourmodule', 'variables'=> array('var1' => NULL, 'var2' => NULL), ), ); } 1

 

What is wrong with your code is that the code that outputs the content of the block needs to be executed, such as:

$block['content'] = test_get_block_content(); 

This code makes sense if the code needs to output something in the page; if the code that needs to be executed doesn't need to output anything in the page, then hook_exit() is always executed, even on cached pages. The documentation for that hook reports the following text:

Only use this hook if your code must run even for cached page views. If you have code which must run once on all non cached pages, use hook_init() instead.

As for redirecting a user, you can look at what the Redirect module does to redirect a user. The purpose of the module is to redirect a user basing on the currently visited page, and on settings decided from an administrator user. The code that redirects the user is contained in this function, which is the implementation of hook_init():

/**  * Implements hook_init().  */ function redirect_init() {   if (!redirect_can_redirect()) {     return;   }    $current_path = current_path();   $current_langcode = $GLOBALS['language']->language;   $current_query = drupal_get_query_parameters();   if ($redirect = redirect_load_by_source($current_path, $current_langcode, $current_query)) {     redirect_redirect($redirect);   }   // xe2x80xa6 } 

The redirect_redirect() function is a wrapper for redirect_page_cache_clear().

function redirect_page_cache_clear($redirect = NULL) {   if (!variable_get('redirect_page_cache', 0)) {     return;   }    if (isset($redirect)) {     $path = url($redirect->source, array('absolute' => TRUE));     // Use a wildcard to catch paths with query strings.     cache_clear_all($path, 'cache_page', TRUE);   }   else {     // Clear the entire page cache.     cache_clear_all('*', 'cache_page', TRUE);   } } 

If you would implement a way to redirect a user through drupal_goto(), you should consider implementing hook_init() in a similar way.

 
 
 
 
1
 
vote

您可以包含您在 998876612

中访问其功能的文件

e.g。

  function yourmodule_theme($existing, $type, $theme, $path){   return array(     'yourmodule_block' => array(       'template' => 'yourmodule',       'variables'=> array('var1' => NULL, 'var2' => NULL),     ),   ); } 3  

显然这意味着更多的挖掘,以确定您需要包含哪些文件,但可以在没有太多头痛的情况下完成...

 

You can include files whose functions you need to access in hook_boot()

e.g.

require_once DRUPAL_ROOT . '/' . 'includes/path.inc'; require_once DRUPAL_ROOT . '/' . 'includes/locale.inc'; 

Obviously this means a bit more digging to determine precisely which files you need to include, but it can be done without too many headaches...

 
 
     
     
0
 
vote
vote
最佳答案
 

我最终使用了hook_init,因为页面不缓存被缓存的经过身份验证的用户。我只需要这个php来运行经过身份验证的用户。我真的希望我能弄清楚Hook_block的发生了什么,但...

 

I ended up using hook_init, since pages aren't cached for authenticated users. I only needed this PHP to run for authenticated users. I really wish I could have figured out what was going on with hook_block, though...

 
 

相关问题

1  节点/在块中添加?  ( Node add within a block ) 
是否可以具有显示内容类型的节点创建页面的块,并且一旦创建节点就会消失? ...

2  通过分类学期获取相关节点?  ( Get related node by taxonomy term ) 
让我们说我有两个内容类型:页面和新闻。它们都有一个称为标签的字段,即分类项。 让我们说我标记一个页面和一个新闻项目,术语"庆祝" 。当用户进入前端网站上的页面时,用户应在右侧栏上看到相关的新闻项目。新闻项目与页面有关,如果它们都有至少一个共同标签。 我试图设置新闻项目块,但我不知道如何只告诉它只能显示与页面共享至少1...

0  在块中获取父节点的分类术语  ( Get taxonomy terms of parent node while in block ) 
我在drupal 7.让我们说我在网站上有一个块。网站页面是具有分类术语的节点。如何从我的街区编写以网站页面节点的分类条款? ...

0  用于自定义内容的存档页面  ( Archive page for custom content ) 
我想为自定义内容类型创建一个存档页面。基本上在单个页面上列出它们。 我了解我需要创建一个模块,并实现 hook_block_info() 和 hook_block_view() 。我不知道如何做是为了检索内容,所以我可以循环它。在Wordpress中,有 query_posts($post_type = mycust...

2  在Drupal 7中,“由Drupal供电”块的代码在哪里?  ( In drupal 7 where is the code for the powered by drupal block ) 
"由drupal供电" 块曾经是Drupal 6中的模块。我找不到Drupal 7中的这个模块。我在哪里找到这个模块/块?所以我可以复制它,或修改它。 ...

1  在块中显示自定义字段  ( Show a custom field in a block ) 
我疯了试图在侧栏块中显示自定义字段(现在在核心)的值。我试图用渲染函数来显示它,直接调用字段,没有运气。 我有一个名为"content1" 的自定义内容类型,以及名为"field_test1" 的自定义字段;我希望在查看页面节点时将在块上显示该值。 你有什么建议如何做到吗? ...

2  无论如何都要在hook_block_configure内获取$ form_state? [关闭]  ( Is there anyway to get the form state inside a hook block configure ) 
这个问题不太可能帮助任何未来的访客;它仅与小地理区域,特定时刻及时的特定时刻或非常狭窄的情况,这些情况通常不适用于互联网的全球观众。有关帮助提出这个问题更广泛适用,请访问帮助中心。 ...

1  您创建块的最佳模块,并从下拉下来选择节点以渲染?  ( Best module where you create a block and select a node from drop down to render ) 
自从我和Drupal 6玩过,现在已经很短暂,现在我在Drupal 7.7中潮湿了。 我需要能够创建一个简单的块,并在该块"配置" 区域中,我希望能够从下拉列表中选择系统中的节点。当该块呈现在XXXX页面上时,它将与设置的任何其他变量一起呈现该节点的预告片。 我认为我可以通过只创建一个块视图,用视图3.x来完成此目的...

1  涉及在Drupal 7中使用快速标签的自定义节点模板?  ( Custom node template involving the use of quick tabs in drupal 7 ) 
我有我想要显示的产品分为快速标签。我最初在考虑使用多个观点来执行此操作,但是我意识到必须使用节点 - product.tpl.php进行方法。它们被分开的方式如下: 一个快速标签,具有基本图像,标题和关于产品的一小段。 第二个选项卡应具有该产品的功能。 第三个应该是产品的描述。第四个应该是文件(图像和视频,音...

0  从网站的特定部分使用上下文模块排除块  ( Exclude a block from specific parts of the website with the context module ) 
我有一个在右侧栏上显示的视图/块。我不想在网站的特定部分上显示该块。 我知道有"特定页面上的show block - &gt;除了列出的所有页面,您可以在其中放置U​​RL的选项,但不应该出现,但它不起作用。 这个drupal网站正在使用上下文来绘制内容,因此问题可能存在;我认为我可以在上下文中以前解释的方式配置U...

27  如何在Page.tpl中插入搜索框? [关闭]  ( How can i insert search box in page tpl ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并阐明编辑此帖的问题。 closed 上个月。 ...

1  如何为原始,自定义前页布局定义自己的块地区?  ( How to define my own block regions for original custom front page layout ) 
我想为前页定义自己的块区域 我想拥有一个块网格,每个块包含最近的媒体列表(图片,youtube,音频),具有一定标签。请参见"Wireframe" 下面的ASCII艺术品 块的规则是,如果项目已经出现在一个块中,则它不会出现在其他块中(媒体项可以显然有多个标签)。 绘图后的问题。 +---------------...

3  向生产站点导出块[复制]  ( Export blocks to production site ) 
这个问题已经在这里有答案: 关闭 9年前。 可能的重复: 重新实现菜单和块(d7) 我需要一种方法可以轻松地将块配置从我的临时站点传输到现场站点。 我一直在努力为客户实施一个新的主题,并...

0  使用块添加自定义vars  ( Adding custom vars with a block ) 
我想用块的标题作为超链接(或者添加图像),我不知道我怎么能这样做。 我一直在寻找 block.tpl.php 。我知道我可以按照我想要的方式修改模板。 也许是这样做的方法是定义自定义变量,例如 print $message_html;0 。 如果定义变量,则存在一个链接,如果没有,没有。这种方法的问题是我不知道应该...

1  在别名访问内容而不重定向到原始内容位置  ( Access content at alias without redirecting to original content location ) 
有没有方法可以为内容生成别名而不使其重定向到原始内容位置,因此保留菜单位置? 例如 - 我有一个节点位于 http://mysite.com/oranges 但我"D也喜欢在 http://mysite.com/apples 而不被转发到原始URL 。 这可能吗?我知道,从SEO的角度来看,这不是理想的,但我们正在创...

3  hook_block_view每个请求的多次调用  ( Hook block view called multiple times per request ) 
我为实现hook_block_view的Drupal 7创建一个模块。我在钩子方法中打电话给看门狗,我注意到(在调试时)看门狗方法每页触发三次刷新。这是正常的,还是我应该担心的东西。由于每个调用该方法都会使数据库查询似乎这可能导致性能击中。 ...

2  带块的区域显示在Admin预览中,但不在现场  ( Region with block shows up in admin preview but not on site ) 
我是德鲁佩尔的新手,有点困惑。使用标准Bartik主题(Drupal Install 7.8)我在侧边栏上看到一个搜索栏。检查结构&gt;块它显示搜索包含在侧栏上的Bartik主题中。管理员显示搜索时预览。 但是,一旦我注销整个侧栏_散发区没有显示。只是内容区域。 编辑:在将登录框添加到侧栏时,它确实出现,搜索栏和...

1  如何在D7中使用自定义嵌入代码创建块?  ( How to create block with custom embed code in d7 ) 
我正在尝试使用D7中的以下嵌入代码创建自定义块: <form style="border:1px solid #ccc;padding:3px;text-align:center;" action="http://tinyletter.com/pumpbeat" method="post" target=...

1  QuickTabs模块直接链接[已关闭]  ( Quicktabs module direct links ) 
关闭。这个问题需要更多聚焦。它目前不接受答案。 想要改进这个问题?更新问题,因此它仅介绍了编辑此帖。 关闭 1年前。 ...

0  仅在登录特定用户时,才能显示块?  ( How to show a block only if a specific user is logged in ) 
我有一个用作菜单的块。并且块是动态创建的: $menu_block = array( 'module' => 'menu', 'delta' => 'clientmenu' . $account->uid, // the id of the block 'theme' => 'MYTHEM...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.