2013-11-18 5 views
0
$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); 

У меня нет ошибок, но много предупреждений ... и данные не сохраняются в db.Drupal 7 programatically submit form

call_user_func_array() ожидает параметр 1, чтобы быть действительным обратного вызова, функция «commerce_product_product_form» не найден или недопустимое имя функции в drupal_retrieve_form()

ответ

3

Вы, видимо, пытаются программно представить значения в Drupal commerce сгенерированной формы. Это непрактичный подход из-за модульной архитектуры торговли Drupal: есть несколько шагов, которые заполняют форму до ее отправки, и даже если бы у вас было (как и должно было быть, в любом случае) prepoulate $form_state с drupal_get_form(), вы бы закончили с ошибками в функции отправки. Я попытался исправить ваш код, но безрезультатно.

К счастью, существует еще один подход, использующий сущности Drupal, для чего я должен одолжить this post. Вы можете создать оболочку метаданных объекта с объектом коммерции в Drupal продукта выбранного типа:

$ обертка = entity_metadata_wrapper ('commerce_product', commerce_product_new ('[PRODUCT_TYPE_MACHINE_NAME]'));

Вызывая объект entity_metadata_wrapper таким образом, вы создаете оболочку свойств, с помощью которой вы можете получить доступ к объекту 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 требуется. amount должен быть в сотых долях единицы, поэтому 1,5 $ цена должна быть выражена как 150. Когда объект полностью заполнен любой другой собственности, вам необходимо оформить

$wrapper->save(); 

Когда я впервые прочитал ваш вопрос подумал: «Это должно быть легко» ... Это было не так, и я потратил несколько часов, чтобы понять это. Однако это стоило того, потому что я нашел гораздо лучшее решение для обработки сущностей (и узлов ...) в Drupal.

+0

Я тоже пытался использовать drupal_get_form(), но не повезло. Это элегантное решение. – dlats

Смежные вопросы