[development] How to validate a $node?

Robrecht Jacques robrechtj+drupal at gmail.com
Wed Jun 7 01:15:27 UTC 2006

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

  // 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.

Anyway, I have a solution, but that is so hackerish that I hope others know
"The Right Solution(tm)".

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.drupal.org/pipermail/development/attachments/20060607/210ca89e/attachment.htm

More information about the development mailing list