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