2016-06-08 4 views
0

Я работаю над некоторыми скриптами для автоматизации некоторых вещей внутри нашего интернет-магазина.Загрузите информацию о продукте, сравнив пользовательский атрибут в Magento

Я просмотрел множество форумов и вопросов.
Теперь я почти закончил свой сценарий, но есть небольшая вещь, которая не работает, но я не могу придумать, что я делаю неправильно.

Целью этого скрипта является получение продуктов с таким же значением атрибута, как и значения в массиве (извлеченные из БД).

Так вот мой код:

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 
require_once('../app/Mage.php'); 
require_once('db.php'); 


Mage::app(); 

$db = db_connection(); 

$collection = Mage::getModel('catalog/product')->getCollection(); 

$collection->addAttributeToSelect('ean'); 


$getean = $db->prepare('SELECT ean_l FROM mytable'); 
$getean->execute(); 
$allean = $getean->fetchAll(); 


foreach($allean as $ean) { 

    $collection->addFieldToFilter(array(
     array('attribute'=>'ean','eq'=>'' . $ean['ean_l'] . ''),  
    )); 
    echo 'ean_l: ' . $ean['ean_l'] . '<br>'; 

    foreach ($collection as $product) { 

     echo $product['entity_id']; 

    } 


} 

Так вот как это работает:

Мы выбираем атрибут (ЕАН).
Мы получаем список всех номеров ean из базы данных.
Мы просматриваем список и сравниваем любой продукт с номером ean.
Затем мы прокручиваем коллекцию и получаем идентификатор соответствующего продукта.
Тем не менее, все $product['entity_id'] - это 273. Верно, что entity_id равен 273, но есть также продукт 274 с соответствующим номером ean.

Вот результат из сценария (это намного больше):

result

Так почему же это? Потому что в моих рассуждениях он меняет ean_l каждый цикл и выравнивает его со значениями атрибутов.
И тогда это должно изменить коллекцию, не так ли?
Так не должно ли оно хотя бы показать 274 в какой-то момент?

Этот вопрос не особенно подходит для программистов Magento, но другие программисты тоже могут помочь, поэтому я решил опубликовать его на SO.

ответ

0

Magento поставляется с мощной фильтрацией и запросами в коллекциях. Если это не удовлетворяет, вы всегда можете расширить с помощью пользовательских запросов в функцию getSelect. Некоторая информация here.

Использование addFieldToFilter в этот файл foreach будет фильтровать оставшиеся значения после другой итерационной фильтрации. Так что это не хорошо.

$allean = array("of", "ean", "values", "needed", "for", "filtering"); 

$collection = Mage::getModel('catalog/product')->getCollection(); 
$collection->addAttributeToSelect('ean'); 
//addAttributeToFilter for EAV collections 
$collection->addAttributeToFilter('ean', array('in' => $allean)); //not addFieldToFilter 
$collection->getColumnValues('entity_id'); 

var_dump($collection); //will output an array of product_ids 

Альтернатива, если вы хотите сгруппировать по ean значения, которые вы должны удалить getColumnValues и запустить команду группы. Дополнительная информация here.

Или вы можете просто удалить getColumnValues, запустите foreach($collection as $product) и сгруппируйте вручную или сделайте то, что хотите, с этими фильтрованными продуктами.