The problem here is really important, regardless of the documentation. In Drupal 7, the problem has been resolved (and the doc may well be wrong). In D7, hook_form_alter() and hook_form_FORMID_alter() no longer compete in the inappropriate way they did in D6 - they fire in order by weight. So a given module weight will execute the form_alter and the formid_alter at about the same time. In Drupal 6, you *very* often can't achieve what you want to with hook_form_FORMID_alter() because *all* of the hook_form_alters run after all of the hook_form_FORMID_alters. That means that you *can't* alter a prepared node form successfully with hook_form_FORMID_alter() because all of the things that have built up the form (using hook_form_alter()) haven't run yet. So the form doesn't even look right yet. hook_form_alter() is often the only way around this. As a general statement, hook_form_FORM_ID_alter() in Drupal 6 is often not useful because of this and you *always* have to be aware of this problem. And in general, this problem is fixed very nicely in Drupal 7. Thanks effulgentsia and sun! -Randy On Tue, Jan 18, 2011 at 5:37 PM, Jennifer Hodgdon <yahgrp@poplarware.com>wrote:
I just filed an issue: http://drupal.org/node/1031458
The doc is only incorrect in D6. In D7 the order has changed.
--Jennifer
On 1/18/2011 7:37 AM, Justin Ellison wrote:
Code speaks truth, you're correct. However, there's some contradicting documentation.
From
http://api.drupal.org/api/drupal/modules--system--system.api.php/function/ho... :
"For each module (in system weight order) the general form alter hook implementation is invoked first, then the form ID specific alter implementation is called."
From
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_fo... :
"Note that this hook fires before hook_form_alter(). Therefore all implementations of hook_form_FORM_ID_alter() will run before all implementations of hook_form_alter(), regardless of the module order."
Unfortunately, Google returns the former link first, which must've been what I learned from.
Sorry for any confusion,
Justin
On Tue, Jan 18, 2011 at 9:26 AM, Steve Ringwood<nevets@tds.net> wrote:
Justin
Not sure what you are referring to in the docs for hook_form_alter but here is the relavent code from form.inc, function drupal_prepare_form().
$data =&$form; $data['__drupal_alter_by_ref'] = array(&$form_state); drupal_alter('form_'. $form_id, $data);<< Form ID specific call
// __drupal_alter_by_ref is unset in the drupal_alter() function, we need // to repopulate it to ensure both calls get the data. $data['__drupal_alter_by_ref'] = array(&$form_state); drupal_alter('form', $data, $form_id);<< General call (hook_form_alter)
Nevets
-- Jennifer Hodgdon * Poplar ProductivityWare www.poplarware.com Drupal web sites and custom Drupal modules
-- Randy Fay Drupal Module and Site Development randy@randyfay.com +1 970.462.7450