好久没写drupal的文章了,最近接了个项目,项目的源码和项目的目的等出于保密当然是不能公布的,但程序的逻辑分享一下。
客户要求:限制1用户只能引用一次特定的node(当然,这里有CCK的node reference字段).例如:USER-A 建立node1引用了nodeB后,他以后再也不能创建node2去引用nodeB了。
注:以往我都用drupal 6的,这次是第一次写drupal 7的模块,不过发现,没太大变化,建议如果真想学好drupal的朋友,要学好“print_r”和“db_query”这两个个函数,具体可看我以前的drupal anywhere :http://www.trackself.com/archives/551.html
1.要首先找到控制node表单(form)验证(validate)的hook,于是google : hook node validate drupal 7 马上就找到hook_node_validate的页面
看看解析,果然适合:下面就和drupal6几科没差别了,$node的结构改了,于是要用print_r($node);查看一下结构
2.构建SQL:查找uid是当前用户的uid的并且已经关联过该nid的----根据需要构建即可。
3.debug的时候出错:发现drupal 7的db_query已经异于drupal6,但换汤不换药,查一下db_query的api说明文档就知道如何做了
于是就得到了下面的函数(为保护用户数据,一些字段我改成XXX了,函数不要复制,参考就好)
function XXX_node_validate($node, $form, &$form_state) {
if($node->type==”YYYY”){
/*
print “<pre>”;
print_r($node);
print “</pre>”;
*/
$uid=$node->uid;
$reffernid=$node->field_QQQQ['und'][0]['nid'];
//下面找出同时存在:field_QQQ_nid是$reffernid然后又是由uid是$uid的项
$sql=”
SELECT n.nid FROM {node} n
LEFT JOIN {field_revision_field_QQQ} f on f.entity_type=’node’ AND n.nid=f.entity_id
WHERE n.uid=”. $uid . ” AND field_QQQQ_nid=”.$reffernid;
$db=db_query($sql);
if($db->fetchObject()){
/*
print “<pre>”;
print_r($db);
print “</pre>”;
*/
form_set_error(‘field_QQQQ’, t(‘you could not post’));//error message
}
}
}