Open Alecostantini opened 10 years ago
@Fertusco
eu tive esse mesmo problema, e comentei com o Deivison, o que acontece é que por padrão o magento ele faz o reload do review somente após vc preencher os dados do cartão, onde ele faz a validação e faz o reload no review. É padrão do magento isso, portanto, acho que uma alternativa seria colocar um aviso, ou algo do tipo...
Abraço
Boa noite @rtorresjunior
Na verdade não é padrão do Magento e sim do módulo OneStepCheckout desenvolvido pela Deivison, pois um de seus clientes precisam capturar os dados do cartão anteriormente ao reload para ver se estão elegíveis ao desconto pagando em 1x.
É uma funcionalidade customizável, mas não estamos achando o Event que dispara a atualização do Review quando selecionado a forma Cartão de Crédito.
Espero que consigamos suporte por aqui, mas caso eu descubra solução, postarei aqui no Git antes de marcar como resolvido.
Abraços
@Fertusco entendi brother...
se voce conseguir resolver passa aqui pro pessoal que é uma atualização muito importante...
Valeu irmao
Ola isso não é no modulo do OSC .
Ele verifica os campos obrigatórios, no caso dos cartão é obrigatório ( SEU MODULO DE PAGAMENTO ), então ele não da reload!
O que você precisa fazer é: em jQuery / Javascript / Prototype ao clicar no tipo Cartão remover todas as validação de obrigatoriedade da class do input do cartão.
PS. se seu modulo de pagamento estiver se estendendo para classe "Mage_Payment_Model_Method_Cc" e ou a função "public function validate()" estiver validando os campos digitados , verifique primeiro a função se não o JS NÃO IRA FUNCIONAR.
ex. de jQuery que estamos usando em produção!
jQuery('input[name="payment[method]"]').on('click', function () { jQuery('#SEU_CODE_cc_type').removeClass('required-entry validate-cc-type-select'); jQuery('#SEU_CODE_cc_number').removeClass('validate-cc-number validate-cc-type'); jQuery('#SEU_CODE_cc_owner').removeClass('required-entry'); jQuery('#SEU_CODE_expiration').removeClass('validate-cc-exp required-entry'); jQuery('#SEU_CODE_expiration_yr').removeClass('required-entry'); jQuery('#SEU_CODE_cc_cid').removeClass('cvv required-entry validate-cc-cvn');
if (this.value == 'SEU_CODE') {
setInterval(function () {
jQuery('#SEU_CODE_cc_type').addClass('required-entry validate-cc-type-select');
jQuery('#SEU_CODE_cc_number').addClass('validate-cc-number validate-cc-type');
jQuery('#SEU_CODE_cc_owner').addClass('required-entry');
jQuery('#SEU_CODE_expiration').addClass('validate-cc-exp required-entry');
jQuery('#SEU_CODE_expiration_yr').addClass('required-entry');
jQuery('#SEU_CODE_cc_cid').addClass('cvv required-entry validate-cc-cvn');
}, 3000);
}
});
Não seria interessante incluir uma opção na administração do módulo para efetuar ou não o reload ao selecionar o método de pagamento.
Estou com o mesmo problema, e não entendo nada de JQuery e JavaScript. Eu entendi que o reload só é feito após preencher todos os campos. Não seria melhor colocar o reload pra ser feito ao trocar a forma de pagamento, mesmo sem ela está preenchida? Se eu usar o código acima para remover a validação, o campo deixará de ser obrigatório e prejudicara na finalização da compra?
Desde já agradeço.
Brother as solicitações sobre adicionar melhorias são intensas, porém não temos tempo hábil para tocar os projetos open source, assim peço a contribuição da comunidade para implementar. Nós temos varias exclusividades e demandas para nossos clientes, mas não alinhamos o que temos open. Se tiver como enviar as melhorias nos avaliamos e autorizamos no git.
Atenciosamente
Deivison Arthur L. Serpa Founder & CEO Inovarti - Soluções Avançadas em E-commerce
Cel: (21) 99203-8986 Skype: deivisonarthur
sites e blog:
"A Inovarti http://www.inovarti.com.br/ é uma empresa que aspira inovação e para nós o full acompanhamento tecnológico garante a evolução e crescimento de nossos clientes. Alinhamos nossa exclusiva qualidade diferenciada com as melhores parceiras tecnológica do mercado."
"É melhor esperar que um programador produtivo torne-se disponível do que esperar que o primeiro programador disponível torne-se produtivo!"
Em 10 de dezembro de 2014 15:43, Litiano notifications@github.com escreveu:
Estou com o mesmo problema, e não entendo nada de JQuery e JavaScript. Eu entendi que o reload só é feito após preencher todos os campos. Não seria melhor colocar o reload pra ser feito ao trocar a forma de pagamento, mesmo sem ela está preenchida? Se eu usar o código acima para remover a validação, o campo deixará de ser obrigatório e prejudicara na finalização da compra?
Desde já agradeço.
Reply to this email directly or view it on GitHub https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/issues/36#issuecomment-66491602 .
Caros, estou usando o seguinte código para forçar o reload na mudança de opções de pagamento:
app/design/frontend/base/default/template/onestepcheckout/onestep/form/payment_method.phtml:
jQuery("input[name='payment[method]']").click(function (){ OSCPayment.switchToMethod(); });
Foi útil pois estávamos usando descontos em 1 método e precisávamos do reload ao clicar em outro...
Abraços!
Tentei seu código, mas no meu caso ficou sem carregar os campos de cartão de crédito.
Olá, alguém teve uma solução??
Isaac Lopes, não entendi o que se deve fazer quando o módulo de pagamento estende para a classe "Mage_Payment_Model_Method_Cc". Fiz como você mostrou ali, removendo a validação dos campos, mas como meu módulo estende desta classe do magento, realmente não funcionou. Você pode me dar uma dica de como resolver isto?
Obrigado!
Atualização:
app/design/frontend/base/default/template/onestepcheckout/onestep/form/payment_method.phtml:
Final do arquivo:
jQuery("input[name='payment[method]']").click(function (event){
// event.preventDefault();
var _code = jQuery(this).val();
OSCPayment.switchToMethod();
OSCPayment.switchToMethod(_code);
});
Abraços!
@neneias Valeu.
Não posso reclamar deste módulo por ser gratuito, mas esta nova versão está meio capenga, mas mesmo assim é melhor que a antiga.
Acredito que devamos contribuir mais pro módulo, como mencionado pelo @deivisonarthur .
@neneias você enviou esta dica para o repositório?
O único problema é: O reload acontece, mas os valores não são atualizados, pois a forma de pagamento não é atualizada :(
No módulo antigo bastava:
jQuery("#method_x").click(function() { checkout.update({ 'review': 1, 'payment-method': 1 }); });
E pronto... na vesão 6 nao achei nada similar.
Olá @roneclay ! Tudo bem ?
Nos testes que fiz em um cliente funcionou bem... mas vou testar mais... :)
Vou enviar a dica para o repositório.
Abçs!
acabei de fazer um comit. PS. vale lembrar que se no seu modulo de pagamento contiver a função https://github.com/magento/hackathon_january_2014/blob/9676522b7883776c8dd5c750354d4a88f51168f7/app/code/core/Mage/Payment/Model/Method/Cc.php#L83
vai ter problema https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/issues/36#issuecomment-65133830 pois dar o reload é simples, o que precisa ser executado é o salvar!. pode usar como @eneiasramos comentou jQuery("input[name='payment[method]']").click(function (){ OSCPayment.forcesavePayment(); });
ou um metodo especifico.
$$('input[name="payment[method]"]').find(function(radio) { Event.observe(radio, 'change', function() { if(radio.value == 'SEUMETODODODEPAGAMENTO') { OSCPayment.forcesavePayment(); } }); });
@isaaclopes eu devo está falhando em algum ponto.
<script>
jQuery(document).ready(function(event){
$$('input[name="payment[method]"]').find(function(radio) {
Event.observe(radio, 'change', function() {
var _code = jQuery(this).val();
if(radio.value == _code) {
OSCPayment.switchToMethod(_code);
OSCPayment.forcesavePayment();
}
});
});
});
</script>
Não tive sucesso. O resumo atualiza, mas o JSON retorna "Não é possível definir forma de pagamento." e com isso o método de pagamento não muda.
PS - Uso o módulo do Mercado Pago do Gabriel Matsuoka v2.0.0.
@roneclay então justamente o que disse em https://github.com/magento/hackathon_january_2014/blob/9676522b7883776c8dd5c750354d4a88f51168f7/app/code/core/Mage/Payment/Model/Method/Cc.php#L83 o reload não depende apenas da OSC.
Porque não da reload? https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/blob/master/skin/frontend/base/default/onestepcheckout/js/payment.js#L206 ele verifica se os campos do seu pagamento esta validado!
O que foi incluido? https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/blob/master/skin/frontend/base/default/onestepcheckout/js/payment.js#L177 Força a salvar.
Porque da mensagem "Não é possível definir forma de pagamento." ? https://github.com/magento/hackathon_january_2014/blob/9676522b7883776c8dd5c750354d4a88f51168f7/app/code/core/Mage/Payment/Model/Method/Cc.php#L152
PS. se seu modulo de pagamento estiver se estendendo para classe "Mage_Payment_Model_Method_Cc" https://github.com/magento/hackathon_january_2014/blob/9676522b7883776c8dd5c750354d4a88f51168f7/app/code/core/Mage/Payment/Model/Method/Cc.php#L28 e ou a função "public function validate()" https://github.com/magento/hackathon_january_2014/blob/9676522b7883776c8dd5c750354d4a88f51168f7/app/code/core/Mage/Payment/Model/Method/Cc.php#L83estiver validando os campos digitados. NÃO IRA FUNCIONAR.
sobre o seu script não deu erro de js?
funciona o auto reload mas com um detalhe. você tem que obrigatoriamente mexer em todas os campos, inclusive nas parcelas. se você quer comprar com 1 parcela, que já é predefinido e não for lá manualmente e re-selecionar esta parcela o módulo não atualiza...
eu acho que na verdade o script para forçar o reaload tem que ser disparado no campo código de segurança e não nas parcelas...
ola @davirs mas vc quem coloca onde quer!
exemplo funcionando em producao, no modulo de pagamento que utilizo, não na OSC.
//ao clicar na opção de pagamento $$('input[name="payment[method]"]').find(function(radio) { Event.observe(radio, 'change', function() { if(radio.value == '<?php echo $_code ?>') { //limpar os campos do cartao var block = 'paymentform' + radio.value; [block].each(function(el) { var element = $(el); if (element) { element.select('input', 'select').each(function(field) { field.value = ''; }); } }); //força o salvar ignorando validate de JS "required-entry" e outros OSCPayment.forcesavePayment(); } });
o restante fica normal se vc "mexer em todos os campo" tirando a obrigatoriedade ele sempre vai ficar dando reload a cada campo, pois os campos serão validado!
Galera eu entendi q o problema esta no meu módulo (no caso uso o Mundipagg da uecommerce que eles me mandaram). Mas onde devo mexer pra resolver o problema, alguém faz idéia.?.. vlw
Eu sei que é uma solução porca, mas bem porca, porém, por enquanto, até eu conseguir melhorar, funcionou. o único problema é que faz um reload na página toda.
alterei o arquivo: app/design/frontend/base/default/template/onestepcheckout/onestep/form/shipping_method.phtml
criei nos scripts uma função: function reloadPage(){ location.reload(); } (eu sei, como eu disse é uma solução porca)
e nos inputs, radio, chamo essa função por onclick="reloadPage();"
é lógico, vai demorar ... mas resolve o problema momentaneamente.
Estou usando o tema rwd para estudos.
abs
(obs: se alguém tiver alguma outra ideia .... pra melhorar esse remendo.. .. eu agradeço)
Caros,
disponibilizei alguns ajustes para os problemas de reload:
https://github.com/eneiasramos/OSC-Magento-Brasil-6-Pro/
Abçs!
@neneias Cara agradeço muito a ajuda...mas ainda nao deu certo pra mim ...estou usando o modulo do pagseguro do rmartins Caso queria testar no meu ambiente é só falar que eu disponibilizo via Teamviewer
@magnored você fez um clone do meu projeto? Tem URL da loja?
@neneias Sim, editei todos os arquivos Verifique em www.fprinter.com.br/loja se quiser me chamar no skype tbm estou online: rodrigo.dizero@gmail.com
@magnored preciso que desabilite o merge de JS e compilação de PHP...
@neneias Feito, compilação desativada e unir o JS tbm
@magnored ao que parece está funcionando: quando altero o frete ele atualiza o pagamento... pode testar aí?
@neneias Quando eu altero o frete ele ja teria que dar o desconto de 5% no TEF ou Boleto, pra mim ainda nao esta atualizando... To usando o chrome, sera que seria um problema de cache ?
@magnored eu consegui aqui... estou usando o Firefox.
@neneias Quando voce clica no cartao tbm?
@neneias aparentemente era problema com meu cache mesmo Estou testando agora e deu tudo certo!!
@magnored você tem um erro no seu checkout que precisa ser corrigido:
E sua regra de desconto está para todos os tipos de cartões!
Demais @neneias!! Funcionou perfeitamente!! Nossa, muito obrigado mesmo :+1:
Apenas o meu cadastro de novos clientes que parou de funcionar, não sei se foi por causa dessa modificação ou outra coisa que mexi na loja...
@neneias no modulo do ricardo nao existe a possibilidade de colocar o desconto para somente um tipo de cartao, entao esta geral mesmo (e pra mim tem que ser assim) Referente ao erro eu vi que é algum bug do tema, estou tentando ver se descubro o que é
@neneias conseguir arrumar o bug do JS... Mas acho que ainda nao esta 100% Simulei uma opcao na ql eu primeiro cliquei em boleto e seguida cliquei em cartao. Voce pode ver que no total ele atualizou, mas no plugin do ricardo o valor esta com o desconto e quando eu tento concluir a compra ele informa a divergencia nos valores
@eneiasramos @neneias Boa tarde.
Fiz o procedimento e instalei novamente o módulo utilizando suas atualizações, porem continua com o mesmo problema.
O módulo que utilizo para pagamento com cartão de crédito CIELO é o módulo Oitoo.
Acho que já tentei toda as opções apresentadas aqui, porem continuo com o mesmo problema.
No meu caso, cuido de uma loja onde existem regras de desconto diferenciados para o boleto(CushyBoleto) e para cartão de crédito(Maxima). Estava com o mesmo problema passei semanas pesquisando, e 'resolvi' o problema com uma pequeno ajuste técnico (gambiarra).
*No arquivo - SUA-LOJA/skin/frontend/base/default/onestepcheckout/js/shipment.js
*No Arquivo - SUA-LOJA/skin/frontend/base/default/onestepcheckout/js/payment.js
-Após a função de update " OnestepcheckoutCore.updater.startRequest(this.savePaymentUrl, { method: 'post', parameters: Form.serialize(this.container, true) });" - inseri a "gambiarra"
"if (jQuery('input[name="shipping_method"]:checked').length > 0){ jQuery('input[name="shipping_method"]:checked').click(); }else{ jQuery('input[name="shipping_method"]').first().click(); }"
Ou seja após ser selecionado o método de pagamento eu fiz com q o onestepcheckout faça uma atualização dos valores do frete, dessa maneira ele atualiza também os valores conforme o método de pagamento.
Espero ter ajudado.
@AndreFSilveira Cara, eu coloquei assim:
/**if (!isValid) {
return;
}**/
OnestepcheckoutCore.updater.startRequest(this.savePaymentUrl, {
method: 'post',
parameters: Form.serialize(this.container.id, true)
});
if (jQuery('input[name="shipping_method"]:checked').length > 0){
jQuery('input[name="shipping_method"]:checked').click();
}else{
jQuery('input[name="shipping_method"]').first().click();
}
É isso mesmo?
Aqui não deu jeito algum.
Aliás, @eneiasramos Baixei a sua versão no seu git e continua a mesma coisa.
Se eu escolho boleto ele dá o desconto, mas se por ventura eu voltar para outro método de pagamento ele continua dando o desconto, não recalcula.
Se alguém puder me dar uma luz eu agradeço muito! A loja que estou trabalhando está em http://cfcareho.nextmp.net
Abraços!
Olá @filimm ! Tudo bem?
Pode haver alguma inconsistência no seu template. Vide erros JS encontrados:
@eneiasramos obrigado pelo retorno! Bem, alterei o tema para o RWD e o erro de JS continua ocorrendo. Acredito porque essa chamada seja do próprio OSC. É como se a forma de entrega não estivesse selecionada quando carregamos o checkout.
Então, fazendo uma verificação mais profunda eu entendi que esse erro de JS está dizendo que OSCShipment não foi definido. O script que se encontra no payment_method.phtml é:
<script type="text/javascript">
$$('input[name="payment[method]"]').each(function(item,index){
Element.observe(item,'change',function(){
// for Discount purpose...
OSCPayment.forcesavePayment();
//OSCShipment.switchToMethod(OSCShipment.currentMethod, true);
OSCShipment.switchToMethod(OSCShipment.currentMethod, true);
});
});
</script>
Esse método switchToMethodé referenciada no arquivo shipment.js com a criação da classe OnestepcheckoutShipment = Class.create();
No final desse arquivo shipment.js existe a referencia ao método que está dando erro:
switchToMethod: function(methodCode, forced = false) {
if (this.currentMethod !== methodCode || forced) {
OnestepcheckoutCore.updater.startRequest(this.saveShipmentUrl, {
method: 'post',
parameters: Form.serialize(this.container.id, true)
});
OSCShipment.currentMethod = this.currentMethod = methodCode;
}
}
A minha pergunta é como eu defindo uma classe OSCShipment dentro de payment_method.phtml para que a execução do método pode ser feita de forma correta?
Olá @filimm ! Tudo bem?
A criação do objeto OSCShipment é feito no arquivo: https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/blob/master/app/design/frontend/base/default/template/onestepcheckout/onestep/form/shipping_method.phtml
Att,
Fala @eneiasramos . Conferi o arquivo que você citou e está exatamente igual ao que eu tenho. Agora, se é nesse arquivo que ele faz a criação do objeto, por que diabos ainda retorna o erro dizendo que esse objeto não foi definido ? É como se não estivesse trazendo essa informação para ser trabalhada pelo OSC.
ola @filimm o bloqueio que esta tendo não é na OSC é no seu modulo de pagamento http://cloud.inovarti.com.br/0k1L1T0Z1A0Z ja explicado acima, é o mesmo que acontece com muitos módulos de pagamento https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/issues/36#issuecomment-93892071 , se reparar no print é o mesma frase
Porque da mensagem "Não é possível definir forma de pagamento." ? https://github.com/magento/hackathon_january_2014/blob/9676522b7883776c8dd5c750354d4a88f51168f7/app/code/core/Mage/Payment/Model/Method/Cc.php#L152
*informações porque quando seleciono cartão não limpa o desconto
Fala @isaaclopes beleza? Cara acho que o problema da forma de pagamento eu resolvi, mas ainda continuo com o problema da forma de entrega. Quando há apenas uma opção de entrega ele não finaliza o checkout, aparece uma janela exigindo que eu informe uma forma de entrega. O problema é que nesse caso, diferente dos Correios não tem outra opção para selecionar (ex: pac ou sedex) que faria um reload na página. Ele já vem com essa opção marcada e no entanto o sistema age como se não estivesse marcado.
Resolvi do modo português: Como a coisa só funciona quando você faz uma "escolha" eliminei o "checked" de quanto tiver apenas uma opção. Não sei se isso é a melhor prática, mas resolveu!
Em /app/design/frontend/base/default/template/onestepcheckout/onestep/form/shipping_method.phtml
Linha 36:
<?php if ($_sole) : ?>
<input name="shipping_method" type="radio" value="<?php echo $_rate->getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>" checked="checked" class="radio"/>
Vai ficar assim:
<?php if ($_sole) : ?>
<input name="shipping_method" type="radio" value="<?php echo $_rate->getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>" class="radio"/>
Explicando: isso obrigará o usuário a dar um clique na forma de entrega, mesmo que tenha apenas uma, quando ele der o clique haverá o reload e não dará mais o erro para "Informar forma de entrega"
opa @filimm vc tem um erro de JS http://cloud.inovarti.com.br/3m3f160b121E sobre a linha 36 pode usar sem o check tb! / ou ao carregar simular um click
esta faltando um script no seu arquivo https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/blob/master/app/design/frontend/base/default/template/onestepcheckout/onestep/form/shipping_method.phtml#L56
@isaaclopes Fala ae. Cara, o arquivo que eu tenho é exatamente esse e o erro continua ocorrendo. Faz ideia do que possa ser isso? Pra mim essa erro está diretamente ligado ao fato da página não passar a informação da forma de entrega.
@filimm acho que o base deve ser! mas sei layout não tem vc deve ter copiado ele e faltou essa parte.
o meu http://cloud.inovarti.com.br/3N3i370G2T2k o seu http://cloud.inovarti.com.br/2q1f0C3y2s3y realmente esta faltando no seu!
da uma olhada em /app/design/frontend/SEUTEMPLATE/default/template/onestepcheckout/onestep/form/shipping_method.phtml ou /app/design/frontend/base/default/SEUTEMPLATE/onestepcheckout/onestep/form/shipping_method.phtml
Prezados, estamos com um problema.
Quando selecionamos a opção boleto, o Review é carregado novamente e o valor do desconto configurado também.
Para quando alternamos para cartão de crédito, o desconto do boleto permanece e não ocorre o reload do Review.
Como fazemos para forçar este reload no ato de selecionar o cartão de crédito, da mesmo forma como ocorre com o boleto?
Obrigado.