Jump to content

Ordenar productos por "más vendidos"


Adrián

Recommended Posts

Buenas, a ver si me podéis echar una mano. Recientemente han actualizado el módulo de Búsqueda por facetas (versión 3.6.0) y han incorporado un nuevo Orden "Best seller" que he traducido como "Top ventas" (Ver foto 1). Sin embargo no lo han definido en el Back office (configuración de pedido-paginación) y me gustaría establecer ese orden como predeterminado. Mi versión de PrestaShop es 1.7.6.7.

He encontrado algunos archivos donde están escritos los cambios pero no logro incorporarlo. Si alguien puede ayudarme o aportar alguna idea estaré agradecido.

Saludos.

 

1.JPG

2.jpg

Link to comment
Share on other sites

vete a /src/PrestaShopBundle/Form/Admin/Configure/ShopParameters/ProductPreferences/PaginationType.php

Donde 

$builder
            ->add('products_per_page', IntegerType::class)
            ->add('default_order_by', ChoiceType::class, [
                'choices' => [
                    'Product name' => 0,
                    'Product price' => 1,
                    'Product add date' => 2,
                    'Product modified date' => 3,
                    'Position inside category' => 4,
                    'Brand' => 5,
                    'Product quantity' => 6,
                    'Product reference' => 7,
                ],
                'required' => true,
            ])
            ->add('default_order_way', ChoiceType::class, [
                'choices' => [
                    'Ascending' => 0,
                    'Descending' => 1,
                ],
                'required' => true,
                'choice_translation_domain' => 'Admin.Global',
            ]);

Cambia por:

$builder
            ->add('products_per_page', IntegerType::class)
            ->add('default_order_by', ChoiceType::class, [
                'choices' => [
                    'Product name' => 0,
                    'Product price' => 1,
                    'Product add date' => 2,
                    'Product modified date' => 3,
                    'Position inside category' => 4,
                    'Brand' => 5,
                    'Product quantity' => 6,
                    'Product reference' => 7,
					'Best Sellers' => 8
                ],
                'required' => true,
            ])
            ->add('default_order_way', ChoiceType::class, [
                'choices' => [
                    'Ascending' => 0,
                    'Descending' => 1,
                ],
                'required' => true,
                'choice_translation_domain' => 'Admin.Global',
            ]);

 

No lo he probado, no se si habrá que cambiar algo más para que lo coja, pero por ahí puedes comenzar.

Link to comment
Share on other sites

Gracias por la información, pero ya lo intenté. Se añadía la opción nueva al Backoffice pero no hacía efecto, no se quedaba predefinido. También supongo que tengo que aportar otra configuración para que lo asocie pero no logro encontrar nada. Gracias por la aportación.

Link to comment
Share on other sites

11 minutes ago, Pixefora D said:

Haz un override de frontcategorycontroller. Busca donde llama a la consulta para recuperar los productos. Es probable que esto esté en la clase de categorías. Categoría.php

Ahí modifica el orderby para que sea por defecto los más vendidos.

 

Un saludo

Gracias, he llegado hasta el archivo pero no logro averiguar como habría que ponerlo exactamente, a ver si puedes echar una mano. Creo que este sería el apartado:

 

/** Tools::strtolower is a fix for all modules which are now using lowercase values for 'orderBy' parameter */
        $orderyBy = Validate::isOrderBy($orderyBy) ? Tools::strtolower($orderyBy) : 'position';
        $orderWay = Validate::isOrderWay($orderWay) ? Tools::strtoupper($orderWay) : 'ASC';

        $orderByPrefix = false;
        if ($orderyBy == 'id_product' || $orderyBy == 'date_add' || $orderyBy == 'date_upd') {
            $orderByPrefix = 'p';
        } elseif ($orderyBy == 'name') {
            $orderByPrefix = 'pl';
        } elseif ($orderyBy == 'manufacturer' || $orderyBy == 'manufacturer_name') {
            $orderByPrefix = 'm';
            $orderyBy = 'name';
        } elseif ($orderyBy == 'position') {
            $orderByPrefix = 'cp';
        }

        if ($orderyBy == 'price') {
            $orderyBy = 'orderprice';
        }

        $nbDaysNewProduct = Configuration::get('PS_NB_DAYS_NEW_PRODUCT');
        if (!Validate::isUnsignedInt($nbDaysNewProduct)) {
            $nbDaysNewProduct = 20;
        }

        $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) AS quantity' . (Combination::isFeatureActive() ? ', IFNULL(product_attribute_shop.id_product_attribute, 0) AS id_product_attribute,
                    product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '') . ', 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`, image_shop.`id_image` id_image,
                    il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
                    DATEDIFF(product_shop.`date_add`, DATE_SUB("' . date('Y-m-d') . ' 00:00:00",
                    INTERVAL ' . (int) $nbDaysNewProduct . ' DAY)) > 0 AS new, product_shop.price AS orderprice
                FROM `' . _DB_PREFIX_ . 'category_product` cp
                LEFT JOIN `' . _DB_PREFIX_ . 'product` p
                    ON p.`id_product` = cp.`id_product`
                ' . Shop::addSqlAssociation('product', 'p') .
                (Combination::isFeatureActive() ? ' LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_shop` product_attribute_shop
                ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=' . (int) $context->shop->id . ')' : '') . '
                ' . Product::sqlStock('p', 0) . '
                LEFT JOIN `' . _DB_PREFIX_ . 'category_lang` cl
                    ON (product_shop.`id_category_default` = cl.`id_category`
                    AND cl.`id_lang` = ' . (int) $idLang . Shop::addSqlRestrictionOnLang('cl') . ')
                LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl
                    ON (p.`id_product` = pl.`id_product`
                    AND pl.`id_lang` = ' . (int) $idLang . Shop::addSqlRestrictionOnLang('pl') . ')
                LEFT JOIN `' . _DB_PREFIX_ . 'image_shop` image_shop
                    ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=' . (int) $context->shop->id . ')
                LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il
                    ON (image_shop.`id_image` = il.`id_image`
                    AND il.`id_lang` = ' . (int) $idLang . ')
                LEFT JOIN `' . _DB_PREFIX_ . 'manufacturer` m
                    ON m.`id_manufacturer` = p.`id_manufacturer`
                WHERE product_shop.`id_shop` = ' . (int) $context->shop->id . '
                    AND cp.`id_category` = ' . (int) $this->id
                    . ($active ? ' AND product_shop.`active` = 1' : '')
                    . ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
                    . ($idSupplier ? ' AND p.id_supplier = ' . (int) $idSupplier : '');

        if ($random === true) {
            $sql .= ' ORDER BY RAND() LIMIT ' . (int) $randomNumberProducts;
        } else {
            $sql .= ' ORDER BY ' . (!empty($orderByPrefix) ? $orderByPrefix . '.' : '') . '`' . bqSQL($orderyBy) . '` ' . pSQL($orderWay) . '
            LIMIT ' . (((int) $p - 1) * (int) $n) . ',' . (int) $n;
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql, true, false);

        if (!$result) {
            return array();
        }

        if ($orderyBy == 'orderprice') {
            Tools::orderbyPrice($result, $orderWay);
        }

        // Modify SQL result
        return Product::getProductsProperties($idLang, $result);
    }

Link to comment
Share on other sites

Esto:

 $orderyBy = Validate::isOrderBy($orderyBy) ? Tools::strtolower($orderyBy) : 'position';
  $orderWay = Validate::isOrderWay($orderWay) ? Tools::strtoupper($orderWay) : 'ASC';

Cambialo por esto:

 $orderyBy = Validate::isOrderBy($orderyBy) ? Tools::strtolower($orderyBy) : 'sales';
   $orderWay = Validate::isOrderWay($orderWay) ? Tools::strtoupper($orderWay) : 'DESC';

 

Link to comment
Share on other sites

35 minutes ago, Pixefora D said:

Esto:


 $orderyBy = Validate::isOrderBy($orderyBy) ? Tools::strtolower($orderyBy) : 'position';
  $orderWay = Validate::isOrderWay($orderWay) ? Tools::strtoupper($orderWay) : 'ASC';

Cambialo por esto:


 $orderyBy = Validate::isOrderBy($orderyBy) ? Tools::strtolower($orderyBy) : 'sales';
   $orderWay = Validate::isOrderWay($orderWay) ? Tools::strtoupper($orderWay) : 'DESC';

 

Mucha gracias por las aportaciones pero aun sigue sin hacer el cambio, he modificado en PaginationType.php

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('products_per_page', IntegerType::class)
            ->add('default_order_by', ChoiceType::class, [
                'choices' => [
                    'Product name' => 0,
                    'Product price' => 1,
                    'Product add date' => 2,
                    'Product modified date' => 3,
                    'Position inside category' => 4,
                    'Brand' => 5,
                    'Product quantity' => 6,
                    'Product reference' => 7,
                    'Best seller' => 8

 

Y en Category.php:

        $orderyBy = Validate::isOrderBy($orderyBy) ? Tools::strtolower($orderyBy) : 'sales';
        $orderWay = Validate::isOrderWay($orderWay) ? Tools::strtoupper($orderWay) : 'DESC';

 

Luego establezco como predefinido

imagen.thumb.png.1c76ebebcfd6e5437923e2bb2bb948dd.png

 

Pero sigue sin salir ni hacer efecto

imagen.png.361bfd416ef10c012be8a1a6c93bfe36.png

No sé si has logrado hacerlo efectivo, he cambiado también a las demás opciones pero ninguna lo asocia.

Link to comment
Share on other sites

Me temo que no te puedo ayudar sin remangarme. No veo nada raro a simple vista, pero no he repasado los controladores para poder ver que sucede.

En cualquier caso, ¿es posible que te lo esté ordenando por los más vendidos a pesar de que no te aparezca como seleccionado en el select? 

 

Un saludo

Link to comment
Share on other sites

6 minutes ago, Pixefora D said:

Me temo que no te puedo ayudar sin remangarme. No veo nada raro a simple vista, pero no he repasado los controladores para poder ver que sucede.

En cualquier caso, ¿es posible que te lo esté ordenando por los más vendidos a pesar de que no te aparezca como seleccionado en el select? 

 

Un saludo

Nada, si fuera así no me importaría pero tampoco lo ordena, es complicado porque tendrá más cambios que hacer, he borrado caché y todo pero como al principio. Gracias de todas formas, seguiré investigando 😉

Un saludo.

Link to comment
Share on other sites

  • 4 weeks later...
  • 5 weeks later...
Quote

Buenas, a ver si me podéis echar una mano. Recientemente han actualizado el módulo de Búsqueda por facetas (versión 3.6.0) y han incorporado un nuevo Orden "Best seller" que he traducido como "Top ventas" (Ver foto 1)

Pues te agradecería, prácticamente hasta la eternidad, me indicaras como narices lo has traducido, por que no hay manera con la misma versión del módulo, encontrar donde traducirlo y es muy molesto (por lo menos para mi), ver todo en español y ver el "Best sellers" en la lista de organización de productos.

Por favor.

Un saludo,

Ramiro

Link to comment
Share on other sites

  • 3 weeks later...
On 11/18/2020 at 11:08 AM, ramherfer said:

Pues te agradecería, prácticamente hasta la eternidad, me indicaras como narices lo has traducido, por que no hay manera con la misma versión del módulo, encontrar donde traducirlo y es muy molesto (por lo menos para mi), ver todo en español y ver el "Best sellers" en la lista de organización de productos.

Por favor.

Un saludo,

Ramiro

Hola Ramiro, disculpa el retraso, no sé si ya lo averiguaste, pero te lo dejo por si acaso:

Ve a la ruta  "public_html/modules/ps_facetedsearch/src/Product/SearchProvider.php"

Y en ese archivo modificas la traducción en estas líneas:

 return [
            $sortSalesDesc->setLabel(
                $translator->trans('Top Ventas', [], 'Modules.Facetedsearch.Shop')
            ),
            $sortPosAsc->setLabel(
                $translator->trans('Relevance', [], 'Modules.Facetedsearch.Shop')
            ),

 

Saludos!

Link to comment
Share on other sites

  • 1 month later...
On 12/7/2020 at 12:39 PM, Adrián said:

Hola Ramiro, disculpa el retraso, no sé si ya lo averiguaste, pero te lo dejo por si acaso:

Ve a la ruta  "public_html/modules/ps_facetedsearch/src/Product/SearchProvider.php"

Y en ese archivo modificas la traducción en estas líneas:

 return [
            $sortSalesDesc->setLabel(
                $translator->trans('Top Ventas', [], 'Modules.Facetedsearch.Shop')
            ),
            $sortPosAsc->setLabel(
                $translator->trans('Relevance', [], 'Modules.Facetedsearch.Shop')
            ),

 

Saludos!

Muchas gracias por el aporte. Las dichosas vueltas... yo también estaba pegándome con el asunto de la traducción de Best Sellers.

Resuelto, gracias.

 

  • Like 1
Link to comment
Share on other sites

  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...