0

現在、jQuery Form プラグインを使用して、Magento 製品リストで複数の AJAX フォームを .xml 経由で処理してい.ajaxForm({});ます。現在、私が使用しているソリューションは機能しますが、非常に扱いにくく、この問題にアプローチするより良い方法があるかどうかを知りたいです.

簡潔にするために、コードを少し短くします。

<?php foreach ($_productCollection as $_product): ?>
<form action="<?php echo $this->getSubmitUrl($_product) ?>" method="post" class="derp" id="derp-<?php echo $_iterator; ?>">
    <div class="quanitybox">
        <label for="qty"><?php echo $this->__('Quantity:') ?></label>
        <input type="button" class="quantity_box_button_down" />         
        <input type="text" name="qty" maxlength="12" value="1" title="<?php echo $this->__('Qty') ?>" class="input-text qty" />
        <input type="button" class="quantity_box_button_up" />
    </div>
    <button type="submit" title="Add to Cart" class="button btn-cart" ><span><span>Add to Cart</span></span></button>
 </form>

 <script type="text/javascript">
    var productAddToCartForm = new VarienForm('derp-<?php echo $_iterator ?>');

    jQuery('#derp-<?php echo $_iterator ?>').ajaxForm({
                url: jQuery('#derp-<?php echo $_iterator ?>').attr('action').replace("checkout/cart","ajax/index"),
                data: {'isAjax':1},
                dataType: 'json',
                beforeSubmit: function(){    
                    if(productAddToCartForm.validator.validate()){
                        windowOver.show();
                        windowBox.show().css({
                            backgroundImage: "url('<?php echo $this->getSkinUrl('images/loading.gif')?>')"
                        });                    
                    }else{
                        return false;
                    }
                },
                error: function(data){
                    windowBox.css({
                          backgroundImage: 'none'
                    }).html('<?php echo $this->__('Error') ?>');                       
                    windowOver.one('click',function(){
                        hidewindow(windowBox,windowOver);                    
                    });        

                    jQuery('#hidewindow').click(function(){
                        hidewindow(windowBox,windowOver);                    
                    });
                },
                success : function(data,statusText,xhr ){
                    if(data.status == 'SUCCESS'){
                        if(jQuery('.block-cart')){
                            jQuery('.block-cart').replaceWith(data.sidebar);
                        }
                        if(jQuery('.header .block-cart-header')){
                            jQuery('.header .block-cart-header').replaceWith(data.topcart);
                        }     
                        msgHtml = '<div class="added-content"><div style="float:left;">' + productImg + '</div><em>' + titleForBox<?php echo $_iterator ?> + '</em> <?php echo $this->__('was successfully added to your shopping cart.') ?><div style="clear:both;"></div><a id="hidewindow" href="javascript:void(0);"><?php echo $this->__('Continue shopping') ?></a>&nbsp;<a href="<?php echo $this->getUrl('checkout/cart')?>"><?php echo $this->__('View cart & checkout') ?></a></div>';             
                    }else{
                        msgHtml = '<div class="added-content"><p class="error-msg" style="margin-bottom:15px;">' + data.message + '</p><a id="hidewindow" href="javascript:void(0);"><?php echo $this->__('Continue shopping') ?></a>&nbsp;<a href="<?php echo $this->getUrl('checkout/cart')?>"><?php echo $this->__('View cart & checkout') ?></a></div>';
                    }                      

                    windowBox.css({
                          backgroundImage: 'none'
                    }).html(msgHtml);                      
                    windowOver.one('click',function(){
                        hidewindow(windowBox,windowOver);                    
                    });        

                    jQuery('#hidewindow').click(function(){
                        hidewindow(windowBox,windowOver);                    
                    });    
                }
            });
</script>
<?php endforeach; ?>

このコードの残念な部分は、各製品の下部に多数の重複した JavaScript を生成していることです。

検証のために各製品を生成する必要があるため、これを回避する方法は実際にはわかりません。これnew VarienForm()はフォームIDのみを受け取ります(間違っていない限り)。

$_iteratorループごとにインクリメントする組み込みの を使用してこれを行っておりforeach()(つまり、derp-1、derp-2、derp-3)、フォームごとにインクリメントする id を追加しています。

などのクラスセレクターを使用して各フォームをターゲットにできることはわかっていjQuery('.derp').ajaxForm({});ますが、これをVarienForm.

ajaxForm({});送信ボタンに基づいてその場で生成しようとしまし.each( function({ jQuery(this).on('click', function({ //AJAX STUFF HERE }) ); }) );たが、うまくいきませんでした。

各フォームを個別にターゲットにし、 を生成しVarienForm、必要なフォーム データを取得し、ajaxForm({})メソッドを利用して、すべてをまとめて保持する、より堅牢なソリューションはありますか?

4

1 に答える 1

1

ページで一度宣言する関数を作成します。繰り返しに固有のいくつかのパラメーターを渡すことにより、すべてのPHPループ繰り返しでそれを呼び出すことによって使用されます(指摘したように、多くのJavascriptが複製されているため)。たとえば、関数は次のようになります。

function setupForm(form, iterator) {
    jQuery("#derp-" + iterator).ajaxForm({

    });
}

そして、イテレータを出力する PHP コードのすべてのインスタンスを、Javascript の連結だけに置き換えますiterator

PHP ループ内のスクリプトを次のように置き換えます。

var productAddToCartForm = new VarienForm('derp-<?php echo $_iterator ?>');
setupForm(productAddToCartForm, '<?php echo $_iterator ?>');

もちろん、setupFormループに固有の関数にさらに引数を追加する必要があります (コードをさらに調べて、それらがすべて何であるかを判断しようとします)。このようにして、すべての PHP ループ項目を (setupForm関数呼び出しで) 1 回出力し、それらをsetupForm関数内で動的に使用します。

UDPATE :

私はそれを調べて、うまくいけば交換が必要なすべてを見つけたので、この小さな宣伝文句の後にコードを貼り付けます. 私の懸念は、これらの変数が何であるかです。

windowBox
windowOver
productImg
titleForBox

それらがグローバルか何かである場合、この新しい更新は問題ないはずです。それらが(どういうわけか)他のコンテキストにある場合、これは機能しない可能性があります。

とにかく、これが次のようになると私が考えるものです:

// Use this in your PHP loop
var productAddToCartForm = new VarienForm('derp-<?php echo $_iterator ?>');
setupForm(productAddToCartForm, "<?php echo $_iterator ?>", "<?php echo $this->getSkinUrl('images/loading.gif')?>", "<?php echo $this->__('Error') ?>", "<?php echo $this->__('was successfully added to your shopping cart.') ?>", "<?php echo $this->__('Continue shopping') ?>", "<?php echo $this->getUrl('checkout/cart')?>", "<?php echo $this->__('View cart & checkout') ?>");

// Use this one time in your page
function setupForm(form, iterator, skin_url, an_error, successful_text, continue_text, checkout_url, checkout_text) {
    var the_form = jQuery("#derp-"+iterator);  // Added this (obviously)

    the_form.ajaxForm({  // Changed this line
        url: the_form.attr('action').replace("checkout/cart","ajax/index"),  // Changed this line
        data: {'isAjax':1},
        dataType: 'json',
        beforeSubmit: function(){    
            if(form.validator.validate()){  // Changed this line
                windowOver.show();
                windowBox.show().css({
                    backgroundImage: "url('" + skin_url + "')"  // Changed this line
                });                    
            }else{
                return false;
            }
        },
        error: function(data){
            windowBox.css({
                  backgroundImage: 'none'
            }).html(an_error);  // Changed this line

            windowOver.one('click',function(){
                hidewindow(windowBox,windowOver);
            });

            jQuery('#hidewindow').click(function(){
                hidewindow(windowBox,windowOver);                    
            });
        },
        success : function(data,statusText,xhr){
            var msgHtml = "";  // Added this line
            if(data.status == 'SUCCESS'){
                if(jQuery('.block-cart')){
                    jQuery('.block-cart').replaceWith(data.sidebar);
                }
                if(jQuery('.header .block-cart-header')){
                    jQuery('.header .block-cart-header').replaceWith(data.topcart);
                }
                msgHtml = '<div class="added-content"><div style="float:left;">' + productImg + '</div><em>' + titleForBox + iterator + '</em> ' + successful_text + '<div style="clear:both;"></div><a id="hidewindow" href="javascript:void(0);">' + continue_text + '</a>&nbsp;<a href="' + checkout_url + '">' + checkout_text + '</a></div>';  // Changed this line
            }else{
                msgHtml = '<div class="added-content"><p class="error-msg" style="margin-bottom:15px;">' + data.message + '</p><a id="hidewindow" href="javascript:void(0);"><?php echo $this->__('Continue shopping') ?></a>&nbsp;<a href="' + checkout_url + '">' + checkout_text + '</a></div>';  // Changed this line
            }

            windowBox.css({
                  backgroundImage: 'none'
            }).html(msgHtml);
            windowOver.one('click',function(){
                hidewindow(windowBox,windowOver);
            });

            jQuery('#hidewindow').click(function(){
                hidewindow(windowBox,windowOver);
            });
        }
    });
}

主にコメントを見て、実際のコードのどこを変更したかを確認してください。

于 2012-11-01T19:15:30.617 に答える