Como actualizar el stock de un listado de productos en Drupal Commerce

  • Posted on: 17 August 2018
  • By: santy

Recientemente me ha pedido que actualice es stock de un Drupal Commerce a un archivo csv suministrado por el proveedor. La tienda virtual usa drupal commerce y el modulo commerce stock que a su vez usa la api de stock de drupal.

La idea basicamente es crear unos productos los cuales se les pueda actualizar es stock. Para ello lo primero es crear un modulo que permita crear un producto nuevo, a su vez además de crear la variante de producto y el producto, nos añadirá en una tabla nueva de la base de datos la entity_id del producto un nuevo cambo que le llamaré id_ociostcok y el stock actualizado del producto.

Tenemos que crear la siguiente tabla. la cual cada vez que se ejecute el cron el programa repasará la tabla producto por producto

mysql_stock_commerce.png

de tal forma que cada vez que creamos un producto nuevo se añade un campo a la tabla field_data_commerce_update_stock

El siguiente codigo gran parte extraido del modulo commerce_examples concretamente del submodulo product_example

function product_example_info_page($form, &$form_state) {
$form['explanation'] = array(
'#type' => 'item',
'#markup' => t('This example demonstrates product creation and manipulation.'),
);
$form['product_creation'] = array(
'#type' => 'fieldset',
'#title' => t('Please create a product for use with this example'),
);
$types = commerce_product_types();
$form['product_creation']['product_type'] = array(
'#type' => 'select',
'#title' => t('Product type for product to be created'),
'#options' => drupal_map_assoc(array_keys($types)),
);
$form['product_creation']['title'] = array(
'#title' => t('Product title'),
'#type' => 'textfield',
'#default_value' => t('A dummy product for use with product_example'),
);
$form['product_creation']['price'] = array(
'#title' => t('Product price'),
'#type' => 'textfield',
'#description' => t('A price in decimal format, without a currency symbol'),
'#default_value' => '100.00',
);
$form['product_creation']['ociostock'] = array(
'#title' => t('Product Ociostock id'),
'#type' => 'textfield',
'#default_value' => t('1'),
);
$form['product_creation']['product_creation_submit'] = array(
'#type' => 'submit',
'#value' => t('Create product'),
'#submit' => array('product_example_product_creation_submit')
);
return $form;
}

function product_example_product_creation_submit($form, &$form_state) {
$extras = array(
'sku' => 'product_example_' . drupal_hash_base64(microtime()),
'status' => TRUE,
'uid' => $GLOBALS['user']->uid,
'title' => $form_state['values']['title'],
'id_ociostock' => $form_state['values']['ociostock'],
);
// Use the product example's creation function to create a product.
$product_id = product_example_create_product($form_state['values']['product_type'], $form_state['values']['price'], $extras);
drupal_set_message(t('Created sample product with title !title and sku !sku', array('!title' => l($extras['title'], 'admin/commerce/products/' . $product_id), '!sku' => $extras['sku'])));
}

function product_example_create_product($product_type, $price, $extras) {
$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 = $extras['status'];
$new_product->uid = $extras['uid'];
$new_product->sku = $extras['sku'];
$new_product->title = $extras['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);
$node = (object)array('type' => 'material_escolar');
node_object_prepare($node);
$node->title = $extras['title'];
$node->uid = 1;
$node->field_sku_producto[LANGUAGE_NONE][]['product_id'] = $new_product->product_id;
$node->language = LANGUAGE_NONE;
node_save($node);
$nuevo_stock = 10; //definimos el nuevo stock que tendrá el producto
$query = db_update('field_data_commerce_stock')
->expression('commerce_stock_value', ':weight', array(':weight' => $nuevo_stock))
->condition('entity_id', $new_product->product_id)
->execute();
$nid = db_insert('field_data_commerce_update_stock') // Table name no longer needs {}
->fields(array(
'entity_id' => $new_product->product_id,
'id_ociostock' => $extras['id_ociostock'],
))
->execute();
return $new_product->product_id;
}

Aquí ya se ha creado el producto y añadido los campos correspodientes a la base de datos. Lo siguiente que nos queda es la actualización que la haremos diariamente, para ello e cron de drupal se encargará de activarla. Destacar el siguiente tramo de codigo

'entity_id' => $new_product->product_id,
'id_ociostock' => $extras['id_ociostock'],

El product_id coincide con entity_id en la tabla field_data_commerce_stock, a partir de allí solo tenemos que buscar en la tabla del stock la entity_id y actualizar el stock

function product_example_cron(){
$result = db_select('field_data_commerce_update_stock', 'tb')
->fields('tb')
->execute();
foreach ($result as $r) { //recorro la base de datos de los productos creados
$fileHandle = fopen("https://mysite/archivo.csv", "r"); //Abro el archivo onine, no me preocupo ni de descargarlo
while (($row = fgetcsv($fileHandle, 0, ";")) !== FALSE) { //Recorro el archivo.
//Print out my column data.
if($row[0] == $r->id_ociostock) {
$nuevostock = $row[15]; //cojo el dato del stock acualizado
$query = db_update('field_data_commerce_stock')
->expression('commerce_stock_value', ':nuevo_stock', array(':nuevo_stock' => $nuevostock))
->condition('entity_id', $r->entity_id)
->execute();
$query = db_update('field_data_commerce_update_stock')
->expression('stock', ':nuevo_stock', array(':nuevo_stock' => $nuevostock))
->condition('entity_id', $r->entity_id)
->execute();
break;
}
}
}
watchdog('update', 'Se ha ejecutado el cron de drupal, stock actualizado!');
drupal_flush_all_caches(); //limipio caches
}

Y eso es todo, cada vez que se ejecute el cron nuestro stock se actualizará

Añadir nuevo comentario

Plain text

  • No se permiten etiquetas HTML.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.
CAPTCHA
Esta pregunta es para comprobar si usted es un visitante humano y prevenir envíos de spam automatizado.