我有点难以编写一个小方法来将产品ID及其关联的超级属性应用于数组会话。
我要做的是,如果某个属性集(例如背心)已经存在于数组中,那么它将不会添加到数组中,而是使用更新的id和super属性覆盖位置。我目前正在重写magento添加到购物车的方式,以便在捆绑中使用可选的可配置产品。
目前脚本采用ajax参数,然后将其应用于(在拆分一些冗余和不需要的数据之后)要保留的会话,直到调用add to cart方法。
我目前的代码库包含以下内容:
<?php
// Handler for holding onto package products.
umask(0);
require_once 'app/Mage.php';
Mage::app();
Mage::getSingleton('core/session', array ('name' => 'frontend'));
$product = $_POST['productAdd'];
$split = explode(",",$product);
$actual = $split[0] . ',' . $split[1] . ',' . $split[2];
$_product = Mage::getModel('catalog/product')->load($split[0]);
$attributeSet = Mage::getModel('eav/entity_attribute_set')->load($_product->getAttributeSetId())->getAttributeSetName();
if(!empty($_SESSION['products'])) {
$arrayLength = count($_SESSION['products']);
for($i = 0; $i <= $arrayLength; $i++) {
if(strstr($_SESSION['products'][$i], $attributeSet)) {
$_SESSION['products'][$i] = $actual;
break;
}else{
$_SESSION['products'][] = $actual;
}
}
}else{
$_SESSION['products'][] = $product;
}
var_dump($_SESSION['products']);
?>
这适用于数组中的第一次出现并正确覆盖索引位置,但是,对数组的任何后续添加都不会覆盖,而只是附加到数组的末尾,这不是我的意思之后!]
示例输出:
array(4) {
[0]=> string(19) "15302, 959, Jackets"
[1]=> string(21) "15321, 1033, Trousers"
[2]=> string(21) "15321, 1033, Trousers"
[3]=> string(21) "15321, 1033, Trousers"
}
如果有人能给我一个正确方向的推动,那将是非常感激的!
谢谢!
答案 0 :(得分:0)
更改您的测试以检查
if(strstr($_SESSION['products'][$i], $attributeSet) !== FALSE) {
如果您搜索的字符串从第一个位置开始,strstr可以返回0,这将使您之前的测试失败。
如果你的陈述的“然后”部分也是不必要的话,那就是休息。
答案 1 :(得分:0)
终于想通了,花了很多时间来解决这个问题,所以我希望将来可以帮助其他人:
umask(0);
require_once 'app/Mage.php';
Mage::app();
Mage::getSingleton('core/session', array ('name' => 'frontend'));
$product = $_POST['productAdd'];
$split = explode(",",$product);
$i = 0;
$actual = $split[0] . ',' . $split[1] . ',' . $split[2];
$_product = Mage::getModel('catalog/product')->load($split[0]);
$attributeSet = Mage::getModel('eav/entity_attribute_set')->load($_product->getAttributeSetId())->getAttributeSetName();
if(!empty($_SESSION['products'])) {
foreach($_SESSION['products'] as $superAttribute) {
$explode = explode(",",$superAttribute);
$result = ltrim($explode[2],(' '));
if($result == $attributeSet) {
$foundItem = true;
break;
}
$i++;
}
if($foundItem) {
$_SESSION['products'][$i] = $actual;
}else{
$_SESSION['products'][] = $actual;
}
}else{
$_SESSION['products'][0] = $actual;
}
输出:
array(5) {
[0]=> string(18) "6085, 963, Jackets"
[1]=> string(20) "6087, 1029, Trousers"
[2]=> string(16) "3369, 1201, Hats"
[3]=> string(23) "17510, 1327, Waistcoats"
[4]=> string(24) "15028, 895, Dress Shirts"
}
这正确地覆盖了所需索引处的数组,它确实有一些代码可以修剪掉第一个空白块(这就是ajax发送的内容)。对于实现此目的的其他人来说,这可能不是必需的,所以请记住这一点!