如何执行函数的特定部分 -- 6 领域 和 nodes 领域 drupal 相关 的问题

How to Execute a Specific Part of a Function


0
vote

问题

中文

我在自定义模块中构建函数,我希望能够仅执行该函数的特定部分。

我从 hook_node_api 看看是否发生事件,如果发生该事件,则希望执行该自定义函数的特定部分。

  function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {   switch ($op) {      case 'presave'     if (  $node->type == 'property' ){         $old = node_load($node->nid);         if($old->field_realtor_reference[0]['uid'] == NULL && $node->field_realtor_reference[0]['uid'] !== NULL){                mymodule_tn_complete($node);           }       }        break;   }  }    function mymodule_tn_complete( $node) {   //Do something    //Do Something Else   }   
英文原文

I am building a function in a custom module, and I want to be able to execute only a specific part of that function.

I am starting with the hook_node_api to see if an event occurs, and if that event occurs, I want to execute a only a specific part of that custom function.

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {   switch ($op) {      case 'presave'     if (  $node->type == 'property' ){         $old = node_load($node->nid);         if($old->field_realtor_reference[0]['uid'] == NULL && $node->field_realtor_reference[0]['uid'] !== NULL){                mymodule_tn_complete($node);           }       }        break;   }  }    function mymodule_tn_complete( $node) {   //Do something    //Do Something Else   } 
     

回答列表

0
 
vote
vote
最佳答案
 

我个人可能会减少一些条件,因为在某些情况下,他们只是检查一个项目,并且基本上可以被放入相同的条件声明中。

  function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {   // Placed the $op and node type checks in the same conditional.   // There's no particular reason they have to be separated since   // the rest of the code is dependent upon both being TRUE.   if ($op == 'presave' && $node->type == 'property') {     $old = node_load($node->nid);      if($old->field_usera_ref[0]['uid'] != $node->field_user_ref[0]['uid']){       // Also, it is not necessary to assign the string to $type. You can       // just pass the string 'realtor_assign' directly without assigning it.       // Since your second parameter in the function signature is $type this       // string will automatically be assigned to it.       mymodule_tn_complete($node, 'realtor_assign');        }      if($old->field_userb_reference[0]['uid'] != $node->field_userb_ref[0]['uid']){       mymodule_tn_complete($node, 'am_assign');         }      if($old->field_userc_ref[0]['uid'] != $node->field_userc_ref[0]['uid']){       mymodule_tn_complete($node, 'trep_assign');        }    } }   function mymodule_tn_complete($node, $type) {   switch($type){      case 'realtor_assign':       //Do Stuff       break;      case 'am_assign':       //Do other stuff       break;      case 'trep_assign':       // Do different stuff       break;   }    }   

除了从经验中的个人偏好之外,我并不真正看到校长中的任何错误。看起来不错。此函数未进行任何数据库调用,因此它不应该放置在性能上的应变。实施钩子不应该这样做。即使您没有毫无疑问地实现其他模块也是如此。

 

I personally might reduce some of the conditionals as in some cases they're just checking one item and can basically be placed into the same conditional statement.

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {   // Placed the $op and node type checks in the same conditional.   // There's no particular reason they have to be separated since   // the rest of the code is dependent upon both being TRUE.   if ($op == 'presave' && $node->type == 'property') {     $old = node_load($node->nid);      if($old->field_usera_ref[0]['uid'] != $node->field_user_ref[0]['uid']){       // Also, it is not necessary to assign the string to $type. You can       // just pass the string 'realtor_assign' directly without assigning it.       // Since your second parameter in the function signature is $type this       // string will automatically be assigned to it.       mymodule_tn_complete($node, 'realtor_assign');        }      if($old->field_userb_reference[0]['uid'] != $node->field_userb_ref[0]['uid']){       mymodule_tn_complete($node, 'am_assign');         }      if($old->field_userc_ref[0]['uid'] != $node->field_userc_ref[0]['uid']){       mymodule_tn_complete($node, 'trep_assign');        }    } }   function mymodule_tn_complete($node, $type) {   switch($type){      case 'realtor_assign':       //Do Stuff       break;      case 'am_assign':       //Do other stuff       break;      case 'trep_assign':       // Do different stuff       break;   }    } 

Other than those personal preferences from experience, I don't really see anything wrong with it in principal. It looks good. This function is not making any database calls so it should not be putting must strain on the performance. Implementing the hook should not do that. Even if you're not implementing the hook other modules undoubtedly are.

 
 
1
 
vote

如果我正在读取你,你就会要求一个基本的程序流量控制问题。在PHP中,与大多数编程语言一样,您可以使用 switch if 等流量控制语句仅执行某些代码块,或将一些块移动到单独的功能中。

因为它是您自己的函数,您可以在此呼叫它完全取决于您如何处理它。当您获得体验时,您将学习方法来确定要分离成独特功能的方法以及将其刚刚使用 if 语句来控制。

使用 if 语句,您可能需要将参数添加到函数中,以便确定要执行的部分。

 

If I'm reading you right you're asking a basic program flow-control question. In PHP, like most programming languages, you can use flow control statements like switch and if to only execute certain blocks of code, or move some blocks into separate functions.

Since it's your own function you're calling here it completely up to you how to handle it. As you gain experience you'll learn ways to determine what to separate out into unique functions and what to just use if statements to control.

To use an if statement, you'll probably need to add a parameter to your function to let you determine which pieces to execute.

 
 
 
 
0
 
vote

好的 - 它似乎正在使用下面的代码......你能告诉我这个看起来还不错吗?另外,在数据库资源上备份沉重吗?该页面似乎现在运行较慢。

  function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {   switch ($op) {  case 'presave': if($node->type == 'property'){ $old = node_load($node->nid);  if($old->field_usera_ref[0]['uid'] != $node->field_user_ref[0]['uid']){ mymodule_tn_complete($node, $type = 'realtor_assign');    }  if($old->field_userb_reference[0]['uid'] != $node->field_userb_ref[0]['uid']){ mymodule_tn_complete($node, $type = 'am_assign');     }  if($old->field_userc_ref[0]['uid'] != $node->field_userc_ref[0]['uid']){ mymodule_tn_complete($node, $type ='trep_assign');     }  break;   }   } }   function mymodule_tn_complete( $node, $type) {         switch($type){           case 'realtor_assign':         //Do Stuff         break;          case 'am_assign':         //Do other stuff         break;          case 'trep_assign':         // Do different stuff         break;         }    }   
 

Okay - It seems to be working with the code below...can you tell me if this looks okay? Also, is presave heavy on the database resources? The page seems to be running slower now.

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {   switch ($op) {  case 'presave': if($node->type == 'property'){ $old = node_load($node->nid);  if($old->field_usera_ref[0]['uid'] != $node->field_user_ref[0]['uid']){ mymodule_tn_complete($node, $type = 'realtor_assign');    }  if($old->field_userb_reference[0]['uid'] != $node->field_userb_ref[0]['uid']){ mymodule_tn_complete($node, $type = 'am_assign');     }  if($old->field_userc_ref[0]['uid'] != $node->field_userc_ref[0]['uid']){ mymodule_tn_complete($node, $type ='trep_assign');     }  break;   }   } }   function mymodule_tn_complete( $node, $type) {         switch($type){           case 'realtor_assign':         //Do Stuff         break;          case 'am_assign':         //Do other stuff         break;          case 'trep_assign':         // Do different stuff         break;         }    } 
 
 

相关问题

4  在数据库中禁用CLEAT URL  ( Disable clean url in database ) 
我正在将一个站点从Apache迁移到IIS。 当我备份数据库清洁URL处于活动状态时,现在我的链接不起作用,我必须添加?q = 给他们!有些链接很好,但没有显示管理页面,它们显示一个白色屏幕! 如何禁用清洁的URL? 此外,我的图像用ImageCache定制了!他们返回一个破碎图像的链接。 ...

1  如何编辑地创建一个节点,添加菜单项,然后添加路径别名?  ( How do i programatically create a node add a menu item and add a path alias ) 
我正在使用drupal 6.我有一个外部数据库,我需要以某种方式变成节点,以便我们的drupal站点可以显示内容并使用solr搜索内容。我目前有一个模块,每次查看这些页面时都会显示页面并直接查询数据库。这不是最佳解决方案,因为当用户使用我们的搜索时找不到这些页面。 我知道我可以通过数据库项目迭代,创建$节点对象并使用...

1  启用优化JS文件的问题  ( Problem with enabling the optimizing js files ) 
我已安装事件和注册模块。事件显示在日历中。一切都在工作。但是,当我在性能页面上启用优化JS文件时,现在不会为匿名和身份验证用户显示事件。现在它们仅适用于管理员。 我再次禁用"性能" 页面上的优化JS文件,但仍未显示事件。 有人可以告诉我有什么问题吗? 我正在使用drupal 6。 ...

2  关于template.php不太确定  ( Not too sure about template php ) 
我主要是一个设计师,我现在一段时间一直在努力。在这一点上,我很乐意快速将我的设计转换为Drupal主题,但我继续怀疑如何使用template.php文件......我已经读过了一点,但我的理解它的有用性充其量是理论。 显然,它不是必需的文件,因为它从未阻止过我的主题在过去工作,但它是建议在所有情况下拥有一个?是否有...

0  如此注册用户无法为节点添加/编辑分类术语  ( Making it so registered users cant add edit taxonomy terms to nodes ) 
有没有办法添加许可,所以只有管理员可以在节点上添加/编辑分类术语?我尝试了 http://drupal.org/project/taxonomy_access ,但我并不真正想要完整的模块和在重建我的内容权限时,我收到了一个错误,因此模块甚至无法工作。 ...

1  将分类学特定的CSS文件添加到某些页面  ( Adding a taxonomy specific css file to certain pages ) 
我用多个子门户构建一个网页,所有这些都应该略有不同的CSS样式。 是否可以根据节点的分类方式添加某个CSS文件? drupal_add_css 可能? 我使用Drupal 6. 谢谢, 最大 ...

2  如何在多域网站上每个域设置别名?  ( How does one set up aliases per domain on a multi domain site ) 
我有一个网站,其中有几个域,每个域都有不同的内容: www.domaina.com www.domainb.com www.domainc.com 我想将别名foobar制作到每个域的不同路径 www.domaina.com/foobar => page/100/14 www.domainb.com...

2  规则:更新字段时触发规则的步骤  ( Rules steps to trigger a rule when a field is updated ) 
我正在使用规则模块在更新特定CCK字段 998876618 时发送电子邮件。这些是我执行的步骤: /home9 在字段下,我选择 example.com/0 。 在我选择作为电子邮件的行动。 我的问题是,即使在该内容类型下更新任何其他字段,它仍然会触发我的规则,在调试下,它显示条件 example.com/1...

2  Drupal 6按压流迁移:Myisam到InnoDB?  ( Drupal 6 to pressflow migration myisam to innodb ) 
我很快就会从Drupal 6迁移到压力。随着PressFlow鼓励某些表的InnoDB,如何在迁移现有网站时促进这些建议? 是这个update.php处理的东西? 此外,由于我的Drupal网站不是最新的Drupal核心版本,我应该先更新到最新的核心,然后侧向相应的压流版本,或者我可以直接从6.19开始按下6.22?...

1  禁用形式重定向  ( Disable form redirect ) 
我想禁用形式重定向。 $form['#redirect'] = FALSE; $form_state['#redirect'] = FALSE; 这些都不是那些作品。 如何关闭形式重定向?我想看看 $form_values 的输出。 ...

1  $ form_state用于自动完成回调  ( Form state for an autocomplete callback ) 
我正在尝试获取 $form_state 的值为我的autocomplete textfield。 基本上,我有一个搜索文本字段和复选框来限制自动完成。将复选框值传递给自动完成的最佳方式是什么? ...

0  查看标题格式化的参数  ( Views arguments formatted nicely for the title ) 
我知道你可以在视图的标题中获得参数并格式化它,以便它是有意义的,以便像"搜索 - 某些东西" 这样的论点可以作为"搜索某些东西" 。 我有一个像"参数 - 这里" 一样的参数,我需要在数据库中搜索那个确切的短语。 问题是,为了使其在标题中更好地格式化为"参数" ,这也删除了SQL查询中的短划线 - 导致我的视​​图返...

4  如果我使用node_save()创建一个新节点,我是否需要手动转义用户输入?  ( If i use node save to create a new node do i need to manually escape user inp ) 
我正在为drupal 6编写一个自定义模块,以编程方式使用node_save()创建一个节点。 各种自定义节点字段来自用户输入 - 是否有必要手动转义这些字段,或者Node_Save()将为我提供保养吗? ...

1  如何确定请求是否会导致成功的HTTP请求?  ( How to determine if request will result in a successful http request ) 
这里有两个部分问题。 模块中的正确方法是确定页面请求是否导致HTTP 200确定?通过<代码> static $stored_headers 为30x / 40x / 50x似乎是错误的。 最早的钩子是什么可以从中可靠地做到这一点? ...

0  将CCK字段添加为调速系数到Drupal标准搜索  ( Add cck field as scoring factor to drupal standard search ) 
所以,默认情况下,Drupal中有四个评分因子: 关键字的相关性 新兴 评论数量 页面浏览量 我希望能够控制特定CCK字段的相关性。 在我的情况下,我有一个CCK字段(计算字段),其中所有相关的搜索数据都会求出。 我希望能够将这个特殊的领域提供更高的相关性,而不是其他任何东西。 是否有可能这样做? ...

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

0  使用Acquia为生产网站和运行WordPress同时运行  ( Using acquia for a production site and running wordpress concurrently ) 
我一直在Drupal 6上为我的图书馆建立一个网站,使用我的本地机器上的Acquia Installer包,Win7 PC。我也需要在我的本地机器上运行2-3个WordPress博客,在同一台机器上,以及当所有内容迁移到我们的服务器2008 / IIS 7机器时。 我现在需要沟通默认安装程序,同时仍然在开发中才能运...

3  Ckeditor简单图像上传功能  ( Ckeditor simple image upload functionality ) 
我想拥有一个简单的一键式映像上传功能与ckeditor。我正在使用D6和CKEDITOR 3.6.1。我不希望服务器文件浏览功能,只能从用户自己的计算机上载图像。 我已经彻底搜索了这个主题,并尝试过不同的建议方法。它似乎是最适合我的需求的解决方案正在安装IMCE模块和CKFINDEL插件,用于CKEDITOR模块。...

0  模块将显示某些Facebook内容?  ( Module that will display certain facebook content ) 
我意识到有很多Facebook可能性主要与Facebook帐户连接有关。我很感兴趣,是内容(尤其是视频!)正在创建并在Drupal网站上创建和具有该显示的Facebook组。那里有一个模块吗? ...

1  按特定内容类型显示节点计数器?  ( Display a node counter by specific content type ) 
如何显示计数器。新闻总数:999,博客总帖子:123等? (实际上寻找D6解决方案) ...




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


Licensed under cc by-sa 3.0 with attribution required.