Magento通过jQuery电子邮件检查客户是否已经存在

时间:2013-10-03 10:12:18

标签: php jquery ajax validation magento

我正在尝试避免离线人员在已注册为客户的firecheckout页面上输入电子邮件。因此,我在我的一个开发控制器中创建了这个示例php脚本:

public function mailExists(Varien_Object $customer, $mail, $websiteId)
{
    if($websiteId){
        $customer->setWebsiteId($websiteId);
    }
    $customer->loadByEmail($mail);
    if($customer->getId()){
        return $customer->getId();
    }
    return FALSE;
}

public function formAction()
{
    $customer = Mage::getModel('customer/customer');
    $websiteId = Mage::app()->getWebsite()->getId();
    $email = $_POST['email'];
    if($this->mailExists($customer, $email, $websiteId))
    {
        echo 'mail <u>'.$email.'</u> exists containing customer id '.$this->mailExists($customer, $email, $websiteId);
    }
    else{
        $this->_formPost();
    }
}

public function _formPost()
{
    echo "<form enctype='multipart/form-data' action='".Mage::getUrl('index/form/')."' method='post'>";
    echo "<input type='text' value='shane.test@hotmail.com' id='email' name='email' />";
    echo "<input type='submit' value='verzend' />";
    echo "</form>";
}

完美无缺。但我担心的是,当有人在结帐页面输入所有字段并按下提交按钮时,所有输入的数据都将设置为空。这会给我的客户带来挫败感。因此,我认为jQuery脚本最好通知离线客户在电子邮件地址输入字段中输入电子邮件地址时不使用已注册的电子邮件或登录其帐户。

我想让我的jQuery脚本在用户在电子邮件输入字段上输入的文本上运行。 我只想出了这个:

public function testAction()
{
    echo("
            <script src='http://code.jquery.com/jquery-latest.js'></script>
            <script type='text/javascript'>
            $(document).ready(function()
            { 
                $('#email').onChange(function()
                {
                    alert('input');
                });
            });
            </script>
        ");
    $this->_testPost();
}

public function _testPost()
{
    echo "<form name='test' enctype='multipart/form-data' action='".Mage::getUrl('index/form/')."' method='post'>";
    echo "<input type='text' value='' id='email' name='email' />";
    echo "<input type='submit' value='verzend' />";
    echo "</form>";
}

这会在警告框中打印input。我如何在jQuery中实现我的php检查? 提前致谢, 沙恩

2 个答案:

答案 0 :(得分:2)

我会做什么使用jQuery AJAX调用来调用你的控制器函数,我将重写它更像以下内容:

public function ajaxAction()
{
    $customer = Mage::getModel('customer/customer');
    $websiteId = Mage::app()->getWebsite()->getId();

    if (array_key_exists('email', $_POST)) {
        $email = $_POST['email'];
    } else {
        $this->getResponse()->setBody(false);
        return;
    }
    if ($websiteId) {
        $customer->setWebsiteId($websiteId);
    }
    $customer->loadByEmail($email);
    if ($customer->getId()) {
        $this->getResponse()->setBody(true);
        return;
    }
    $this->getResponse()->setBody(false);
    return;
}

所以你真的要将所有的javascript从你的控制器中移出并进入你的视图,然后使用jQuery.ajax方法做类似的事情:

    var mail = 'a@a.com';
jQuery.ajax({
    type: "POST",
    url: "<?php echo Mage::getUrl('your/frontend/ajax') ?>",
    dataType: "json",
    data: {email: mail},
    success: function (exists) {
        if (exists == 0) {
            // js for fail, hide disable button etc etc
        } else if (exists == 1) {
            // js for success bits
        }
    },
    error: function (jqXHR, textStatus, errorThrown) {
                   // error handling
    }
});

使用AJAX的美妙之处在于您可以随时触发检查,这样您就可以收听完整的电子邮件,并在输入详细信息后立即触发请求。

答案 1 :(得分:0)

你不需要ajax。如果用户登录单页结帐,则会重新加载页面,因此模板中的简单javascript应该可以正常工作。 你可以直接在页面加载时进行检查,只在需要时添加javascript 例如:

<?php if({your check for the email}):?>
<script type='text/javascript'>
    $(document).ready(function()
    { 
        $('#email').onChange(function()
        {
            alert('input');
        });
    });
</script>
<?php endif;?>

或者如果你想使用原型而不是jquery:

<?php if({your check for the email}):?>
<script type='text/javascript'>
    $(document).observe('dom:loaded', function(){         
        $('#email').observe('change', function(){            
            alert('input');
        });
    });
</script>
<?php endif;?>