2011-04-13 79 views
0

我想通过Drupal CCk中的链接字段进行自定义验证。 我目前使用链接贡献模块。 所以在我的hook_nodeapi和案例验证 请注意,这个值接受无限值,这是一个foreach。Drupal CCK字段不验证使用hook_nodeapi

case 'validate': 
    if ($node->type == 'flow') 
    { 
     foreach ($node->field_post_twitter as $twitter_v) 
     { 
     $pattern = '/(http|https|ftp):[\/]{2}twitter\.com/i'; 
      if (preg_match_all($pattern, $twitter_v['url'])) 
      { 
      form_set_error('not working'); 
      } 
     } 
    } 
break; 

但它没有验证,而如果我把它放在一个正常的php文件它工作。 我错过了什么想法?

感谢

+0

缺乏PHP跟踪,你可以洒周围的一些“var_dumps()” troughout你的代码,看到的,从高至低,如果代码实际上跑了。或者,安装devel模块并用'dvm()'和devel模块提供的辅助函数替换var_dump。 “从高到低”表示:检查模块是否已加载,然后是否调用该函数,然后是否运行foreach等。 – berkes 2011-04-13 15:23:59

回答

0

尝试在你的数据库中的表system设置你的模块的重量最高的,所以你的钩子被调用最后,所有CCK领域 - 包括(field_post_twitter),这很可能尚未填充在情况 - 已经填充。

不要忘了清除缓存(drush cc)。

+0

这并没有解决问题。 – Valor 2011-04-13 11:59:06

1

您应该使用hook_form_alter来更改当前窗体的验证数组并添加到此数组自定义验证函数中。

function mymodule_form_alter(&$form, &$form_state, $form_id){ 
    switch($node->type){ 
    case 'test_node_form': 
     $form['#validate'][] = 'my_custom_validate'; 
     break; 
    } 
} 

function my_custom_validate($form, &$form_state){ 
    $values = $form_state['values']; 
    if(/* conditions */){ 
    $message = t('Oops!'); 
    form_set_error('', $message); 
    } 
} 
+0

你是否从$ form中拉出$ node?你没有表现出来。 – 2012-04-26 18:55:29