Virtuemart 3的代码调整

由马克斯·米尔伯斯于.

调整扩展

主要更改在自定义插件中完成。装运和支付插件只需要使用J2.5样式的更新xml进行参数声明。VM3现在使用Joomla的JInputFields。如果您希望您的支付插件在VM2和VM3中运行,则必须将所有JRequest交换到VRRequest或使用新的Joomla类JInput。这是品味的问题。

其他大型更改是为购物车和结账过程完成的。这意味着必须调整模板和OPC以使用新推车。新推车的变化是在产品处理和会议中进行的。新推车在会话中仅存储产品ID,数量和自定义数据。获取购物车使用存储的属性创建产品。现在核心总是直接操纵购物车中的产品。所以现在我们可以通过插件轻松更改产品属性。

整个重定向过程得到了大修。该系统根据购物车的条件工作。因此,重定向询问购物车如果结账,请确认等。这使得重定向更可靠。为VM2.6布局开发的覆盖仍然应该工作,甚至没有覆盖的旧模板都应该工作。

模板和布局

在VM3中,我们引入了一个新功能ShopFunctionsF::renderVmSubLayout($layoutName,AssocArray),您可以很容易地调用小的子布局或迷你布局。它们存储在FE/子布局中,可以使用/templates/yourtemplate/html/com_virtuemart/sublayouts进行覆盖。

主要差异在推车布局中。我们有一个新功能,可以让我们在购物车中显示Shopperfields。为您的购物车创建自己的Userfield非常容易。结果存储在Order_UserInfo中用BT地址。Custom UserField的名称尊重shopperfield是布局文件的名称。您可以轻松覆盖它。例如,您可以覆盖TOS布局将FE / SUBLAYOUTS / TOS.PHP复制到/ yourtemplate / html / com_virtuemart / sublayouts。检查变量$ viewdata以查看可用的内容。如果这是不够的,您仍然可以编写媒体插件。

推车本身有一些强制性的领域要正常工作。表格可以在底部开始并结束。该系统现在使用按钮而不是链接Anylonger。原因是我们总是在购物车中存储任何更改,这使得每模板的OPC更容易。为实现此目的,我们使用按钮的名称作为动作。因此,表单的隐藏字段现在始终相同。


<输入类型='hidden'name ='任务'值='updatecart'/>
<输入类型='hidden'name ='选项'值='com_virtuemart'/>

您至少需要将产品行作为输入类型

[<?php echo$pkey;?>]“值=”<?PHP回声$prow->数量?>“/>
和按钮name=“updatecart.<?php echo$pkey?>”恭敬地name =“删除。<?php echo $ pkey?>”

作为结帐按钮使用echo $ this-> checkout_link_html;

此外,用户视图中的布局edit_address需要类似的调整来正常工作(检查Action URL的构建和结尾的隐藏字段)。

对于新的ajax产品内容的重新加载,重要的是echo vmjsapi :: withjs();在override文件的末尾yoursite \ templates \ yourtemplate \ html \ com_virtuemart \ productdetails \ default.php

调整定制普林斯

customfield参数现在直接连接到插件。此外,保存自定义参数的字段将被重命名和重新组织。

更改的数据库字段

自定义原型仍然使用字段custom_params。现在它总是先加载,并像模式一样工作,分别是附加到产品的customfields的默认值。产品customfield参数的fieldname现在是customfield_params:
在桌子上#__virtuemart_product_customfields.
custom_value => customfield_value
自定义价格=>customfield\u价格
自定义参数=>customfield参数

此外,在custom_field_desc中现在是custom_desc:
在桌子上#__virtuemart_customs.
custom_field_desc => custom_desc

那对你来说意味着什么

你需要一个开关建造师你的自定义插件

if(!定义('vm_version')或vm_version <3){
$ this-> setconfigparameterable('custom_params',$ varstopush);
}否则{
$this->setConfigParameterable('customfield_params',$varsToPush);
}

请注意,这些参数由您的核心处理。您无需在功能中加载它们,现在可以通过$ this-> varname尊重给定的方法,始终可以访问变量。例如,在触发器PLGVMONDISPLAYPRODUCTFEVM3中它是$组 - > varname。

此外,您还需要新的触发器
功能plgvmdeclarepluginparamscustomvm3(&$ data){
返回$this->declarePluginParams('custom',$data);
}
功能plgvmgettablepluginparams($ pstype,$ name,$ id,&$ xparams,&$ varstopush){
返回$this->getTablePluginParams($psType、$name、$id、$xParams、$varsToPush);
}

另一个开关plgVmOnProductEdit扳机

if(!定义('vm_version')或vm_version <3){
$以下 - > Parsecustomparams($字段);
$ paramname ='custom_param';
}否则{
$paramName='customfield_params';
}

更改/添加触发器

PLGVMONDISPLAYPRODUCTFE($字段,&$ idx,&$ group)就是现在PLGVMONDISPLAYPRODUCTFEVM3(&$产品,&$组).扳机PLGVMONDISPLAYPRODUCTVARIANFE.已完成删除,现在替换PLGVMONDISPLAYPRODUCTFEVM3..
我们删除了第二个参数,它不是必需的,核心处理它。调用统一函数是很大的感觉,因为其余的几乎是相同的,你可以删除“$这个 - >帕尔索斯科姆斯($字段);”对于VM3。

触发器
plgVmOnViewCart、plgVmOnViewCart模块、plgVmDisplayInOrderFEPLGVMDISPLAYINORDERBE.也使用后缀VM3,所有参数都不同,而不是($product、$row和$html)我们现在有(&$product,&$productCustom,&$html)

在textInput.php中看到差异很好:

VM2

功能PLGMMONVIEWCART($产品,$行,&$ HTML){if(空($ product-> productcustom-> custom_element)或$ product-> productCustom-> custom_element!= $ this  - > _ name)return''';if(!$ plgparam = $ this-> getpluginincart($产品))返回'';foreach($ plgparam为$ k => $项){if(!空($ item ['评论']))){if($ product-> productcustom-> Virtuemart_customfield_id == $ k){$ html。=''.jtext :: _($ Product-> ProductCustom-> Custom_title)。'。$ Itment [''评论']。'; } } } 返回true;}

VM3

函数plgVmOnViewCartVM3(&$product,&$productCustom,&$html){if(空($productCustom->custom_元素)或$productCustom->custom_元素!=$此->\u name)返回false;如果(空($product->customProductData[$productCustom->virtuemart\u custom\u id][$productCustom->virtuemart\u customfield\u id])返回false;foreach($product->customProductData[$productCustom->virtuemart\u custom\u id]作为$k=>$item){if($productCustom->virtuemart\u customfield\u id==k){if(isset($item['comment']){$html.=''.jtext :: _($ productCustom-> custom_title)。''。$ Itment [''评论']。'; } } } 返回true;}

因此,与VM2 CatchPlugin进行比较VM3 CustomPlugin是更多数据安全,负载较少,更容易写入。很高兴看到这里:

VM2
函数plgVmDisplayInOrderBE(&$item、$productCustom、&$html){
如果(!空($ productcustom)){
$item->productCustom=$productCustom;
}
if(空($项 - > productCustom-> custom_Element)或$ Item-> ProductCustom-> Custom_Element!= $以下 - > _名称)返回'';
$ this-> plgvmonviewcart($ Item,$ ProductCustom,$ HTML);//与购物车相同的渲染
}

VM3
函数plgVmDisplayInOrderBEVM3(&$item,&$productCustom,&$html){
$ this-> plgvmonviewcartvm3($ Item,$ ProductCustom,$ HTML);
}

扳机PLGVMCALCULATECustomVariant($产品,$ ProductCustomSprice,$ Spected,$ Modificatorum = 0)改名为plgvmpreparterproduct(&$product,&$customfield,&$selected,&$modificatorSum=0)现在是一个更强大的。您可以使用它来修改购物车中的产品、价格、重量、尺寸、文本、名称等。参数名称相同,但含义不同。变量$selected保存来自表单的正确方法/插件的数据。请注意,变量必须修改$modificatorSum。此触发器也适用于任何购物车调用,适用于更改产品的属性。

表单中数组的旧变量和名称
cateplugin ['Virtuemart_customfield_id.'] ['pluginname'] [name]被替换为
customProductData['virtuemart\u product\u id']['virtuemart\u custom\u id']['virtuemart\u customfield\u id'][名称].

检查您的布局和触发器中的代码PLGVMONDISPLAYPRODUCTVARIANTFEVM3.

调整Userfield插件

与catepplugins非常相似。触发器不变,但参数字段已重命名为UserField_Params。所以我们需要在我们的构造函数中

if(!定义('vm_version')或vm_version <3){$ this-> setconfigparameterable('params',$ this-> varstopush);} else {$ this-> setconfigparameterable('userfield_params',$ this-> varstopush);}

在我们的plgVmOnUserfieldDisplay中

如果(!已定义('VM_版本')或VM_版本<3){$this->AddUserfieldParameter($field->params);}else{$this->AddUserfieldParameter($field->userfield_params);}

p> 在我们的plgVmOnBeforeUserfieldSave中

如果(!已定义('VM_VERSION')或VM_VERSION<3){$tableClass->setParameterable('params',$vars);}else{$tableClass->setParameterable('userfield_params',$vars);}