David Y.F. Posted January 23, 2012 Share Posted January 23, 2012 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 More sharing options...
David Y.F. Posted January 30, 2012 Author Share Posted January 30, 2012 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 More sharing options...
forbiz Posted October 18, 2012 Share Posted October 18, 2012 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 More sharing options...
fernanlob Posted August 29, 2013 Share Posted August 29, 2013 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 More sharing options...
leandroz Posted October 1, 2013 Share Posted October 1, 2013 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 More sharing options...
Recommended Posts