[development] Creating a user and assigning a node in the node's submit callback.

Ken Rickard agentrickard at gmail.com
Wed Jan 13 17:44:50 UTC 2010


FYI.

This is a quirk (?) in node_submit() when a user can 'administer
nodes'. Typically, this happens when your form is being run by user 1
or another super user.

See: http://api.drupal.org/api/function/node_submit/6

- Ken

On Wed, Jan 13, 2010 at 10:46 AM, Brian Vuyk <brian at brianvuyk.com> wrote:
> Just to follow up on the original post...
>
> The reason this wouldn't save is because of this little code block in
> node_submit() which is called by the node_form_submit() submit handler,
> which executes after my custom submit handler:
>
> if ($account = user_load(array('name' => $node->name))) {
>  $node->uid = $account->uid;
> }
>
> Setting $form_state['values']['name'] to the new account's name caused the
> right uid to be assigned.
>
> Thanks for the responses and suggestions, all of you!
>
> Brian
>
> On 10-01-12 04:24 PM, Brian Vuyk wrote:
>>
>> Hi all.
>>
>> I've been trying to get a bit of code working, and I would appreciate a
>> set of eyes.
>>
>> Basically, I have a content type ('profile') which has fields for user
>> account details. If they are filled out, and a 'Create account' checkbox is
>> checked, a user account is created with those details, and the profile node
>> should be assigned to the newly-created user instead of the user creating
>> the node.
>>
>> The issue is that, while the new user is created properly in the submit
>> hook, the last line in the submit callback where I override the 'uid' value
>> from the form values doesn't work - the node just saves with the user's uid
>> instead of the uid of the new account that is specified on the last line.
>>
>> Does anyone have any idea how to make this work?
>>
>> Thank you in advance for anyone that can suggest a solution!
>>
>> Brian
>>
>> <?php
>> function mymodule_form_profile_node_form_alter(&$form, &$form_state) {
>>  // Add our submit handler. We use array_unshift to prepend it, as we want
>> it
>>  // to execute before the regular node form submit handler.
>>  array_unshift($form['buttons']['submit']['#submit'],
>> 'mymodule_profile_form_submit');
>> }
>>
>> // Submit the user account creation fields in the profile_node_form.
>> function mymodule_profile_form_submit($form, &$form_state) {
>>
>>  // Create the user account.
>>  if ($form_state['values']['create']) {
>>    $account['name'] = $form_state['values']['username'];
>>    $account['mail'] = $form_state['values']['mail'];
>>    $account['pass'] = $form_state['values']['pass'];
>>    $account['status'] = 1;
>>    $account = user_save(array(), $account);
>>
>>    // Now set the uid of the profile node to be owned by this new account.
>>    $form_state['values']['uid'] = $account->uid;
>>  }
>> }
>> ?>
>
>



-- 
Ken Rickard
agentrickard at gmail.com
http://ken.therickards.com


More information about the development mailing list