Create new products with external data

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,
je developpe un module qui va me permettre de synchroniser les données des produits sur les deux bases drupal et openerp,
j'importe les données de openerp, mais pour l'intégrer dans drupal, il faut créer des informations comme les prix et le types de produits pour pouvoir l'intégrer dans la base.
j'utilise le hook login pour déclencher la synchrnisation quand le user se connecte, j'arrive a inserer les données dans la base drupal, mais , les autres informations comme me prix et le type de produit sont pas enregistrées.

voici le code
function product_list_user_login(&$edit, $account) {
...
...
...
}
$records = array(
'sku' => 'test',
'status' => TRUE,
'uid' => $GLOBALS['user']->uid,
'title' => 'test',
);
$product_id = product_list_product_insert($form_state['values']['product_type'], $form_state['values']['price'], $records);
drupal_set_message(t('Created sample product with title !title and sku !sku', array('!title' => l($records['title'], 'admin/commerce/products/' . $product_id), '!sku' => $records['sku'])));

return 'new product OK!!!!!';
}

function product_list_product_insert($product_type, $price, $records) {
$form_state = array();
$form_state['values'] = array();
$form = array();
$form['#parents'] = array();

// Generate a new product object
$new_product = commerce_product_new($product_type);

$new_product->status = $records['status'];
$new_product->uid = $records['uid'];

$new_product->sku = $records['sku'];
$new_product->title = $records['title'];
$new_product->created = $new_product->changed = time();

//commerce_price[und][0][amount]
$price = array(LANGUAGE_NONE => array(0 => array(
'amount' => $price * 100,
'currency_code' => commerce_default_currency(),
)));
$form_state['values']['commerce_price'] = $price;

// Notify field widgets to save their field data
field_attach_submit('commerce_product', $new_product, $form, $form_state);

commerce_product_save($new_product);
return $new_product->product_id;

Forum : 

Bonjour,

N'aillant pas trouvé ton erreur, je me permet de te donner le code que j'utilise pour insérer un produit programmatiquement, j'espère que ça te servira:

/** Preparation des champs en vue de l'insertion **/

//L'id de l'utilisateur ayant référencé le produit sera celui de l'admin
$extras['uid'] = 1;
//Le status permet de savoir si le produit va etre affiché ou non
$extras['status'] = 1;
//Nom du produit
$extras['sku'] = $articleName;
//Nom de la "gamme"
$extras['title'] = $articleModel;
//Prix de vente du produit
$values['price'] = $articlePrice;
//Date de creation
$values['due_date'] = (mktime(0, 0, 0, date("m") , date("d"), date("Y")));

$values['original_order']='';
$values['original_line_item']='';
$values['original_product']='';
commerce_installments_create_product('product',$values,$extras);

}

//Fonction permettant d'inserer en base le produit
function commerce_installments_create_product($product_type, $values, $extras) {
$form_state = array();
$form_state['values'] = $values;
$form = array();
$form['#parents'] = array();

// Generate a new product object
$new_product = commerce_product_new($product_type);

$new_product->status = $extras['status'];
$new_product->uid = $extras['uid'];

$new_product->sku = $extras['sku'];
$new_product->title = $extras['title'];
$new_product->created = $new_product->changed = time();

// field_original_order[und][0][target_id]
$order = array(LANGUAGE_NONE => array(0 => array('target_id' => $values['original_order'])));
$form_state['values']['field_original_order'] = $order;

// field_original_line_item[und][0][target_id]
$line_item = array(LANGUAGE_NONE => array(0 => array('target_id' => $values['original_line_item'])));
$form_state['values']['field_original_line_item'] = $line_item;

$product = array(LANGUAGE_NONE => array(0 => array('target_id' => $values['original_product'])));
$form_state['values']['field_original_product'] = $product;

//commerce_price[und][0][amount]
$price = array(LANGUAGE_NONE => array(0 => array(
'amount' => $values['price'],
'currency_code' => commerce_default_currency(),
)));
$form_state['values']['commerce_price'] = $price;

// field_due_date[und][0][value][date]
$due_date = array(LANGUAGE_NONE => array(0 => array('date' => $values['due_date'])));
$form_state['values']['field_due_date'] = $due_date;

// Notify field widgets to save their field data
field_attach_submit('commerce_product', $new_product, $form, $form_state);

commerce_product_save($new_product);
return $new_product->product_id;

}

merci jben, j'ai deja résolu le problème, j'ai fait presque comme toi,
en fait la j'ai un petit soucis pour changer les prix dans la vue drupal,
j'ai créé une vue qui affiche tout les produits et leurs prix,
moi je dois aller chercher mes prix sur une liste de prix sur openerp, et je veux que la vue affiche plutôt les nouveaux prix, pas ceux dans la base drupal.
en fait j'ai développer un module qui utilise un hook_view ( je sais pas encore quel hook : view_alter ou view_pre-render), et normalement ce hook devrait déclencher mon module pour calculer les nouveaux prix et les afficher ds la vue drupal sans changer les prix par défaut ds la base drupal.

voila merci de m'ecrire si t'as une idée sur ce problème, je reste a ta disposition pour autre informations

merci

De rien ;)
Si c'est pour le choix du hook, je te conseille le "view_alter" plutôt que le " view_pre-rendre" pour 2 raisons. Je ne suis pas expert en drupal mais il me semble que c'est plus propre de faire du traitement dans le view_alter que dans le pre-render. Deuxièmement, dans le pre-render, tu auras accès a beaucoup moins de variables que dans le view_alter (il me semble que tu auras accès uniquement aux variables de la vue).

Voila si c'était sur autre chose que ta question portait hésite pas ;)