Submitted by raggad on
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;
Bonjour, N’aillant pas trouvé
Permalien Soumis par Jben le 15 Mai, 2012 - 16:01
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
Permalien Soumis par raggad le 15 Mai, 2012 - 16:30
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
Permalien Soumis par Jben le 15 Mai, 2012 - 16:46
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 ;)