japarisid Posted August 24, 2012 Share Posted August 24, 2012 (edited) Hola, He estado buscando mucho sobre este tema dentro y fuera del foro y no existe ninguna respuesta sobre esto. Me gustaría que alguien dijera por lo menos si es posible hacerlo. En la tienda, dentro de cualquier producto con accesorios, en la pestaña accesorios aparecen todos sus accesorios sin orden alguno. En primer lugar quisiera por lo menos ordenarlos. Estaría muy bien poder agruparlos por categorías de accesorios, pero como esto será muy complicado, con conseguir ordenarlos bastaría de momento. Mirando el archivo 'product.tpl' hacia el final está la parte de los accesorios y se pueden modificar varias cosas pero el orden de estos no sé como. Si alguien conoce como hacer algo al respecto que lo comparta, Gracias!! Edited September 11, 2012 by japarisid (see edit history) Link to comment Share on other sites More sharing options...
shacker Posted August 29, 2012 Share Posted August 29, 2012 edita el archivo classes/Products.php en esta linea public static function getAccessoriesLight($id_lang, $id_product) { return Db::getInstance()->ExecuteS(' SELECT p.`id_product`, p.`reference`, pl.`name` FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product`= `id_product_2`) LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') WHERE `id_product_1` = '.(int)($id_product)); } puedes añadir el orden public static function getAccessoriesLight($id_lang, $id_product) { return Db::getInstance()->ExecuteS(' SELECT p.`id_product`, p.`reference`, pl.`name` FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product`= `id_product_2`) LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') WHERE `id_product_1` = '.(int)($id_product)) ORDER BY pl.`name` ; } Link to comment Share on other sites More sharing options...
japarisid Posted August 30, 2012 Author Share Posted August 30, 2012 edita el archivo classes/Products.php en esta linea public static function getAccessoriesLight($id_lang, $id_product) { return Db::getInstance()->ExecuteS(' SELECT p.`id_product`, p.`reference`, pl.`name` FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product`= `id_product_2`) LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') WHERE `id_product_1` = '.(int)($id_product)); } puedes añadir el orden public static function getAccessoriesLight($id_lang, $id_product) { return Db::getInstance()->ExecuteS(' SELECT p.`id_product`, p.`reference`, pl.`name` FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product`= `id_product_2`) LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') WHERE `id_product_1` = '.(int)($id_product)) ORDER BY pl.`name` ; } Muchas gracias! La cosa era encontrar la consulta SQL y ordenarlos por categorías (id_category_default). El tema de que salgan agrupados ya será de modificar plantilla supongo y esto será más complicado. Saludos. Link to comment Share on other sites More sharing options...
shacker Posted August 30, 2012 Share Posted August 30, 2012 de nada. SI, eso la verdad no he mirado como hacerlo Link to comment Share on other sites More sharing options...
japarisid Posted September 3, 2012 Author Share Posted September 3, 2012 Perdonar, pero puse SOLUCIONADO debido a que encontré la consulta que necesitaba modificar pero me he dado cuenta que no coge la modificación. Probando la consulta en el PhpMyAdmin veo que si que lo ordena como yo quiero, pero dentro de la web, en la pestaña accesorios siempre lo ordena por ID. No puede ser error de caché ya que lo tengo desactivado y activado el forzar compilación. Para probar, lo he puesto que ordene por nombre alfabético (ya que así es más facil de ver si funciona) y en la web lo ordena siempre por ID, cuando esa misma consulta en el PhpMyAdmin funciona perfectamente. Link to comment Share on other sites More sharing options...
japarisid Posted September 3, 2012 Author Share Posted September 3, 2012 De hecho, esa misma consulta que me dices, le añado al final limit 10 para ver si la coje y saca solo 10 accesorios pero modifique lo que modifique, siempre lo saca igual. ¿Seguro que la pestaña accesorios de un producto los coje de esa consulta? Gracias. Link to comment Share on other sites More sharing options...
shacker Posted September 5, 2012 Share Posted September 5, 2012 fijate entonces el archivo product.php en el raiz, y a que archivos o controladores va llamando y lo abres hasta llegar al que buscas Link to comment Share on other sites More sharing options...
japarisid Posted September 7, 2012 Author Share Posted September 7, 2012 He mirado de arriba a abajo el fichero product.php y no veo que llame a otro archivo. Y las unicas funciones que tratan los accesorios son 'getaccesorieslight' y 'getaccesories'. La primera, por mucho que la modifique, incluso que la borre, no pasa absolutamente nada. La segunda, si añado un 'ORDER BY' al final, directamente no aparece la pestaña 'accesorios'. ¿De donde sacará el orden de esta pestaña?... Link to comment Share on other sites More sharing options...
shacker Posted September 7, 2012 Share Posted September 7, 2012 pasame aqui como pusiste el order by Link to comment Share on other sites More sharing options...
japarisid Posted September 10, 2012 Author Share Posted September 10, 2012 SELECT p.`id_product`, p.`reference`, pl.`name` FROM `pb_accessory` LEFT JOIN `pb_product` p ON (p.`id_product`= `id_product_2`) LEFT JOIN `pb_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = 3) WHERE `id_product_1` = 2021 ORDER BY pl.`name` El id_lang=3 es el codigo del español y el id_product_1=2021 es el id de un producto que tiene accesorios. Es la misma consulta que aparece en la función getAccesoriesLight pero sustituyendo las dos variables por estos dos valores. En el phpMyAdmin funciona perfectamente, pero es como si no la cogiera del fichero product.php porque he probado a borrar la consulta entera, dejando la función vacia y funciona igualmente. Tengo todo el cache desactivado y forzar compilación activada. Link to comment Share on other sites More sharing options...
shacker Posted September 11, 2012 Share Posted September 11, 2012 en la carpeta overrides no tienes ningun archivo que este sobreescribiendo nada? Link to comment Share on other sites More sharing options...
japarisid Posted September 11, 2012 Author Share Posted September 11, 2012 En override/classes solo se está sobreescribiendo el fichero PHP.pdf pero nada del Products.php, de hecho probé a poner el products.php modificado en override/classes pero tampoco lo acepta. Tiene toda la pinta que la solución sea lo que tu dices pero no lo coje, no sé que estará pasando. Link to comment Share on other sites More sharing options...
nadie Posted September 11, 2012 Share Posted September 11, 2012 Hola, en el controlador del producto, tienes esto: 'accessories' => $this->product->getAccessories((int)self::$cookie->id_lang) Por lo que es posible, que la función que tengas que tocar en el fichero /classes/Product.php, sea esta: public function getAccessories($id_lang, $active = true) { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, p.`upc`, i.`id_image`, il.`legend`, t.`rate`, m.`name` as manufacturer_name, 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 FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = `id_product_2` LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($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` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (p.`id_manufacturer`= m.`id_manufacturer`) LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' AND tr.`id_state` = 0) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) WHERE `id_product_1` = '.(int)($this->id).' '.($active ? 'AND p.`active` = 1' : '')); if (!$result) return false; return $this->getProductsProperties($id_lang, $result); } Link to comment Share on other sites More sharing options...
japarisid Posted September 11, 2012 Author Share Posted September 11, 2012 Por fin, sí, es en esta función última que me has puesto. Ya lo había probado pero hasta hoy no me he dado cuenta que estaba añadiendo el order by al final, detras de los 2 parentesis, en vez de entre ellos, que es donde toca. Gracias a los 2! Link to comment Share on other sites More sharing options...
nadie Posted September 11, 2012 Share Posted September 11, 2012 Por fin, sí, es en esta función última que me has puesto. Ya lo había probado pero hasta hoy no me he dado cuenta que estaba añadiendo el order by al final, detras de los 2 parentesis, en vez de entre ellos, que es donde toca. Gracias a los 2! Un placer ayudarte y servirte! Un saludo y recuerda que estaremos en el foro, para guiarte por este mundo oscuro y tenebroso. Link to comment Share on other sites More sharing options...
shacker Posted September 11, 2012 Share Posted September 11, 2012 no es la primera que te habia pasado? Link to comment Share on other sites More sharing options...
nadie Posted September 11, 2012 Share Posted September 11, 2012 no es la primera que te habia pasado? Hola shacker, en el primer mensaje del tema nombrabas esta función: edita el archivo classes/Products.php en esta linea public static function getAccessoriesLight($id_lang, $id_product) { return Db::getInstance()->ExecuteS(' SELECT p.`id_product`, p.`reference`, pl.`name` FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product`= `id_product_2`) LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') WHERE `id_product_1` = '.(int)($id_product)); } puedes añadir el orden public static function getAccessoriesLight($id_lang, $id_product) { return Db::getInstance()->ExecuteS(' SELECT p.`id_product`, p.`reference`, pl.`name` FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product`= `id_product_2`) LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') WHERE `id_product_1` = '.(int)($id_product)) ORDER BY pl.`name` ; } Y la función a modificar era esta: public function getAccessories($id_lang, $active = true){ $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, p.`upc`, i.`id_image`, il.`legend`, t.`rate`, m.`name` as manufacturer_name, 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 FROM `'._DB_PREFIX_.'accessory` LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = `id_product_2` LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($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` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (p.`id_manufacturer`= m.`id_manufacturer`) LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' AND tr.`id_state` = 0) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) WHERE `id_product_1` = '.(int)($this->id).' '.($active ? 'AND p.`active` = 1' : '')); if (!$result) return false; return $this->getProductsProperties($id_lang, $result);} PD: Son dos funciones distintas. Un Saludo, Link to comment Share on other sites More sharing options...
shacker Posted September 11, 2012 Share Posted September 11, 2012 tienes razon. Se me paso el light Link to comment Share on other sites More sharing options...
Recommended Posts