0

我在编写一个将产品 ID 及其关联的超级属性应用于数组会话的小方法时遇到了一些困难。

我想要做的是,如果数组中已经存在某个属性集(例如背心),那么它不会添加到数组中,而是使用更新的 id 和超级属性覆盖位置。我目前正在重写 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" 
} 

如果有人可以在正确的方向上推动我,将不胜感激!

谢谢!

4

2 回答 2

0

更改您的测试以检查

if(strstr($_SESSION['products'][$i], $attributeSet) !== FALSE) {

如果您搜索的字符串从第一个位置开始,strstr 可以返回 0,这将使您之前的测试失败。

如果您的陈述的“那么”部分也不需要休息。

于 2013-07-16T13:34:07.970 回答
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 帖子发送的内容)。这对于其他人实现它可能不是必需的,所以请记住这一点!

于 2013-07-19T15:44:17.000 回答