Drupal 7以编程方式提交表单

时间:2013-11-18 14:38:08

标签: drupal-7

$form2_id = 'commerce_product_ui_product_form';

$form2_state['values'] = array(
    'sku' => 'xyz100',
    'title' => 'xyz',
    'commerce_price' => '355',
    'op' => t('Save Product')
 );

 drupal_form_submit($form2_id, $form2_state);

$form_errors = form_get_errors();
drupal_set_message('Form errors = '.$form_errors);

我没有错误,但有很多警告......而且数据没有保存到数据库中。

call_user_func_array()期望参数1是有效的回调,函数'commerce_product_product_form'未找到或drupal_retrieve_form()中的函数名无效

1 个答案:

答案 0 :(得分:3)

您显然正在尝试以编程方式将值提交到Drupal commerce生成的表单。这是一种不切实际的方法,因为Drupal商业的模块化架构:在提交表单之前,有很多步骤可以填充表单,即使您已经(正如您应该的那样)预先填写$form_state { {1}},您最终会在提交函数中出错。我试着修改你的代码,但没有用。

幸运的是,还有另一种方法,利用Drupal的实体,我必须将其归功于this post。您可以使用所选类型的Drupal commerce的产品对象创建实体元数据包装器:

  

$ wrapper = entity_metadata_wrapper('commerce_product',   commerce_product_new( '[PRODUCT_TYPE_MACHINE_NAME]'));

通过这种方式调用entity_metadata_wrapper,您可以创建一个属性包装器,通过它您可以访问drupal_get_form()实体; commerce_product使用必需的默认值创建实体实例。然后你可以这样做:

commerce_product_new('[PRODUCT_TYPE_MACHINE_NAME]')

请注意$wrapper->sku = 'xyz100'; $wrapper->title = 'xyz'; $wrapper->commerce_price->amount = 355; $wrapper->commerce_price->currency_code = 'USD'; 是结构化类型,并且需要commerce_priceamountcurrency必须是单位的百分之一,因此1.5 $的价格必须表示为150。 当您的实体完全填充任何其他属性时,您需要发出

amount

当我第一次阅读你的问题时,我认为“这应该很容易”......事实并非如此,我花了几个小时来弄明白。不过,这是值得的,因为我已经找到了一个更好的解决方案来处理Drupal中的实体(和节点......)。