如何执行函数的特定部分 -- 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   }   
english

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;         }    } 
 
 

相关问题

0  将内容类型添加到每个视图行的类  ( Adding content type to the class of each views row ) 
我有一个视图,有一个过滤器只能从2种内容类型中拉出结果。我希望每个视图条目都有一个显示节点内容类型的类。我该怎么做? ...

2  如何以编程方式修改以编程方式创建的内容类型?  ( How do you programmatically modify a programmatically created content type ) 
我正在创建一个有许多内容类型的Drupal 7站点,这些内容类型是以编程方式定义的。很可能在启动后,我需要略微修改一些内容类型。在开发过程中,每当我需要进行更改时,我只卸载模块,就会在代码中进行更改,然后重新安装它。在数据需要保持稳定的生产环境中,这显然是不可接受的。 如何以编程方式修改我的现有内容类型之一?此外,...

0  如何执行函数的特定部分  ( How to execute a specific part of a function ) 
我在自定义模块中构建函数,我希望能够仅执行该函数的特定部分。 我从 hook_node_api 看看是否发生事件,如果发生该事件,则希望执行该自定义函数的特定部分。 function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { switch...

0  在菜单项上显示类型的节点:Drupal 7  ( Display nodes of types on a menu item drupal 7 ) 
我已经创建了一些类型的书籍,现在我想在菜单项上显示其中一些。我怎样才能在没有使用视图的情况下做到这一点? mome |书籍|.阿里克里| 节点类型:(机器名称:书籍) 例如,上面是我的菜单结构。当用户点击书籍时,它将显示我创建的一些书籍。 ...

3  如何在分层上订购节点的分类术语?  ( How to order a nodes taxonomy terms hierarchically ) 
是默认顺序排序的节点的分类数组中的术语? 如果不是,那么最有效的方法是什么? ...

0  视图显示引用节点  ( Views show referencing nodes ) 
我有一个称为"问题" 的自定义内容类型,少数人,"a" ,"b" ,"c" 。 (实际上,命名是无关紧要的)。 以下内容类型"a" ,"b" ,"c" 中的每一个都具有一个字段,该字段是引用具有内容类型"问题" 的特定节点。 我想做的是在一个查看所有问题和旁边的每个问题旁边,引用节点的标题(带有链接到节点)。 应该采...

3  如何仅列出视图中所有节点的最新版本?  ( How to list only the latest revision of all nodes in a view ) 
我目前有一个view,列出了所有节点,这是我们对内容仪表板的使用。它显示最近更新的节点,他们的工作流状态和其他一些细节。 我们似乎拥有的问题是,我们使用的修改,每次用户更新节点时,我们都会创建新的待处理版本。当用户更新节点时,工作流状态(自定义CCK字段)会自动切换到 repysid 。由于当前已发布的节点具有工作流...

4  使用参数创建节点  ( Node creation with parameters ) 
我有一种表单,当提交和验证时,需要重定向到页面以创建节点(节点/添加/ factura-tmn),但我想向此页面发送参数。是否有可能? 我目前有以下代码: function add_invoice_file_form_submit($form, &$form_state) { $form_state['red...

-1  Drupal 7在节点创建后自动创建和填充每个节点的字段引用  ( Drupal 7 automatically create and populate a field reference per node after node ) 
如何在创建节点(内容类型A)之后自动创建多个节点(内容类型B),然后与节点(内容B)的关系到节点(内容类型A) 谢谢 ...

1  如何获得浏览量行的NID? [关闭]  ( How to get nid of views row ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并阐明编辑此帖子的问题。 关闭去年。 ...




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