Jump to content

[SOLUCIONADO] Añadir criterios de ordenación a los productos de las categorias


Pixie Cabanyaler

Recommended Posts

Buenos días y feliz navidad de nuevo a todos.

 

Quisera conocer como puedo añadir nuevos criterios de ordenación al DropBox o Lista Desplegable "Ordenar por" de los productos agrupados en las categorias.

 

Por defecto,la plantilla trae los criterios de (Precio más baratos/caros primero, nombre A..Z/Z..A, En inventario, etc), pero ¿que ocurre si lo quiero ordenar por ejemplo por 'peso', 'tamaño', alguna a característica común de los productos como 'made in', o cualquier otra?.

Sería añadir opciones al desplegable.

 

¿Alguién lo ha realizado?

 

Gracias.

Edited by Pixie Cabanyaler (see edit history)
Link to comment
Share on other sites

Tienes guías de algunas versiones de Prestashop (creo que antiguas, pero quizas puedas ver la forma de adaptarlo teniendo la idea de las guias), donde se comentan como añadir una nueva columna en los filtros de ordenación (Te dejo enlaces)
 
http://nemops.com/sort-by-sales-prestashop/#.WF-je2ThDIU
http://blog.belvg.com/how-to-create-custom-sorting-in-prestashop-1-5.html
https://dh42.com/blog/prestashop-sort-date/ 
 
Por otro lado tambien tienes la posibilidad de usar el modulo "Navegacion por facetas" que tiene multiples filtros desde caractericticas, peso, atributos, ect..

Edited by Sergio Ruiz (see edit history)
Link to comment
Share on other sites

Tienes guías de algunas versiones de Prestashop (creo que antiguas, pero quizas puedas ver la forma de adaptarlo teniendo la idea de las guias), donde se comentan como añadir una nueva columna en los filtros de ordenación (Te dejo enlaces)

 

http://nemops.com/sort-by-sales-prestashop/#.WF-je2ThDIU

http://blog.belvg.com/how-to-create-custom-sorting-in-prestashop-1-5.html

https://dh42.com/blog/prestashop-sort-date/ 

 

Por otro lado tambien tienes la posibilidad de usar el modulo "Navegacion por facetas" que tiene multiples filtros desde caractericticas, peso, atributos, ect..

 

Gracias Sergio.

 

Me armé de valor para meterme en el código, pero no lo he conseguido.

 

Con esta documentación: 

http://nemops.com/so...p/#.WF-je2ThDIU

Esta es la más completa a seguir paso a paso, pero en el primer punto respecto a modificar la plantilla "product-sort.tpl" no se muestran las opciones nuevas añadidas. Por lo que lo siguiente aunque si lo hubiese implementado no tendría sentido al no poder seleccionar las nuevas opciones.

 

http://blog.belvg.co...tashop-1-5.html

Esta también es completa en cuanto a "lo que se debe hacer", pero está incompleta en tanto "al como hacerlo"

  • Indica que debo crear un modulo y registrarlo en el hook, pero tampoco indica como hacer el módulo y registrarlo al hook
  • Indica también que debemos sobreescribir el comportamiento de las funciones getProducts de la class Category y la function productSort de CategoryController. (Esto más o menos está claro).
  • Respecto a modificar la plantilla "product-sort.tpl" no se muestran las opciones nuevas añadidas. Por lo que lo anterior aunque si lo hubiese implementado no tendría sentido al no poder seleccionar las nuevas opciones.

https://dh42.com/blo...shop-sort-date/:

  • Sólo muestra como modificar la plantilla tpl añadiendo las líneas que deberían aparecer en lalista despleglable, pero aún añadiéndolas ni siquiera de se muestran en la lista en el FrontOffice.
  • Faltaría (creo) la parte del código que se ejecutaría en caso de seleccionar las opciones deseadas a ser añadidas a la lista desplegable, que como indico y repito, tampoco se visualizan.

Por ello no lo he podido modificar o ampliar, de momento me apaño con lo de la navegación por facetas, pero no es lo que buscaba en concreto.

Quizá sea la versión de PS que utilizo 1.6.1.10. No lo sé, pero ni siquiera he podido llegar a hacer la modificación de la plantilla product-sort.tpl

Edited by Pixie Cabanyaler (see edit history)
Link to comment
Share on other sites

El modulo "Navegacion por facetas" es el más adecuado para lo que necesitas. Salvo que te coloca los filtros en la columna izquierda. Pero los puedes colocar en horizontal como los de Ordenar, con un "poco" de CSS y mucho sudor (te lo digo por experiencia). 

 

Cambiandolo de hook a uno personalizado mas bien

Link to comment
Share on other sites

Cambiandolo de hook a uno personalizado mas bien

 

La navegación por facetas no es lo que busco.

 

Seguiré dandole vueltas poco a poco a modificar el código, las plantillas, etc, ya que busco añadir criterios de ordenación. y no filtros que ofrecen las facetas, o eso entiendo desde mi más honesta modestia de aprendiz de prestashop.

Link to comment
Share on other sites

La navegación por facetas no es lo que busco.

 

Seguiré dandole vueltas poco a poco a modificar el código, las plantillas, etc, ya que busco añadir criterios de ordenación. y no filtros que ofrecen las facetas, o eso entiendo desde mi más honesta modestia de aprendiz de prestashop.

 

Si quieres añadir mas parámetros deberás hacerlo sobreescribiendo la función getproducts en la classe Product.php y añadirlos luego al archivo

\themes\tu_tema\product-sort.tpl
Link to comment
Share on other sites

 

Si quieres añadir mas parámetros deberás hacerlo sobreescribiendo la función getproducts en la classe Product.php y añadirlos luego al archivo

\themes\tu_tema\product-sort.tpl

Si gracias, esta tarde si puedo buscaré algún manual avanzadode prestashop en línea o guia en post , paso a paso, para hacerlo.

Un saludo.

Cuando lo saque, si lo consigo, lo reportaré, como guia de cada uno de los pasos.

Link to comment
Share on other sites

Si quieres añadir mas parámetros deberás hacerlo sobreescribiendo la función getproducts en la classe Product.php y añadirlos luego al archivo

\themes\tu_tema\product-sort.tpl

 

Gracias ventura, estoy con esto, pero tengo una duda sobre la sobreescritura de getproducts

 

He hecho lo siguiente sobre la plantilla product-sort.tpl:

  • He modificado la tpl para que salga en la lista desplegable las opciones de ordenar por Fabricante asc o des con las lineas:
    • Añadiendo al array $orderby el valor id_manufacturer en su última posición

<option value="{if $page_name != 'best-sales'}{$orderbydefault|escape:'html':'UTF-8'}:{$orderwaydefault|escape:'html':'UTF-8'}{/if}"{if !in_array($orderby, array('price', 'name', 'quantity', 'reference', 'id_manufacturer')) && $orderby eq $orderbydefault} selected="selected"{/if}>--</option>

 

  • Añadiendo las opciones de la lista desplegable:

 <option value="id_manufacturer:desc" {if $orderby eq 'id_manufacturer' AND $orderway eq 'desc'}selected="selected"{/if}>{l s='Fabricantes: A a Z'}</option>

<option value="id_manufacturer:asc" {if $orderby eq 'id_manufacturer' AND $orderway eq 'asc'}selected="selected"{/if}>{l s='Fabricantes: Z a A'}</option>

 

He compilado la plantilla y sale bien en el FrontOffice, con las dos opciones añadidas.

 

Para la sobreescrutura o en este caso entiendo extensión de la clase Product.php de ../htdocs/classes/product.php, he hecho lo siguiente :

  1. He creado una clase denominada Product.php en ../htdocs/override/classes
  2. Y he extendido la superclase Product.php con la sentencia:
    • Class Product extends ProductCore
  3. He copiado integramente la funcion getProducts(....) a esta nueva subclase

Y aquí, en este paso es donde tengo la duda.

 

¿Donde y como le debo indicar que si la opción seleccionada es el Fabricante, establezca el orden por Fabricante?

Porque veo que se lo asigna en estas líneas pero no veo como incluir el del Fabricante.

 

 if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) {

            die(Tools::displayError());

        }

        if ($order_by == 'id_product' || $order_by == 'price' || $order_by == 'date_add' || $order_by == 'date_upd') {

            $order_by_prefix = 'p';

        } elseif ($order_by == 'name') {

            $order_by_prefix = 'pl';

        } elseif ($order_by == 'position') {

            $order_by_prefix = 'c';

        }

 

Muchas gracias por tu tiempo. :)

Link to comment
Share on other sites

 

Para el fabricante por nombre haría falta añadir

elseif ($order_by == 'name')
$order_by_prefix = 'm';

Muchas gracias, enseguida pueda lo pruebo.

 

¿Entiendo pues que las líneas por tí indicadas deben sustituir a las actualmente existentes?:

 

} elseif ($order_by == 'name') {

            $order_by_prefix = 'pl';

Link to comment
Share on other sites

Muchas gracias, enseguida pueda lo pruebo.

 

¿Entiendo pues que las líneas por tí indicadas deben sustituir a las actualmente existentes?:

 

} elseif ($order_by == 'name') {

            $order_by_prefix = 'pl';

 

No, debes añadirla a las que ya hay. Esa que indicas es el name de la tabla  pl ( product_lang) y queremos añadir el name de la tabla m ( manufacturer)

Link to comment
Share on other sites

No, debes añadirla a las que ya hay. Esa que indicas es el name de la tabla  pl ( product_lang) y queremos añadir el name de la tabla m ( manufacturer)

Gracias de nuevo, pero estoy confundido:

 

Al ya existir la linea de elseif

elseif ($order_by == 'name') {

            $order_by_prefix = 'pl';

si le añado, otra para el nombre del fabricante con un elseif identico elseif ($order_by == 'name') {  que asigna el prefijo de la tabla manufacturer o fabricante con la sentencia:

$order_by_prefix = 'm';

al encontrar en primer lugar el primerelseif de $order_by_prefix = 'pl'; nunca llegará a ejecutar el elseif que intento añadir siguiendo tus indicaciones ¿no es así?. Es decir según lo que entiendo añadirlo quedaría como está mostrado a continuación y al encontrar el primer elseif en negrita, nunca llegaría a ejecutar elcódigo azul añadido. Por eso decía lo de la sustitución.

 

 

 if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) {

            die(Tools::displayError());

        }

        if ($order_by == 'id_product' || $order_by == 'price' || $order_by == 'date_add' || $order_by == 'date_upd') {

            $order_by_prefix = 'p';

        } elseif ($order_by == 'name') {

            $order_by_prefix = 'pl';

        } elseif ($order_by == 'position') {

            $order_by_prefix = 'c';

        } elseif ($order_by == 'name') {

            $order_by_prefix = 'm';

Edited by Pixie Cabanyaler (see edit history)
Link to comment
Share on other sites

 

tienes razón, prueba con  

manufacturer_name

 

Uff!! :(

No consigo que me funcione, me reporta los productos pero no me los ordena por fabricante, me los mezcla, y lo peor no conozco cual es el criterio de orden que aplica.

 

El valor del $order_by si en la plantilla lo he establecido así como id_manufacturer como muestro en las siguientes lineas

 

 

He hecho lo siguiente sobre la plantilla product-sort.tpl:

  • He modificado la tpl para que salga en la lista desplegable las opciones de ordenar por Fabricante asc o des con las lineas:

    • Añadiendo al array $orderby el valor id_manufacturer en su última posición

<option value="{if $page_name != 'best-sales'}{$orderbydefault|escape:'html':'UTF-8'}:{$orderwaydefault|escape:'html':'UTF-8'}{/if}"{if !in_array($orderby, array('price', 'name', 'quantity', 'reference', 'id_manufacturer')) && $orderby eq $orderbydefault} selected="selected"{/if}>--</option>

  • Añadiendo las opciones de la lista desplegable:

 <option value="id_manufacturer:desc" {if $orderby eq 'id_manufacturer' AND $orderway eq 'desc'}selected="selected"{/if}>{l s='Fabricantes: A a Z'}</option>

<option value="id_manufacturer:asc" {if $orderby eq 'id_manufacturer' AND $orderway eq 'asc'}selected="selected"{/if}>{l s='Fabricantes: Z a A'}</option>

 

 

¿Debería $order_by valer 'id_manufacturer' en la subclase Producto.php, para ser evaluada en el elseif asi:?

 

    } elseif ($order_by == 'id_manufacturer') {

            $order_by_prefix = 'm';

 

¿No?

Link to comment
Share on other sites

SOLUCIONADO.

 

Primero agradecer a los colaboradores de este hilo:

  1. Sergio Ruiz: Por ponerme sobre la pista con los enlaces
  2. Albaro Tarela: Por decirme lo de las facetas
  3. ventura: por guiarme y por sus aportes concretos

Como lo he hecho??

  1. Desde el BackOficce opciones Parametros avanzados/Rendimieto/Smarty, estableciendo quese compilasen las tpl cuando fuesen modificadas
  2. Añadiendo en la tpl Product_sort.tpl las dos líneas de la lista desplegable del nombre de fabricante, con especial atención al valor marcado en negrita
  3. <option value="id_manufacturer:desc" {if $orderby eq 'manufacturer_name' AND $orderway eq 'desc'}selected="selected"{/if}>{l s='Fabricantes: A a Z'}</option>
    <option value="id_manufacturer:asc" {if $orderby eq 'manufacturer_name' AND $orderway eq 'asc'}selected="selected"{/if}>{l s='Fabricantes: Z a A'}</option>
  4. Estos valores corresponden con uno de los valores asignados a la variable "order_by_values" en la clase de ..htdocs/classes/controller/frontcontroller.php en su posición 5

Ahora voy a ver lo de la traducción de esas dos nuevas opciones a cada uno de los idiomas, pero imagino que eso ya será mucho más fácil.

 

me ha costado, pero he aprendido mucho en este hilo, con el pho, el smarty, y la estructura de ficheros de prestashop, sus clases y plantillas.

Link to comment
Share on other sites

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