Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Json在PrestaShop中的购物车摘要中将变量传递给JS_Php_Ajax_Json_Prestashop - Fatal编程技术网

Php 使用Json在PrestaShop中的购物车摘要中将变量传递给JS

Php 使用Json在PrestaShop中的购物车摘要中将变量传递给JS,php,ajax,json,prestashop,Php,Ajax,Json,Prestashop,我知道PS使用Json从控制器接收变量。例如,在cart-summary.js中有: $.ajax({ type: 'POST', headers: { "cache-control": "no-cache" }, url: baseUri + '?rand=' + new Date().getTime(), async: true, cache: false, data: 'controller=cart&ajax=true&allowSeperatedPackage=true

我知道PS使用Json从控制器接收变量。例如,在cart-summary.js中有:

$.ajax({
type: 'POST',
headers: { "cache-control": "no-cache" },
url: baseUri + '?rand=' + new Date().getTime(),
async: true,
cache: false,
data: 'controller=cart&ajax=true&allowSeperatedPackage=true&value='
+ ($(this).prop('checked') ? '1' : '0')
+ '&token='+static_token
+ '&allow_refresh=1',
success: function(jsonData)
{
//some functions...
}
我相信变量/数组是从cart.php传递的。我的问题是,cart.php中的哪个函数/方法负责传递数据

提示:现在cart.php中有jsonecodeecho

我的目的是将一些变量从另一个控制器传递到cart-summary.js


感谢您的帮助。

根据经验,Prestashop平台ajax请求使用的url结构如下: 前端请求:

控制器=xxx

确定应该为请求调用的控制器,在本例中,“cart”表示将要求CartController.php管理调用

ajax=true

这意味着请求将是ajax,并且在输出之前,控制器需要将响应转换为json格式

令牌=xxx

它是用于内部身份验证的令牌,任何控制器都使用它来确保没有虚假/外部请求

后端管理:

一旦控制器被称为POST/PUT数据,它总是由后处理功能进行处理,任何控制器都拥有并扩展自其父基控制器

在这种特定情况下,如果打开CartController,您将看到一个后处理函数,该函数分析您传递给它的所有参数(allowSeperatedPackage、allow_refresh等),以便在按请求处理所有元素后生成响应。 例如,在您链接的调用中,AllowDepratedPackage将触发控制器中的以下子调用

elseif (Tools::getIsset('changeAddressDelivery'))
                $this->processChangeProductAddressDelivery();
这将使用更新用户购物车中的参数

$this->context->cart->allow_seperated_package = (boolean)Tools::getValue('value');
$this->context->cart->update();
die('{"error":false}');
请注意,购物车摘要页面中的产品获取是在ParentOrderController+shopping-cart.tpl上进行的,因此如果需要在页面ajax上添加内容,这不是正确的方法,但您可能需要扩展\u assignSummaryInformations()函数,并添加所需的任何变量


不幸的是,cart流是整个Prestashop系统中最复杂/最长的一个,实现新功能不是一件容易的任务,但唯一的方法是遍历CartController/cart/OrderController类的代码,并查看真正需要添加新参数的位置。(请记住使用覆盖系统,以避免无法读取的代码更改!)

您可以使用此钩子
actionCartListOverride

或者在
controllers/front/CartController.php


您将发现一个
$result
数组,您可以在其中添加变量

谢谢你的提示。我必须承认我忘记了CartController.php:)我专注于cart.php类和parentOrder控制器你知道我在哪里可以找到1.6版本的钩子列表吗?最好用小的描述。在官方PS网站上,只有1.5的列表。这是我能找到的最好的链接,但没有actionCartListOverride。例如,是的,我找不到完整的列表,但你可以在PrestaShop代码中搜索
actionCartListOverride
,以查看它需要的参数,您可以在
CartController::displayAjax
中找到它,我非常感谢您的详细回答。如你所见,我现在无法将其标记为有用的…:/我通过使用smarty->assign添加行和传递变量来扩展ParentOrderController中的_assignSummaryInformations()函数,并对任何更改使用覆盖(对于已生成的通用模块),该函数工作正常,但仅在刷新页面之后。如果我只使用例如+按钮和ajax重新计算值并显示它,我的veriable将丢失在JS中。我发现,如果我通过扩展此函数的返回,在getSummaryDetails函数的Cart类中添加相同的veriable,它将完全正常工作(在刷新和+按钮之后)!但是我不想以这种方式重写Cart类,因为如果Presta更改类,它将无法安装。也许你可以尝试创建自己的钩子,也许这样会更容易。以下是一些有用的链接:(教程)和(免费模块,允许您在Prestashop 1.6上创建挂钩)