2017-08-09 7 views
1

psモジュールを開発して、商品の添付ファイルをカテゴリで分類し、フロントプロダクトページに表示させます。ハンドル<select>モジュールクラスのajaxを持つ値prestashop 1.6

添付でドラッグ可能なリストを使用して、カテゴリにドロップするとオプションタグに変わります。各カテゴリには、添付ファイルを削除するselectタグがあります。

添付ファイルと削除されたカテゴリを保存したいので、データをモジュールクラスに持っていくためにajaxを呼び出すと思っていましたが、私はajaxで新しいので、それに近づいています。

これは私が作った義和です:

(適切なの.tpl内)JSコードを:

<script> 
     $(".droptrue").droppable({ 

       drop: function(event, ui) { 
        //add <option> tag when an attachment is dropped to category's select 
        $(event.target).append('<option value="' + ui.draggable.attr('id') + '" selected>'+ui.draggable.text()+'</option>'); 
        //remove the <li> wich contained the attachment data 
        ui.draggable.fadeOut("slow").remove(); 

        var val = $('#categoryAttachmentArr').val(); 
        //var tab = val.split(','); 
        //for (var i=0; i < tab.length; i++) 
        //if (tab[i] == $(this).val()) 
        //  return false; 
        //create an array with the next format: 'id_category(1)'-'id_attachment(1)','id_category(2)'-'id_attachment(2)'[....] 
        //the comma will be the main character that will be splitted 
        $('#categoryAttachmentArr').val(val + ui.doppable.attr('id') + '-' + ui.draggable.attr('id') +','); 
       } 
     }); 

     $('#submitAddProduct').click(function(e){ 
      $.ajax({ 
       type: 'POST', 
       url: baseDir + 'modules/adjuntos/classes/CategoryAttachment.php', 
       data: { 
         ajax: true, 
         action: \'CategoryArray\', 
         cat_array: $('#categoryAttachmentArray').val(), 
        } 
       dataType: 'json', 
       success: function(json) { 
       console.log($('#categoryAttachmentArray').val()); 
       } 
     }); 
     }) 

     $(".ui-state-default").draggable({ 

       revert: "valid", 

     }); 
</script> 

そして、私のクラス:

class CategoryAttachment extends Objectmodel 
{ 
    //other functions 
    public function ajaxProcessCategoryArray() 
    { 
     $CategoryAttachmentArr = Tools::getValue('cat_array') 
    } 
} 

答えて

0

Finalyにクラス

コントローラの戻り結果を使用してデータを保存

コントローラをコントローラにデータを送信する私は解決策を持って、多分君たちの一つは、この問題を持っています未来。

の.tplでの私のコードは:

$(".ui-state-default").draggable(); 

     $(".droptrue").droppable({ 

       drop: function(event, ui) { 
        //add <option> tag when an attachment is dropped to category's select 
        $(event.target).append('<option value="' + ui.draggable.attr('id') + '" selected>'+ui.draggable.text()+'</option>'); 
        $('#selectAttachment1').append('<option value="' + ui.draggable.attr('id') + '" selected>'+ui.draggable.text()+'</option>') 
        //remove the <li> wich contained the attachment data 
        ui.draggable.fadeOut("slow").remove(); 

        var val = $('#categoryAttachmentArr').val(); 
        //make a serialize() type array 
        $('#categoryAttachmentArr').val(val + $(this).attr('id') + "=" + ui.draggable.attr('id') +"&"); 

        var value = $('#arrayAttachments').val(); 
        var tab = value.split(','); 
        for (var i=0; i < tab.length; i++) 
         if (tab[i] == ui.draggable.attr('id')){ 

          return false; 
         } 
        $('#arrayAttachments').val(value+ui.draggable.attr('id')+','); 

       } 
     }); 


     $('#submitCategories').click(function(e){ 
      var array = $('#categoryAttachmentArr').val() 
      $.ajax({ 
       url: '../modules/adjuntos/ajax-call.php', 
       data: { 
        action: 'handlearray', 
        token:new Date().getTime(), 
        cat: array 
       }, 
       method: 'POST', 
       success:function(data){ 
       $('#result').html(data); 
      } 
     }); 
     }); 

AJAX呼び出しが私のAJAX-call.phpファイルに行く:

<?php 
//load ps config 
require_once(dirname(__FILE__).'../../../config/config.inc.php'); 
require_once(dirname(__FILE__).'../../../init.php'); 
require_once('adjuntos.php'); 
//adjuntos.php is the name of my module main file 
if(Tools::getIsset('token') && Tools::getIsset('action')) 
{ 
    $mp = new Adjuntos; 
    echo $mp->handleArray(); 
} 

handleArray機能私のモジュールのメインファイルに:(それが作ります私のカスタムクラスへの呼び出し)

public static function handleArray() 
{ 

    $html = ''; 
    $array = Tools::getValue('cat'); 
    $arrayExplode = explode("&", $array); 
    foreach($arrayExplode as $value) 
    { 
     $finalArr = explode("=", $value); 
     if (!CategoryAttachment::postProcess($finalArr)) 
     { 
      $html .= '<p style="color:red;>Fallo</p>"'; 
     }  
    } 
    $html .= '<p style="color:green;>Correcto</p>"'; 
    return $html; 
    } 

私のカスタムクラス内の関数:

public static function postProcess($finalArr) 
    { 

     return Db::getInstance()->execute(
       'UPDATE ps_attachment SET id_category = '.$finalArr[0].' WHERE id_attachment = '.$finalArr[1] 
       ); 


    }//end 

この方法では、魔法のように働いて、そして答えを

0

接続できませんどのクラスにも直接アクセスできます。これを行うにはコントローラーを使用する必要があります。

Ajaxのブラウザ(ジャバスクリプト)

+0

おかげで、コードをよりスケーラブルにしますさ!だから、私は新しいコントローラを作成するか、単にこれを処理するために新しいPHPファイルを作成する必要があります。または、実際のadmincontroller(製品コントローラなど)を使用することもできます。 私に例を挙げてもらえますか? –

+0

モジュールでカスタム(フロント/アドミニストレーター)コントローラを使用するか、ページ上の利用可能なフックを使用してajaxプロセスを処理できます。最初の方法が推奨されます。 –

関連する問題