Есть ли плагин для Magmi, который удаляет продукты, которых нет в файле CSV? - PullRequest
4 голосов
/ 29 декабря 2011

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

Ответы [ 5 ]

5 голосов
/ 26 августа 2013

Я создал плагин, который отключает файлы, отсутствующие в CSV.Я предпочитаю отключать элементы, а не удалять их в случае, если что-то пойдет не так (это не сотрет мою базу данных).

  1. Создать файл плагина magmi/plugins/extra/general/itemdisabler/magmi_itemdisabler_plugin.php

  2. В файле вставьте следующее и сохраните:

Код плагина:

<?php
class Magmi_ItemdisablerPlugin extends Magmi_ItemProcessor
{
    protected $datasource_skus = array();    

    public function getPluginInfo()
    {
        return array("name"=>"Magmi Magento Item Disabler",
                             "author"=>"Axel Norvell (axelnorvell.com)",
                             "version"=>"1.0.6");
    }      

    public function afterImport()
    {
        $this->log("Running Item Disabler Plugin","info");
        $this->disableItems();
        return true;
    }

    public function getPluginParams($params)
    {
        return array();
    }

    public function isRunnable()
    {
        return array(true,"");
    }

    public function initialize($params)
    {
    }

    public function processItemAfterId(&$item,$params=null)
    {
        if(isset($item['sku']))
        {
            $this->datasource_skus[] = $item['sku'];
        }
    }

    public function disableItems()
    {
        if(count($this->datasource_skus) <= 0)
        {
            $this->log('No items were found in datasource.  Item Disabler will not run.', "info");
            return false; /* Nothing to disable */  
        }

        //Setup tables
        $ea     = $prefix!=""?$prefix."eav_attribute":"eav_attribute";
        $eet     = $prefix!=""?$prefix."eav_entity_type":"eav_entity_type";
        $cpe     = $prefix!=""?$prefix."catalog_product_entity":"catalog_product_entity";
        $cpei     = $prefix!=""?$prefix."catalog_product_entity_int":"catalog_product_entity_int";

        //Get "status" attribute_id
        $status_attr_id = "     
            SELECT ea.attribute_id FROM $ea ea
            LEFT JOIN $eet eet ON ea.entity_type_id = eet.entity_type_id
            WHERE ea.attribute_code = 'status'
            AND eet.entity_type_code = 'catalog_product'";               
        $result = $this->selectAll($status_attr_id);  
        if (count($result) == 1) {
            $attribute_id = $result[0]['attribute_id'];
        }
        unset($result);

        //Get all active items
        $sql = "SELECT e.sku, e.entity_id FROM $cpei i
                          INNER JOIN $cpe e ON
                          e.entity_id = i.entity_id
                          WHERE attribute_id=?
                          AND i.value = 1";
        $all_magento_items = $this->selectAll($sql, array($attribute_id));

        //Setup the magento_skus array for easy processing.
        $magento_skus = array();
        foreach($all_magento_items as $item)
        {
            $this->log("{$item['sku']} found in Mage", "info");

            $magento_skus[$item['sku']] = $item['entity_id'];
        }


        //process the array, move anything thats in the datasource.
        foreach($this->datasource_skus as $sku)
        {
            if(isset($magento_skus[$sku]))
            {
                unset($magento_skus[$sku]);
            }
        }

        if(!empty($magento_skus))
        {               
            foreach($magento_skus as $sku => $id)
            {

                $this->log("Disabling Item Id $id with SKU: $sku", "info"); 
                $this->update("
                    UPDATE $cpei i
                    INNER JOIN $cpe e ON
                    e.entity_id = i.entity_id
                    SET VALUE = '2'
                    WHERE attribute_id = ?
                    AND i.value = 1
                    AND e.sku=?", array($attribute_id, $sku));
            }
        }
        else
        {
            //If the Datasource contains all Magento's items.
            $this->log('All items present in datasource.  No items to disable.', "info");       
        }

    }
}

Затем войдите в Magmi, включите плагини запустите импорт.Этот плагин будет запущен после завершения импорта.Он открывает источник данных, регистрирует все SKU, затем сравнивает их с базой данных Magento.Любые скусы, которые не найдены в источнике данных, отключены.Этот плагин можно оптимизировать немного лучше, но он работает как сейчас.

2 голосов
/ 30 декабря 2011

Я думаю, что гораздо лучше утвердительно удалять, чем удалять пропусками.Следует адаптировать адаптер преобразования для анализа столбца (например, «удалено») и установить для свойства _isDeleted значение true.Это приведет к удалению продукта при сохранении.

Ref Mage_Core_Model_Abstract и Varien_Object.

0 голосов
/ 27 июля 2016

Вот плагин Magmi, который делает именно то, что вы ищете imo: http://www.emvee -solutions.com / blog / magmi-delete-disable-products-missing-csv-source /

0 голосов
/ 30 апреля 2014

Я подумал, что упомяну, что у людей могут возникнуть проблемы, если у них действительно большой список продуктов, и они пытаются запустить этот блокировщик. Я не очень знаком с magmi, но кажется, что при использовании cli появляется больше ошибок, поэтому попробуйте проверить это, если вы заметили, что отключение не работает. Это не работает для меня, и я сузил его до ограничений памяти php. Мне пришлось изменить скрипт, чтобы включить ini_set ('memory_limit', '512M'); в функции disableItems.

Итак, мой теперь выглядит так ...

public function disableItems()
{
    ini_set('max_execution_time', 0);
    set_time_limit(0);
    ini_set('memory_limit','512M');
    umask(0); 

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

0 голосов
/ 24 августа 2013

Я пробовал его с помощью встроенного средства удаления продукта, но он не работал должным образом. Он удаляет старые продукты, но когда добавляет их снова, он увеличивает номер артикула, поэтому после нескольких импортных операций вы получаете номер артикула 1xxxxx.

Если у меня есть только продукты, импортированные из CSV, и нет продуктов, которые "всегда" там, я на самом деле использую скрипт php перед magmi, чтобы удалить все продукты:

    <?php

    $mysqli = new mysqli("localhost", "dbuser", "dbpassword", "db");

    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }



    $query = "

    SET FOREIGN_KEY_CHECKS = 0;

    TRUNCATE TABLE `catalog_product_bundle_price_index`;
    TRUNCATE TABLE `catalog_product_bundle_selection`;
    TRUNCATE TABLE `catalog_product_bundle_selection_price`;
    TRUNCATE TABLE `catalog_product_bundle_option_value`;
    TRUNCATE TABLE `catalog_product_bundle_option`;
    TRUNCATE TABLE `catalog_product_entity_datetime`;
    TRUNCATE TABLE `catalog_product_entity_decimal`;
    TRUNCATE TABLE `catalog_product_entity_gallery`;
    TRUNCATE TABLE `catalog_product_entity_group_price`;
    TRUNCATE TABLE `catalog_product_entity_int`;
    TRUNCATE TABLE `catalog_product_entity_media_gallery`;
    TRUNCATE TABLE `catalog_product_entity_media_gallery_value`;
    TRUNCATE TABLE `catalog_product_entity_text`;
    TRUNCATE TABLE `catalog_product_entity_tier_price`;
    TRUNCATE TABLE `catalog_product_entity_varchar`;
    TRUNCATE TABLE `catalog_product_flat_1`;
    TRUNCATE TABLE `catalog_product_link`;
    TRUNCATE TABLE `catalog_product_link_attribute_decimal`;
    TRUNCATE TABLE `catalog_product_link_attribute_int`;
    TRUNCATE TABLE `catalog_product_link_attribute_varchar`;
    TRUNCATE TABLE `catalog_product_option`;
    TRUNCATE TABLE `catalog_product_option_price`;
    TRUNCATE TABLE `catalog_product_option_title`;
    TRUNCATE TABLE `catalog_product_option_type_price`;
    TRUNCATE TABLE `catalog_product_option_type_title`;
    TRUNCATE TABLE `catalog_product_option_type_value`;
    TRUNCATE TABLE `catalog_product_super_attribute_label`;
    TRUNCATE TABLE `catalog_product_super_attribute_pricing`;
    TRUNCATE TABLE `catalog_product_super_attribute`;
    TRUNCATE TABLE `catalog_product_super_link`;
    TRUNCATE TABLE `catalog_product_enabled_index`;
    TRUNCATE TABLE `catalog_product_website`;
    TRUNCATE TABLE `catalog_category_product_index`;
    TRUNCATE TABLE `catalog_product_index_price`;
    TRUNCATE TABLE `catalog_product_index_eav`;
    TRUNCATE TABLE `catalog_category_product`;
    TRUNCATE TABLE `catalog_product_index_eav_idx`;
    TRUNCATE TABLE `catalog_product_entity`;
    TRUNCATE TABLE `catalog_product_relation`;
    TRUNCATE TABLE `catalog_product_index_price_idx`;
    TRUNCATE TABLE `catalog_product_index_website`;
    TRUNCATE TABLE `cataloginventory_stock_item`;
    TRUNCATE TABLE `cataloginventory_stock_status`;
    TRUNCATE TABLE  `core_url_rewrite`;

    SET FOREIGN_KEY_CHECKS = 1; 
    ";

   $results = mysqli_multi_query($mysqli,$query);

   $mysqli->close();


   ?>

Надеюсь, это поможет.

...