$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()中的函数名无效
答案 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_price
和amount
。 currency
必须是单位的百分之一,因此1.5 $的价格必须表示为150。
当您的实体完全填充任何其他属性时,您需要发出
amount
当我第一次阅读你的问题时,我认为“这应该很容易”......事实并非如此,我花了几个小时来弄明白。不过,这是值得的,因为我已经找到了一个更好的解决方案来处理Drupal中的实体(和节点......)。