[development] How to validate a $node?

Jim Riggs drupal-lists at jimandlissa.com
Wed Jun 7 01:52:33 UTC 2006


Robrecht -

You can take a look at my quotes.module.  It can import several  
quotes through a single node submission form.  Although the concept  
is a bit different from what you are doing, it does have to  
individually validate and submit each quote.  You might be able to  
get some hints from it...or give me some hints if you see problems  
with my code!  ;-)

- Jim


On 6 Jun 2006, at 20:15, Robrecht Jacques wrote:

> Hi all,
>
> For the node_import module which tries to import a whole set of  
> nodes from a CSV file, I have the following problem: how does one  
> validate a "$node" before "node_save()"ing it?
>
> Let me explain:
>
> In 4.6 we had the "node_validate($node)" function which validates  
> the node (calling "hook_validate()" and "hook_nodeapi('validate')"  
> as needed). If this was succesful (no "form_get_errors()"), then we  
> could safely "node_save($node)" it.
>
> Now, in 4.7, most (if not all) validation is done using the form  
> API, in things like "#validate" and "#required". For example,  
> "story.module" requires that the title is not empty. It does that  
> by setting a "#required" on the title-textfield. If I do:
> $node = (object) array('type' => 'story', 'uid' => 42, 'title' => '');
> the node will pass "node_validate($node)", but this is because the  
> validation inside "$form" was not run!
>
> So my questions are:
> - how does one validate a node programmatically *correctly*?
> - what is the point of the "node_validate()" function and the hooks  
> if it doesn't actually *validate* the node at all? At least rename  
> it to "node_noop()" so things are clear.
> - really, why have "node_validate()" at all? Does anyone do  
> anything usefull in it?
> - and the real question: how does the following sequence of 4.6  
> translate into 4.7:
> $node->type = 'story';
> $node->uid = 1;
> $node->title = ''; // invalid empty title!
> $node->body = ''; // invalid empty body!
>
> $node = node_validate($node); // if life was only that
> // that easy in 4.7...
>
> if (form_get_errors()) {
> // we detected the error... do something
> unset($GLOBALS['form']);
>
> // note: we unset $GLOBALS['form'] so the next time we
> // try this trick, form_get_errors() return the errors
> // of the last run and not of the previous.
> // If something like this would be possible in 4.7 it
> // would be great, but form_set_error() in 4.7 saves the
> // errors in a static variable inside form_set_error()
> // instead of in $GLOBALS['form']. I see no way to unset
> // that...
> $output .= node_view($node);
> }
> else {
> // no errors? hmm, great, save it... quickly before
> // "they" introduce something else that breaks
> // "common sense". Really: why call something
> // foobar_validate() if it doesn't validate anything
> // at all... Am I alone in this? I guess so.
> node_save($node);
> }
>
> Anyway, I have a solution, but that is so hackerish that I hope  
> others know "The Right Solution(tm)".
>
> Thanks,
> Robrecht



More information about the development mailing list