No form edit do painel de clientes, com OSC6, quando vamos alterar dados da aba “Informações da conta” e salvamos, temos o seguinte erro: “Senha atual inválida”, sem o OSC salva normal, mas notei que ele mostrava o box de senha atual quando o OSC estava desabilitado, fui olhar a controller desta versão nova 1.9.3.x em:
controller app/code/core/Mage/Customer/controllers/AccountController.php
Notei diferenças entre a 1.9.2.x e 1.9.4.0/1.9.3.x, na nova versão do magento, o método editPostAction() pede o “current_password”, veja a parte importante da controller:
...
linha 993
if (!$customer->validatePassword($this->getRequest()->getPost('current_password'))) {
$errors[] = $this->__('Invalid current password');
}
...
Então, para funcionar, devemos modificar o edit.phtml do OSC para ficar parecido com o edit.phtml original do Magento.
Entre em: app/design/frontend/base/default/template/onestepcheckout/customer/form
editar o edit.phtml (faça uma cópia antes deste arquivo, como backup).
Após a linha 38 temos que colocar o bloco <li></li> do “current_password”, ele vai sair da posição atual, que é da linha 47 à linha 54, o trecho do edit.phtml, depois de editado, ficou assim:
<li>
<label for="email" class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
<div class="input-box">
<input type="text" name="email" id="email" readonly="" value="<?php echo $this->escapeHtml($this->getCustomer()->getEmail()) ?>"
title="<?php echo $this->__('Email Address') ?>" class="input-text required-entry validate-email" />
</div>
</li>
<li>
<label for="current_password" class="required"><em>*</em><?php echo $this->__('Current Password') ?></label>
<div class="input-box">
<!-- Este é um campo fictício escondido para enganar o Firefox no auto preenchimento de senha -->
<input type="text" class="input-text no-display" name="dummy" id="dummy" />
<input type="password" title="<?php echo $this->__('Current Password') ?>" class="input-text" name="current_password" id="current_password" />
</div>
</li>
<li class="control">
<input type="checkbox" name="change_password" id="change_password" value="1" onclick="setPasswordForm(this.checked)" title="<?php echo $this->__('Change Password') ?>"<?php if ($this->getCustomer()->getChangePassword() == 1): ?> checked="checked"<?php endif; ?>
class="checkbox" /><label for="change_password"><?php echo $this->__('Change Password') ?></label>
</li>
</ul>
</div>
<div class="fieldset" style="display:none;">
<h2 class="legend"><?php echo $this->__('Change Password') ?></h2>
<ul class="form-list">
<li class="fields">
<div class="field">
<label for="password" class="required"><em>*</em><?php echo $this->__('New Password') ?></label>
<div class="input-box">
<input type="password" title="<?php echo $this->__('New Password') ?>" class="input-text validate-password" name="password" id="password" />
</div>
</div>
<div class="field">
<label for="confirmation" class="required"><em>*</em><?php echo $this->__('Confirm New Password') ?></label>
<div class="input-box">
<input type="password" title="<?php echo $this->__('Confirm New Password') ?>" class="input-text validate-cpassword"
name="confirmation" id="confirmation" />
</div>
</div>
</li>
</ul>
</div>
Agora, neste mesmo fonte, temos uma rotina em javascript que contém uma parte referente a senhas, você deve deixar a rotina setPasswordForm assim:
function setPasswordForm(arg) {
if (arg) {
//$('current_password').up(3).show();
//$('current_password').addClassName('required-entry');
$('password').up('.fieldset')['show']();
$('password').addClassName('required-entry');
$('confirmation').addClassName('required-entry');
} else {
//$('current_password').up(3).hide();
//$('current_password').removeClassName('required-entry');
$('password').up('.fieldset')['hide']();
$('password').removeClassName('required-entry');
$('confirmation').removeClassName('required-entry');
}
}
Testei em duas lojas novas e funcionou, uma com 1.9.3.8 e outra com 1.9.4.0.
Espero ter ajudado.
Alfredo Letti
Obrigado pela dica ! Bastante útil!