2017-08-09 71 views
1

我正在开发一个ps模块,让您可以分类产品附件并将它们显示在前面的产品页面中。在模块类中使用ajax处理<select>值,prestashop 1.6

即时通讯使用可拖动列表和附件,当您将它们拖放到类别时,它将变为选项标签,每个类别都有一个选择标签,用于放置附件。

我想保存附件和它们被删除的类别,所以我想做一个ajax调用将数据带到我的模块类,但我是新的与ajax和不能接近它。

这是世界卫生大会我做:

的js代码(正确.tpl内):

<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

您无法连接直接到任何班级。你必须使用控制器来做到这一点。

阿贾克斯将数据发送到控制器

控制器使用类保存数据

控制器返回结果到浏览器(JavaScript)的

+0

谢谢回答!所以我必须创建一个新的控制器,或者只需要创建一个新的PHP文件来处理这个问题。或者也许使用一个实际的管理控制器(例如产品控制器)。 你能举个例子吗? –

+0

您可以在模块中使用自定义(前/管理员)控制器,或使用页面上可用的Hooks来处理您的ajax过程。建议第一种方法。 –