最近,需要在节点创建的时候需要在一个分类里同时创建和该节点标题相同的分类项,这时,就要用hook_nodeapi,在创建节点的时候用节点标题创建一个分类,在更新的时候更新分类的name。
按照一般思路,创建的时候用case 'insert';向tarm_data和term_hierarchy插入相应记录,添加分类。但是在编辑节点,更新的时候,使用case 'update'的,update是在节点刚被更新到了数据库中,也就是说在运行我们的代码的时候节点已经更新完了,那么如何才能把和我们之前节点标题相 同的分类与节点编辑同步更新呢?我的想法是能不能在update之前,把我们更新之前的标题存到一个变量, 然后在case 'update'的时候当做SQL语句的查询条件,用以达到同步更新的目的。但是经过一些尝试,发现做不到,但是却发现了另外一个很神奇的地方,解决了这 个问题。
case 'update': $node_old = node_load($node->nid); if($node_old->title != $node->title){ db_query("UPDATE {term_data} SET name = '%s' WHERE name = '%s'",$node->title,$node_old->title); } $tid = db_result(db_query("SELECT tid FROM {term_data} WHERE name = '%s'",$node->title)); foreach($node_old->taxonomy AS $key=>$value){ if($node->taxonomy[ARTICLE_VID]){ if($key != $node->taxonomy[ARTICLE_VID]){ db_query("UPDATE {term_hierarchy} SET parent = %d WHERE tid = %d",$node->taxonomy[ARTICLE_VID],$tid); } } else{ db_query("UPDATE {term_hierarchy} SET parent = %d WHERE tid = %d",,$tid); } } if(!$node_old->taxonomy){ db_query("UPDATE {term_hierarchy} SET parent = %d WHERE tid = %d",$node->taxonomy[ARTICLE_VID],$tid); } break;
在case 'update'的时候,用一个变量$node_old = node_load($node->nid);按理来说$node_old变量应该就是我们已经更新的节点,但是把这个变量打印出来,却是更新之前 的内容,这样,再用if判断更新前后标题是否更改,在运行sql语句更新term_data表里与更新之前标题相同的分类的name,同步更新的目的就达 到了。但是这个方法感觉是个取巧的方法,'update'在官网API上说的也很清楚,是已经更新到数据库中了,才会运行我们的代码,但是这样却取到了更 新之前的节点内容,这样会取到更新之前的节点的原因,还不清楚,有待研究。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。