Jump to content

¿Como Vender ciertos productos en otros países?


David Y.F.

Recommended Posts

Buenos días,

 

Tengo una web que vende sus productos en España, pero el cliente quiere vender "x" productos en otros países, y para colmo no son los mismos (en un país vende x productos, en otro "y" productos).

 

No he encontrado nada nada en Google, ni en el foro.

 

Lo que se me ocurre es añadir un campo extra en la tabla de productos, con un array serializado que contenga los países a los que se puede vender.

 

Entonces detecto el idioma, y según éste, ofrezco una página con los productos para cada país. (La relación país idioma no es muy exacta pero en fin).

 

De esta forma, resuelvo que por cada país aparezcan los productos que a él le pertenecen.

 

El problema que tengo es que si alguien encuentra un producto googleando, la venta a ese país si estaría permitida (porque así lo habré configurado en la región de zonas).

 

Una persona podría buscar por ejemplo un producto no permitido en Alemania a través de Google, y como la tienda permite vender a Alemania se le permitiría la compra.

 

¿Alguien tiene una idea general de como afrontar todo esto?

 

Son muchas partes que tendría que modificar del código, la zonas, los productos, etc.

 

Le estoy dando muchas vueltas a la cabeza y se ve complicado.

 

Gracias.

Link to comment
Share on other sites

Buenos días Señores,

 

Al final lo he conseguido y ha sido realmente muy fácil. Le di muchas vueltas a la cabeza para solucionarlo de la forma más sencilla posible, con unas pocas líneas de código, que expongo a continuación:

 

Tened en cuenta que es la versión 1.2.5 de Prestashop, por lo que puede variar las líneas de código, pero la idea básica es igualmente válida.

 

- Versión 1.2.5

- Ficheros a modificar: /product.php, /classes/Category.php y /classes/Product.php.

 

La idea es detectar si el administrador ha rellenado un campo del producto, yo escogí el campo 'description', ya que todos los productos deben tener descripción. Así que si en la tabla de ps_product_lang el campo está vacio no lo muestro ni en categorías ni en productos respecto al idioma detectado por el navegador o seleccionado por el usuario, lo que ya es cosa del Prestashop.

 

- Modificar /classes/Category.php línea 418

**************************************************

Añadir esta línea: WHERE pl.description!="" AND en la función en la función getProducts, el sql debe quedar tal que así:

 

 $sql = '
 SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new,
 (p.price - IF((DATEDIFF(reduction_from, CURDATE()) <= 0 AND DATEDIFF(reduction_to, CURDATE()) >=0) OR reduction_from = reduction_to, IFNULL(reduction_price, (p.price * reduction_percent / 100)),0)) AS orderprice
 FROM `'._DB_PREFIX_.'category_product` cp
 LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
 LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1)
 LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
 LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'tax` t ON t.`id_tax` = p.`id_tax`
 LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer`
 WHERE pl.description!="" AND
 cp.`id_category` = '.intval($this->id).($active ? ' AND p.`active` = 1' : '').'
 '.($id_supplier ? 'AND p.id_supplier = '.$id_supplier : '');

 

- Modificar classes/Product.php línea 200

**************************************************

Poner el if que se ve debajo la llamada al constructor padre

 

  	 parent::__construct($id_product, $id_lang);

  	 // Modify to sell a product by language detection
	if ($this->description=='') $this->id=null

 

- /products.php bajo línea 112

**************************************************

Debajo de la línea 112 poner:

 

	// Modify to sell a product by language detection
if (!Validate::isLoadedObject($product) OR !$product->desc=='')
	$errors[] = Tools::displayError('This product it is no available in your country');

else if (!Validate::isLoadedObject($product) OR !$product->active)

 

Sé que mucha gente ha mirado con la intención de ayudar, pero no siempre es fácil.

 

Espero que le sirva a alguien.

Link to comment
Share on other sites

  • 8 months later...

Buenos días Señores,

 

Al final lo he conseguido y ha sido realmente muy fácil. Le di muchas vueltas a la cabeza para solucionarlo de la forma más sencilla posible, con unas pocas líneas de código, que expongo a continuación:

 

Tened en cuenta que es la versión 1.2.5 de Prestashop, por lo que puede variar las líneas de código, pero la idea básica es igualmente válida.

 

- Versión 1.2.5

- Ficheros a modificar: /product.php, /classes/Category.php y /classes/Product.php.

 

La idea es detectar si el administrador ha rellenado un campo del producto, yo escogí el campo 'description', ya que todos los productos deben tener descripción. Así que si en la tabla de ps_product_lang el campo está vacio no lo muestro ni en categorías ni en productos respecto al idioma detectado por el navegador o seleccionado por el usuario, lo que ya es cosa del Prestashop.

 

- Modificar /classes/Category.php línea 418

**************************************************

Añadir esta línea: WHERE pl.description!="" AND en la función en la función getProducts, el sql debe quedar tal que así:

 

 $sql = '
 SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new,
 (p.price - IF((DATEDIFF(reduction_from, CURDATE()) <= 0 AND DATEDIFF(reduction_to, CURDATE()) >=0) OR reduction_from = reduction_to, IFNULL(reduction_price, (p.price * reduction_percent / 100)),0)) AS orderprice
 FROM `'._DB_PREFIX_.'category_product` cp
 LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
 LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1)
 LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
 LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'tax` t ON t.`id_tax` = p.`id_tax`
 LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer`
 WHERE pl.description!="" AND
 cp.`id_category` = '.intval($this->id).($active ? ' AND p.`active` = 1' : '').'
 '.($id_supplier ? 'AND p.id_supplier = '.$id_supplier : '');

 

- Modificar classes/Product.php línea 200

**************************************************

Poner el if que se ve debajo la llamada al constructor padre

 

  	 parent::__construct($id_product, $id_lang);

  	 // Modify to sell a product by language detection
	if ($this->description=='') $this->id=null

 

- /products.php bajo línea 112

**************************************************

Debajo de la línea 112 poner:

 

	// Modify to sell a product by language detection
if (!Validate::isLoadedObject($product) OR !$product->desc=='')
	$errors[] = Tools::displayError('This product it is no available in your country');

else if (!Validate::isLoadedObject($product) OR !$product->active)

 

Sé que mucha gente ha mirado con la intención de ayudar, pero no siempre es fácil.

 

Espero que le sirva a alguien.

 

Buenas tardes, estoy buscando una solución similar para la versión 1.4.8.2 y ésta no me sirve, pues ya no hay dichas páginas (como es el caso de la /product.php) y las líneas de código no concuerdan.

 

¿Alguien me puede ayudar? O sabe alguien de algún modulo que haga esto?

 

Muchas gracias

Link to comment
Share on other sites

  • 10 months later...

Buenos días Señores,

 

Al final lo he conseguido y ha sido realmente muy fácil. Le di muchas vueltas a la cabeza para solucionarlo de la forma más sencilla posible, con unas pocas líneas de código, que expongo a continuación:

 

Tened en cuenta que es la versión 1.2.5 de Prestashop, por lo que puede variar las líneas de código, pero la idea básica es igualmente válida.

 

- Versión 1.2.5

- Ficheros a modificar: /product.php, /classes/Category.php y /classes/Product.php.

 

La idea es detectar si el administrador ha rellenado un campo del producto, yo escogí el campo 'description', ya que todos los productos deben tener descripción. Así que si en la tabla de ps_product_lang el campo está vacio no lo muestro ni en categorías ni en productos respecto al idioma detectado por el navegador o seleccionado por el usuario, lo que ya es cosa del Prestashop.

 

- Modificar /classes/Category.php línea 418

**************************************************

Añadir esta línea: WHERE pl.description!="" AND en la función en la función getProducts, el sql debe quedar tal que así:

 

 $sql = '
 SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new,
 (p.price - IF((DATEDIFF(reduction_from, CURDATE()) <= 0 AND DATEDIFF(reduction_to, CURDATE()) >=0) OR reduction_from = reduction_to, IFNULL(reduction_price, (p.price * reduction_percent / 100)),0)) AS orderprice
 FROM `'._DB_PREFIX_.'category_product` cp
 LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
 LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1)
 LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
 LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'tax` t ON t.`id_tax` = p.`id_tax`
 LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.intval($id_lang).')
 LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer`
 WHERE pl.description!="" AND
 cp.`id_category` = '.intval($this->id).($active ? ' AND p.`active` = 1' : '').'
 '.($id_supplier ? 'AND p.id_supplier = '.$id_supplier : '');

 

- Modificar classes/Product.php línea 200

**************************************************

Poner el if que se ve debajo la llamada al constructor padre

 

  	 parent::__construct($id_product, $id_lang);

  	 // Modify to sell a product by language detection
	if ($this->description=='') $this->id=null

 

- /products.php bajo línea 112

**************************************************

Debajo de la línea 112 poner:

 

	// Modify to sell a product by language detection
if (!Validate::isLoadedObject($product) OR !$product->desc=='')
	$errors[] = Tools::displayError('This product it is no available in your country');

else if (!Validate::isLoadedObject($product) OR !$product->active)

 

Sé que mucha gente ha mirado con la intención de ayudar, pero no siempre es fácil.

 

Espero que le sirva a alguien.

 

Buenos días, actualmente me encuentro en la versión 1.5.5. Acabo de iniciarme en este software y encontrándome un requerimiento similar me he decidido por esta solución.

 

Resulta, que he tenido que hacer ciertas adaptaciones al manual que has reportado, el cual te agradezco, pero he llegado a un punto en el que ya no he conseguido avanzar. Dicho punto es el del fichero products.php, el cual no encuentro por ningún lado en dicha versión, entiendo por haber sido descatalogado por otro.

 

He buscado también patrones similares por todo el directorio de forma recursiva, y lo único que he encontrado algo similar es el /controllers/front/product.php , pero lo más que he conseguido es crear un error interno, por lo que tengo que tirar hacia atrás lo realizado.

 

También he estado revisando las plantillas Smarty del tema, en este caso el de por defecto para no hacer engorrosa la búsqueda, pero no he encontrado tampoco donde insertarlo.

 

Entiendo que ha cambiado mucho el core y los ficheros de configuración, por lo que he estado leyendo por internet. Pero ¿tendríais alguna pista de como hacerlo en estas versiones más modernas?

 

Un saludo y gracias.

Link to comment
Share on other sites

  • 1 month later...

Hola!, estoy realmente interesado en algo que permita al comprador seleccionar su pais de procedencia, y segun esa especificacion se muestren unos y otros productos.

Estuve pensando hacerlo apartir de fabricantes o proveedores, osea, que el fabricante sean paises, entonces uno seleccione el pais y muestre solo esos productos, pero no me gusta mucho.

Si alguno tiene una solucion mas "linda" o guía seria genial!

WebRep
 
currentVote
 
 
noRating
noWeight
 
 
 
 
 
 
 
 
 
 
 
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...