Jump to content
RNRF

Restrição na "Forma de pagamento" do checkout - OPENCART

Recommended Posts

RNRF

Boa noite

Estou a usar um script e-commerce Opencart v1.5.2.1 e tenho o site para a minha empresa praticamente completo.

Apenas gostaria que me ajudassem numa situação .

No passo 5 do checkout "Forma de pagamento" tenho 3 opções : paypal / transferencia bancaria / contra-reeembolso . Gostaria de , para uma categoria de productos que tenho , restringir o modo de contra-reeembolso , mas apenas para esse certo produto / caterogia de producto .

Ou seja , a encomenda pode ter varios productos , mas ao ter apenas um producto daquela categoria deixa de ser logo possivel o envio contra-reeembolso , era so isso .

É preciso certamente algum codigo que crie uma função no checkout que quando aparece um producto que seja dessa categoria que seja impossivel pagar em contra reembolso.

Qual será o ficheiro a editar ? Talves algum destes ?

/www/ocart/catalog/view/theme/default/template/checkout/checkout.tpl

/www/ocart/catalog/controller/checkout/checkout.php

Será que alguem me pode ajudar com a função por favor ?

Muito Obrigado

RNRF

Share this post


Link to post
Share on other sites
taviroquai

Fiz o download e olhei para os controladores em catalog/controller/checkout

Parece-me que no passo 5, o controlador é ControllerCheckoutPaymentMethod (payment_method.php)

Deve ser aqui que terás que consultar de novo os produtos e conforme as condições que indicaste, listar apenas os metodos de pagamento que queres, ou seja, filtrares a lista de métodos de pagamento aqui (linha 45):

$results = $this->model_setting_extension->getExtensions('payment');

Share this post


Link to post
Share on other sites
RNRF

Muito Boa tarde

Agradeço desde já o tempo que reservou para o meu problema e por me ter tentando ajudar .

Ainda assim não estou a conseguir encontrar a solução para o problema pois o meu problema mesmo é o código.

$results = $this->model_setting_extension->getExtensions('payment');

que significa esta linha de codigo ?

Share this post


Link to post
Share on other sites
simonoop

Viva.

Já passei por parecido.

Edita /catalog/controller/checkout/payment.php

Procura por

if ($this->request->server['REQUEST_METHOD'] == 'POST') {

e adiciona, imediatamente antes, o seguinte código:

        $products = $this->cart->getProducts();
        $this->load->model('catalog/product');
        $hasTargetCat = false;
        foreach ($products as $product) {
            $temp_product_id = $product['product_id'];

            $temp_categories = $this->model_catalog_product->getCategories($temp_product_id);
            foreach($temp_categories as $temp_category) {
                if($temp_category['category_id']==18)$hasTargetCat=true;
            }
        }

Substitui o 18 que aí meti hardcoded por um ou mais category_ids.

Depois procura:

            if (isset($this->session->data['payment_methods'])) {
                $this->data['payment_methods'] = $this->session->data['payment_methods'];
            } else {
                $this->data['payment_methods'] = array();
            }

e adiciona imediatamente depois:

            if($hasTargetCat) {
                foreach($this->data['payment_methods'] as $kpm=>$vmp) {
                    if($vmp['code']=='cod')unset ($this->data['payment_methods'][$kpm]);
                }
            }

estou a comparar o codigo do metodo de pagamento com a string "cod" que é a que identifica o core payment method "Cash On Delivery" do OC. Pode ser diferente no teu caso.

Isto foi feito um bocado de cabeça e sem ter sido muito testado mas é um bom principio.

Share this post


Link to post
Share on other sites
simonoop

Basicamente o q faz este código em termos práticos ?

A primeira parte saca as categorias de cada produto presente no carrinho de compras e compara-as com as que devem eliminar o contra-reeembolso.

A segunda parte elimina o contra-reembolso da lista de métodos de pagamento se se verificar a condição hasTargetCat.

Share this post


Link to post
Share on other sites
RNRF

E como é que ela sabe quais é que deve eleminar ou nao ? Como defino isso para a categoria que pretendo ?

Share this post


Link to post
Share on other sites
simonoop

E como é que ela sabe quais é que deve eleminar ou nao ? Como defino isso para a categoria que pretendo ?

Hmmm... não sei se compreendi a pergunta.

No exemplo que te dei, no caso de existir algum produto da cat 18, o contra-reembolso deverá ser eliminado, log a var hasTargetCat  é alterada para true.

O segundo snippet percorre todos os métodos de pagamento e elimina o contra-reembolso... caso hasTargetCat seja true...

Share this post


Link to post
Share on other sites
RNRF

desculpa , mas da parte de programação eu nao percebo quase nada.

Agradeço imenso desde ja a paciencia que estas a ter em me tentar ajudar , mas para eu conseguir por aquilo como pretendo nao vai ser muito rapido estou a ver lol . Mas pronto , so vou ter que editar o ficheiro do payment.php certo ? O codigo da categoria que vou querer alterar é a 34 entao

Share this post


Link to post
Share on other sites
simonoop

(...) so vou ter que editar o ficheiro do payment.php certo ? O codigo da categoria que vou querer alterar é a 34 entao

Exacto. Atenção: isto não foi testado convenientemente... convém testar... introduzir e retirar produtos do carrinho, com utilizador logado e guest, etc.

Share this post


Link to post
Share on other sites
RNRF

Boa amigo

O fiicheiro /catalog/controller/checkout/payment.php , nao existe na minha versao ,

o que eu tenho é /catalog/controller/checkout/payment_method.php , e neste nao existe o codigo

if ($this->request->server['REQUEST_METHOD'] == 'POST') {

=\

Exacto. Atenção: isto não foi testado convenientemente... convém testar... introduzir e retirar produtos do carrinho, com utilizador logado e guest, etc.

Share this post


Link to post
Share on other sites
simonoop

Ainda não trabalho com essa versão... Sou um late adopter por convicção e estou à espera de deixar o pó assentar e dos outros se chatearem com hipotéticos bugs.

Assim que tiver algum tempo livre vou olhar para isso.

Share this post


Link to post
Share on other sites
RNRF

Que pena nao conheceres esta versão =\ Será que no forum do Opencart me podem ajudar com isso mostrando o teu codigo ou o codigo é diferente para as novas versoes ?

Share this post


Link to post
Share on other sites
simonoop

Infelizmente não faço ideia.

Vou ter de olhar para o código responsável por isso na 1.5.2.1

Calculo que não ande muito longe daquilo que fiz para a 1.5.1.x

Share this post


Link to post
Share on other sites
RNRF

Eu tambem penso que nao , so talves mude os ficheiros e alguns campos de codigo , certamente ou é no cart.php ou no payment_method.php , mas entao achas que me podes ver isso para quando ? Ser-me-ia um preciosa ajuda .

Cumprimentos

Share this post


Link to post
Share on other sites
simonoop

Viva.

Penso que terei tempo para ver isto durante o fim de semana. Aviso quando chegar a alguma conclusão!

Share this post


Link to post
Share on other sites
simonoop

Viva.

Infelizmente não me consegui aproximar de um pc tempo suficiente durante o FDS para ver isto (a família também merece algum tempo meu :D

Vou tentar reservar uma horita para isto hoje ao final do dia.

Share this post


Link to post
Share on other sites
simonoop

Como suspeitávamos, a solução para v1.5.2.1 é muito parecida:

Edita /catalog/controller/checkout/payment_method.php

Procura por

if (!empty($payment_address)) {

e adiciona, imediatamente DEPOIS, o seguinte código:

        $products = $this->cart->getProducts();
        $this->load->model('catalog/product');
        $hasTargetCat = false;
        foreach ($products as $product) {
            $temp_product_id = $product['product_id'];

            $temp_categories = $this->model_catalog_product->getCategories($temp_product_id);
            foreach($temp_categories as $temp_category) {
                if($temp_category['category_id']==18)$hasTargetCat=true;
            }
        }

Substitui o 18 que aí meti hardcoded por um ou mais category_ids.

Depois procura:

        if (isset($this->session->data['payment_methods'])) {
            $this->data['payment_methods'] = $this->session->data['payment_methods'];
        } else {
            $this->data['payment_methods'] = array();
        }

e adiciona imediatamente depois:

            if($hasTargetCat) {
                foreach($this->data['payment_methods'] as $kpm=>$vmp) {
                    if($vmp['code']=='cod')unset ($this->data['payment_methods'][$kpm]);
                }
            }

Testei e parece funcionar mas poderão existir implicações... convém testar.

Share this post


Link to post
Share on other sites
RNRF

Nao funciona , alterei a categoria de produto de 18 para 34 ( que é a categoria dos produtos na qual eu quero que seja restrito o contra-reembolso )

e continua a aparecer =\

Share this post


Link to post
Share on other sites

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...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.