Jump to content

[SOLUCIONADO]Pestaña Accesorios orden productos.


japarisid

Recommended Posts

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 by japarisid (see edit history)
Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

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

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