Drupal 7 hook_form_alter并提交表单

时间:2016-06-13 20:57:07

标签: php mysql forms drupal

我添加了一些自定义字段,以便当有人注册到网站时我可以获得更多信息,但我想更改表单上的一个字段。我创建了一个具有hook_form_alter函数的模块,以便我可以更改注册表单的field_first_name。这是代码

function user_registration_form_alter(&$form, &$form_state, $form_id){
if ($form_id == 'user_register_form'){

    $form['field_first_name'] = array(
        '#type' => 'textfield',
        '#title' => t('First Name'),
        '#description' => t('Enter your first name.'),
        '#maxlength' => 255,
        '#required' => TRUE,
        );



}
if (isset($form['actions']['submit'])) {
 $form['actions']['submit']['#submit'][] ='user_registration_form_submit';
   }

}

我还创建了一个处理表单提交的函数。

function user_registration_form_submit(&$form, &$form_state)
{


$fe_id = db_insert('field_revision_field_first_name')
    ->fields(array(
        'field_first_name_value' => $form_state['value']['field_first_name'],
        ))->execute();
    drupal_set_message(t('your form entry has been added'));
}

我的问题是,当我提交表单并检查用户详细信息时。我发现数据库中不存在名字详细信息,或者当我以管理员身份登录并点击“人员”时链接。我发现所有信息都被提交,除了我想要改变的名字字段。我也尝试在没有表单提交功能的情况下提交表单,但它仍然无效。

如果我添加form_submit函数

,我会收到以下错误消息
  

注意:未定义索引:user_registration_form_submit()中的值(/var/www/html/lite/sites/all/modules/user_regestration/user_registration.module第37行)。

     

PDOException:SQLSTATE [HY000]:常规错误:1364字段' entity_id'   没有默认值:INSERT INTO   {field_revision_field_first_name}(field_first_name_value)VALUES   (:db_insert_placeholder_0);数组([:db_insert_placeholder_0] =>)in   user_registration_form_submit()(第38行)   /var/www/html/lite/sites/all/modules/user_regestration/user_registration.module)。

这是我的代码第37和38行

'field_first_name_value' => $form_state['value']['field_first_name'],
))->execute();

我首先在localhost上创建模块,然后再将其推送到实时网站

2 个答案:

答案 0 :(得分:2)

首先,它的不值。

为什么不使用提供此功能的模块,例如inception_train.py

用户不是在submithandler中创建的,所以要么保存它:

function foo_user_register_form_submit($form, &$form_state){
    $edit = array(
          'name' => $form_state['values']['name'], 
          'pass' => user_password(),
          'mail' => $form_state['values']['mail'],
          'init' => $form_state['values']['mail'], 
          'status' => 1, 
          'access' => REQUEST_TIME,
          'field_first_name' => array(LANGUAGE_NONE => array(array('value' => $form_state['values']['field_first_name']))),
    );
    user_save(drupal_anonymous_user(), $edit);
}

有关详细信息,请参阅profile2

或者您可以尝试在form_alter中添加自定义提交处理程序,该处理程序将在创建用户后触发:

$form['#submit'][] = 'your_custom_submit_handler_function';

在那里应该已经创建了用户。这样:

function your_custom_submit_handler_function(&$form, &$form_state)
    {
        $fe_id = db_insert('field_revision_field_first_name')
        ->fields(array(
            'field_first_name_value' => $form_state['values']['field_first_name'],
            ))->execute();
        drupal_set_message(t('your form entry has been added'));
    }
  

但请记住,这个自定义插入可能需要更多   代码,这里只添加修订条目..

答案 1 :(得分:1)

您没有传入entity_id,并且您的数据库架构未定义默认值。数据库需要一个,所以它失败了,并且插入失败 - 这是你的第37和38行。它与你的名字部分完全无关。

基本上,Drupal(技术上是MySQL,或者你的数据库后端是什么)不知道你试图将该字段与之关联的实体。

请查看您实际放入信息的表格,并确保架构具有默认设置

类似的东西:

db_insert('field_revision_field_first_name')
        ->fields(array(
            'field_first_name_value' => $form_state['values']['field_first_name'],
'entity_id' => 1,
            ))->execute();

对你来说可能会更好。可能还有其他必填字段。我建议您查看数据库架构。

您也不必为此定义自定义表单 - 您可以向用户添加字段,并且还有profile2作为另一张提到的海报。