Como copiar o carrinho em outro carrinho para alterar o id_cart?

Objetivos do blog

Depois de ler este blog, poderemos copiar o carrinho em outro carrinho para alterar o código do carrinho.

Exigência

Precisamos modificar o arquivo abaixo para corrigir o mesmo. Nós estaremos fazendo mudanças no arquivo Core para o mesmo.

Diretório raiz \ classes \ PaymentModule.php

Procedimento

Precisamos modificar a função de ordem de validação no arquivo de classe PaymentModule. Como essa função é chamada apenas uma vez ao concluir o pedido. Portanto, adicionamos o código no mesmo para evitar a criação de vários carrinhos.

if (self :: DEBUG_MODE) {PrestaShopLogger :: addLog ('PaymentModule :: validateOrder - Função chamada', 1, nulo, 'Carrinho', (int) $ id_cart, true); } if (! isset ($ this-> contexto)) {$ this-> context = Context :: getContext (); } $ this-> context-> cart = new Carrinho ((int) $ id_cart);

O código abaixo precisa ser adicionado na função de ordem de validação após as linhas acima.

// mudanças iniciadas // Para salvar a chave segura do id do carrinho atual e reatribuir o mesmo para o novo carrinho $ old_cart_secure_key = $ this-> context-> cart-> secure_key; // Para salvar o ID do cliente do ID do carrinho atual e reatribuir o mesmo para o novo carrinho $ old_cart_customer_id = (int) $ this-> context-> cart-> id_customer; // Para desmapear o cliente do carrinho antigo $ this-> context-> cart-> id_customer = 0; // Para atualizar o carrinho $ this-> context-> cart-> save (); // Para buscar os produtos do carrinho atual $ cart_products = $ this-> context-> cart-> getProducts (); // Criando novo objeto de carrinho $ this-> context-> cart = new Cart (); $ this-> context-> cart-> id_lang = $ this-> contexto-> idioma-> id; $ this-> context-> cart-> id_currency = $ this-> contexto-> moeda-> id; // para adicionar novo carrinho $ this-> context-> cart-> add (); // para atualizar o novo cart foreach ($ cart_products as $ product) {$ this-> context-> cart-> updateQty ((int) $ product ['quantidade'], (int) $ product ['id_product'], (int) $ product ['id_product_attribute']); } if ($ this-> context-> cookie-> id_guest) {$ guest = new Convidado ($ this-> contexto-> cookie-> id_guest); $ this-> context-> cart-> mobile_theme = $ guest-> mobile_theme; } // para mapear o novo carrinho com o cliente $ this-> context-> cart-> id_customer = $ old_cart_customer_id; // para salvar o novo carrinho $ this-> context-> cart-> save (); if ($ this-> context-> cart-> id) {$ this-> contexto-> cookie-> id_cart = (int) $ this-> contexto-> cart-> id; $ this-> context-> cookie-> write (); } // para atualizar o $ id_cart com o do novo carrinho $ id_cart = (int) $ this-> context-> cart-> id; $ this-> context-> cart-> secure_key = $ old_cart_secure_key; // muda mais

Depois de seguir o procedimento acima, a lista de carrinho de compras terá esta aparência, ou seja, ter um carrinho duplicado com os mesmos detalhes do carrinho com o qual o pedido foi feito.
lista de carrinho de compras

Resumo

Após seguir o procedimento acima, você poderá copiar o carrinho em outro carrinho para alterar o id_cart.


Obtenha os mais recentes produtos sem preços especiais (Opencart 2.3)

Objetivos do blog

Depois de ler este blog, você será capaz de buscar produtos do banco de dados Opencart com base no parâmetro que é passado da URL.

Exigência

Temos que exibir os produtos mais recentes com base no parâmetro passado no URL. Usando este parâmetro, temos que decidir se temos que exibir produtos especiais ou não.

Implementação de Código

Para implementar isso, precisamos fazer mudanças em nosso controlador e modelo. No controlador nós adicionamos a condição para passar o parâmetro e no modelo faremos mudanças na consulta de acordo com o parâmetro passado. Para lidar com condição estamos usando show_special parâmetro no código. Abaixo está o código que temos que adicionar no controlador (catalog / controller / extension / module / latest.php):

/ * Checando a chave show_special no parâmetro get * Esta chave ($ show_special) será usada para buscar dados condicionalmente do banco de dados. * ie if $ show_special = 1 então exibe produtos que especiais * $ show_special = 0 então exibem produtos que não têm especiais * else * exibem todos os produtos independentemente de especiais * / if (isset ($ this-> request-> get [' show_special '])) {// passando o valor na variável se definido na URL $ show_special = $ this-> request-> get [' show_special ']; } else {// Caso contrário, uma string vazia será passada $ show_special = ''; } // Criando uma variável a ser passada para o modelo $ filter_data = array ('start' => ($ page - 1) * $ limite, 'limite' => $ limite, 'show_special' => $ show_special); // Chamando a função model para buscar dados do banco de dados de acordo com os dados passados ​​na matriz filter_data. $ results = $ this-> model_catalog_product-> getProductLatest ($ filter_data);

Neste código, primeiro verificamos se 'show_special'parâmetro é definido no URL ou não. Se sim, defina o valor do parâmetro em uma variável $ show_special e se não, defina a variável como em branco. Então nós criamos uma matriz ($ default_data) com os valores em nome dos quais temos que buscar produtos do banco de dados. Então nós chamamos a função modelo getProductLatest () para buscar os produtos mais recentes de acordo com a variável passada ($ filter_data) na função. Aqui está a função que temos que adicionar no modelo (catálogo / modelo / catálogo / produto):

public function getProductLatest ($ data = array ()) {// Definindo $ join e $ condition parameters para buscar dados de produtos especiais se ($ data ['show_special'] == '1') {$ join = "LEFT JOIN" . DB_PREFIX. "product_special ps ON (ps.product_id = p.product_id)"; $ condition = "AND ps.customer_group_id = '". (int) $ this-> config-> get ('config_customer_group_id'). "'AND ((ps.date_start =' 0000-00-00 'OU ps.date_start <NOW ()) AND (ps.date_end =' 0000-00-00 'OU ps.date_end> AGORA () OU ps.date_end = '0001-01-01')) "; } // Configurando os parâmetros $ join e $ condition para buscar dados de produtos que não são specil elseif ($ data ['show_special'] == '0') {$ join = "LEFT JOIN". DB_PREFIX. "product_special ps ON (ps.product_id = p.product_id)"; $ condition = "AND ps.product_id IS NULL"; } else {// Definindo os parâmetros $ join e $ condition para buscar dados de todos os produtos, independentemente do especial $ join = ''; $ condition = ''; } // Consulta para buscar dados de produtos do banco de dados. Adicionado $ join e $ condition parâmetro na consulta para buscar dados de acordo $ sql = "SELECT DISTINCT p.product_id FROM". DB_PREFIX. "product p LEFT JOIN". DB_PREFIX. "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN". DB_PREFIX. "product_to_store p2s ON (p.product_id = p2s.product_id) $ aderir WHERE p.status = '1' E p.date_available <= NOW () E p2s.store_id = '". (int) $ this-> config-> get ('config_store_id'). "'$ condition GROUP BY p.product_id ORDER BY p.product_id DESC"; // Configurando o limite na consulta se passou LIMIT do controlador. if (isset ($ data ['iniciar']) || isset ($ data ['limite'])) {if ($ data ['início'] <0) {$ data ['início'] = 0; } if ($ data ['limite'] <1) {$ data ['limite'] = 20; } $ sql. = "LIMITE". (int) $ data ['iniciar']. ",". (int) $ data ['limite']; } $ product_data = array (); // Execute a consulta $ query = $ this-> db-> query ($ sql); // Loop para definir dados buscados na variável para passar no controlador. foreach ($ query-> linhas como $ result) {$ product_data [$ resultado ['product_id']] = $ this-> getProduct ($ resultado ['product_id']); } // Retorna os dados dos produtos para o controlador. return $ product_data; }

No modelo, definimos variáveis $ join e $ condition com base nas seguintes três condições:

  1. Se show_special for 1: Neste caso, exibimos apenas produtos que são especiais. Como em todo o caso, os dados de produtos especiais são armazenados na tabela oc_product_special, por isso adicionamos a junção da tabela oc_product à tabela oc_product_secial para buscar dados apenas de produtos especiais.
  2. Se show_special for 0: Neste caso, exibimos produtos que não estão configurados como especiais. Então, para encontrar produtos que não são especiais, temos que buscar produtos que estão em uma tabela especial, mas na tabela oc_product_special. Para isso, adicionamos a junção LEFT da tabela oc_product com a tabela oc_product_secial e a condição adicionada "ps.product_id IS NULL".
  3. Se show_special for diferente de 0 e 1: Neste caso, temos que buscar todos os produtos, sejam eles especiais ou não. Então, para isso, buscamos diretamente os dados da tabela oc_product.

Depois de adicionar todas as três condições possíveis, escrevemos a consulta e a executamos. Em seguida, definimos todos os dados buscados $ product_data matriz e retornar o mesmo para o controlador.

Nota: aqui para buscar os produtos mais recentes, acabamos de usar 'Order by product_id DESC' na consulta. Se você deseja buscar dados de produtos que foram adicionados nos últimos dias, então você pode adicionar mais uma condição na cláusula WHERE, ou seja, date_added> 'any date'.

Resumo

Depois de seguir o procedimento acima, você poderá buscar os produtos especiais mais recentes com base no parâmetro passado para produtos especiais na URL.


Como calcular o frete grátis com base no preço total final no Prestashop?

Depois de ler este blog, poderemos calcular o Frete Grátis com base no Preço Total final do Carrinho.

Problema Declaração

Atualmente, quando adicionamos produtos ao carrinho e passamos para a seção de checkout para aproveitar o desconto e o frete, vemos que o desconto se aplica após o envio. Digamos,

  • O valor total do carrinho é de US $ 100, com frete grátis e um desconto de 5% também é adicionado
  • Então, depois que o valor total do desconto do carrinho for definido abaixo de US $ 100, mas ainda assim, o frete grátis se aplica, o que não deve acontecer. O Frete Grátis deve ser aplicado ao valor Total Final do carrinho após o desconto.
  • Este é o processo padrão do Prestashop. Consulte a captura de tela abaixo, onde o frete deve ser gratuito se o total do pedido for > 50, mas tiver aplicado frete grátis enquanto o total do pedido for < 50 após o desconto –

Recomendado Read: Estratégias de frete grátis: por que oferecer? Como oferecer? Quando oferecer?

Por que o problema atual está lá?

O problema atual existe porque o valor do frete está sendo calculado no valor total do pedido que é definido no carrinho antes de aplicar o desconto. Você pode verificar as linhas de código abaixo onde o Total do pedido sem valor de desconto está sendo usado para calcular o frete –

$shipping_cost += $carrier->getDeliveryPriceByPrice($the_total_price, $id_zone, (int)$this->id_currency);

Exigência

Precisamos modificar o arquivo abaixo mencionado para corrigir o mesmo. Iremos substituir as linhas correspondentes do arquivo de classe para evitar quaisquer alterações nos arquivos Core.

Abaixo está a lista de arquivos de classe que serão substituídos

1. Diretório raiz\classes\Cart.PHP

Procedimento para resolver o problema-

Siga as etapas abaixo mencionadas –

1. Função de reescrita�getPacoteCusto de Envio

2. Após a linha abaixo –

// Total do pedido na moeda padrão sem taxas $order_total = $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING, $product_list);

3. Adicione a seguinte declaração –

$listeDiscounts = $this->getCartRules(); $total_discounts = 0; if (is_array($listeDiscounts)) { if (isset($listeDiscounts[0]['value_real'])) $total_discounts = $listeDiscounts[0]['value_real']; } $price_to_apply_shipment = floatval($order_total) - floatval($total_discounts); Leitura recomendada: Melhor extensão do gerenciador de frete grátis para a loja OpenCart

4. Substitua as linhas mencionadas abaixo –

Substitua esta linha

$check_delivery_price_by_price = Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $total_order, (int)$id_zone, (int)$this->id_currency);

Com

$check_delivery_price_by_price = Transportadora::checkDeliveryPriceByPrice($row['id_carrier'], $price_to_apply_shipment, (int)$id_zone, (int)$this->id_currency);

————E—————–

Substitua esta linha

$shipping_cost += $carrier->getDeliveryPriceByPrice($the_total_price, $id_zone, (int)$this->id_currency);

Com

$shipping_cost += $carrier->getDeliveryPriceByPrice($price_to_apply_shipment, $id_zone, (int)$this->id_currency);

5. Limpe o cache e execute.

Consulte a captura de tela abaixo após aplicar as alterações no código –

Após seguir o procedimento acima, você poderá calcular o Frete no valor total final do carrinho.

Conclusão

Quando se trata de compras online, toda a estrutura de preços desempenha um papel crucial para os clientes. Um dos fatores que podem fazer ou quebrar suas conversões é a disponibilidade de frete grátis. Um método para determinar as opções de envio e os custos em um site de comércio eletrônico é o Frete grátis Manager Addon da Knowband. Um dos requisitos mais importantes para aumentar as vendas médias é proporcionar abertura na transação.

As lojas que usaram esse módulo de frete grátis aumentaram o tráfego do site, a receita e as taxas de conversão. Com a ajuda deste plugin de frete grátis, os administradores da loja podem definir as diretrizes e condições para os custos de frete. Melhor ainda, esse recurso pode ser adicionado ou removido do site pelo administrador da loja.

O limite sobre o qual o frete grátis é oferecido pode ser definido pelos varejistas online. Como resultado, ele ainda incentiva os clientes a fazer compras maiores para se qualificarem para o frete grátis. Para saber mais sobre a funcionalidade do Módulo Frete Grátis, sinta-se à vontade para nos contatar em support@knowband.com