Catalogfil не импортировать если нет в наличии

@andchir
не публиковать с tv.available = 1.

$cf_config['imp_before_change'] = '[{"published":0},{"tv.available":"1"}]';

Всё равно публикует...

Участник @andchir написал в Catalogfil не импортировать если нет в наличии:

В функции filter_import() проверять значение и возвращать null, если нет в наличии.

function filter_import($value_arr){
   $output_arr = $value_arr;

   if($output_arr['content']['available'] = "1")
	$output_arr = null;
       return;
}
Попробовал так, не получилось.

Попробовал так, не получилось.

А проверить код, погуглить - это слишком сложно? Я стараюсь давать только направление, чтобы человек сам что-то делал и это было бы более полезно для него.

Вот пример:

//функция для фильтрации значений при ИМПОРТЕ
function filter_import($value_arr){
    $output_arr = $value_arr;
    
    if(empty($output_arr['tv'][10])) {
        return null;
    }
    
    return $output_arr;
}

10 - это ID параметра наличия, который указан в конфигурации в параметре $cf_config['content_row'].

-1

Участник @andchir написал в Catalogfil не импортировать если нет в наличии:

Попробовал так, не получилось.

А проверить код, погуглить - это слишком сложно? Я стараюсь давать только направление, чтобы человек сам что-то делал и это было бы более полезно для него.

С первого дня использования Shopkeeper только и приходиться что то гуглить, ждать исправлений и.т.п. В итоге на протяжении всего своего существования Shopkeeper не представляет готовый продукт. Последний раз когда я спросил почему крошки цепляют названия из соседних категорий, мне сказали гуглить, смотреть демо сайт и.т.п., оказалось баг. В итоге работа не была сдана вовремя. Как только большинство багов было исправлено, появился Shopkeeper 4, т.е. на протяжении всего времени существования Shopkeeper 3 не был полноценным интернет-магазином. Shopkeeper 3 - это некий недоделанный конструктор.
Дело в том, что стандартный функционал или простейшие готовые решения, надо вынести в отдельный раздел документации.

И вот эта настройка не работает. 0 - в наличии, 1 - нет в наличии. Публикует всё.

$cf_config['imp_before_change'] = '[{"published":0},{"tv.available":1}]';

P.S.: Эта критика будет полезна и поможет делать интернет-магазин более качественным.

Последний раз когда я спросил почему крошки цепляют названия из соседних категорий, мне сказали гуглить, смотреть демо сайт и.т.п., оказалось баг.

Как связаны хлебные крошки с шопкипером?

Дело в том, что стандартный функционал или простейшие готовые решения, надо вынести в отдельный раздел документации.

Не хотите этим заняться? Ждите доброго дядю. Хотя есть люди, которые помогают.

И вот эта настройка не работает. 0 - в наличии, 1 - нет в наличии. Публикует всё.

$cf_config['imp_before_change'] = '[{"published":0},{"tv.available":1}]';

Нужны подробности. Покажите полный конфиг и файл, который импортируете.

Эта критика будет полезна и поможет делать интернет-магазин более качественным.

Критика полезна когда есть что-то конкретное. А лучше не критиковать, а сделать самому и поделиться решением. Именно из-за такого отношения Shopkeeper 3 заброшен. Большинство считает, что им кто-то должен.
Кстати, специально для таких как вы создана такая страничка:
http://forum.modx-shopkeeper.ru/topic/954/для-тех-кто-уверен-что-делает-всё-правильно-но-что-то-не-работает-а-должно

@andchir

<?php

//Название класса таблицы товаров в БД
$cf_config['className'] = 'shopContent';
//Название пакета таблицы товаров в БД
$cf_config['packageName'] = 'shop';
//Название поля ID родителя
$cf_config['parent_field'] = 'resource_id';

//разбивка по столбцам при импорте и экспорте (content|tv|category)
$cf_config['content_row'] = array(
    array('Артикул',array('articul','content')),
    array('Наименование',array('pagetitle','content')),
    array('Цена',array('price','content')),
	array('Страна',array('country','content')),
	array('Состав',array('consist','content')),
	array('Длина',array('size','content')),
	array('Ширина',array('width','content')),
	array('Высота',array('height','content')),
	array('В наличии',array('available','content')),
	array('Вес',array('weight','content'))
);

//значения по умолчанию при импорте или проверка при экспорте
$cf_config['imp_content_default'] = array(
    'content' => array(
        'deleted' => 0,
        'published' => 1,
        'template' => 808
        //'createdon' => strtotime("now")
        //'publishedon' => strtotime("now")
        //'pub_date' => strtotime("now")
        //'editedby' => 1
        //'editedon' => strtotime("now")
    ),
    'tv' => array(
        //7 => 0
    )
);

//первая строка - названия полей
$cf_config['include_captions'] = true;

//число товаров импортируемых за один раз (загрузка по группам). 0 - не ограничивать.
$cf_config['batch_import'] = 300;

//разбивать по категориям
$cf_config['include_categories'] = false;

//удалять дочерние категории при очистке и обновлении каталога
$cf_config['delete_subcategories'] = true;

//по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении).
$cf_config['imp_chk_field'] = 'pagetitle';

//проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении).
$cf_config['imp_chk_tvid_val'] = false;

//Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field)
$cf_config['imp_if_not_exist'] = true;

//удалять HTML-теги при экспорте
$cf_config['exp_strip_tags'] = false;

//автоматически генерировать псевдоним (alias) при импорте
//false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит.
$cf_config['imp_autoalias'] = true;

//Изменить значения поля для всех вложенных товаров до начала импорта.
//Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе.
//первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым)
$cf_config['imp_before_change'] = '[{"published":0},{"tv.available":"1"}]'; //'[{"published":1},{"tv.available":0}]';//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены

//удалить файл после экспорта (скачивания)
$cf_config['exp_delete_file'] = false;

//кодировка CSV-файла при экспорте
$cf_config['exp_csv_charset'] = 'UTF-8'; //'windows-1251'

//Импортировать (обновлять) пустые значения
$cf_config['imp_empty'] = true;

//Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import".
$cf_config['imp_custom_processor'] = '';

//путь (xpath) в XML структуре до товаров
$cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers';

//Структура XML файла для импорта
$cf_config['imp_xml_structure'] = '';

//тестирование конфигурации (без записи в БД). Отчёты -> Журнал ошибок.
$cf_config['imp_testmode'] = false;


//функция для фильтрации значений при ЭКСПОРТЕ
function filter_import($value_arr){
    $output_arr = $value_arr;
    /*
    if(isset($output_arr['content']['pagetitle']))
        $output_arr['content']['pagetitle'] = mb_strtoupper($output_arr['content']['pagetitle'], 'UTF-8');
    */
    return $output_arr;
}



?>

0_1541545594374_e7c7fa8e-2527-48b7-b42b-ec36b0125466-image.png
Наименование Цена Страна Состав Длина Ширина Высота В наличии
Шоколад Алёнка 500 Россия Какао 0 0 0 1

Шоколада нет в наличии, но он всё равно публикуется.

Шоколада нет в наличии, но он всё равно публикуется.

Как у вас определяется, что его нет в наличии? Если про Алёнку, то наличие вижу - 1.

Параметр $cf_config['imp_before_change'] работает для товаров, которых НЕТ В ПРАЙС-ЛИСТЕ. Об этом написано в комментарии.

//Изменить значения поля для всех вложенных товаров до начала импорта.
//Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе.
//первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым)

Поэтому нужно это симулировать, проверять наличие в функции и возвращать null. Но у вас в конфиге этого почему-то нет.

@andchir
0 в наличии, 1 - нет в наличии

'[{"published":0},{"tv.available":"1"}]'

не публиковать, если available 1. Не так работает? Если их нет в прайс листе, то что с чем сравнивает этот параметр?

Участник @andchir написал в Catalogfil не импортировать если нет в наличии:

Поэтому нужно это симулировать, проверять наличие в функции и возвращать null. Но у вас в конфиге этого почему-то нет.

Потому что, я так понимаю, это необходимо написать самостоятельно, т.к. готового решения нет?

Если их нет в прайс листе, то что с чем сравнивает этот параметр?

Вы же дали скриншот и написали, что там есть товары, которых нет в наличии.

Потому что, я так понимаю, это необходимо написать самостоятельно, т.к. готового решения нет?

Да, вам надо писать самостоятельно, раз вы ничего не понимаете, что я пишу.

Участник @andchir написал в Catalogfil не импортировать если нет в наличии:

Если их нет в прайс листе, то что с чем сравнивает этот параметр?

Вы же дали скриншот и написали, что там есть товары, которых нет в наличии.

Ну и почему он товары с 1 (tv.available:1)(нет в наличии) не делает published":0 - не опубликовано.

Участник @andchir написал в Catalogfil не импортировать если нет в наличии:

Да, вам надо писать самостоятельно, раз вы ничего не понимаете, что я пишу.

function filter_import($value_arr){
    $output_arr = $value_arr;
    
    if(empty($output_arr['tv'][10])) {
        return null;
    }
    
    return $output_arr;
}

Вот это у меня не работает, я объяснил ведь, что он должен проверять на значение 1 или 0. Вы так объясняете, что легко запутаться. Я уж не говорю, что я не могу выгрузку сделать 3 день, пока мы тут общаемся, даже интересно сколько это продлиться. А вообще скачал книгу по php, что бы разобраться. Я так понимаю вам же это нужно, что бы я сам разобрался, ну ок.

Попробуйте такой конфиг.

<?php

//Название класса таблицы товаров в БД
$cf_config['className'] = 'shopContent';
//Название пакета таблицы товаров в БД
$cf_config['packageName'] = 'shop';
//Название поля ID родителя
$cf_config['parent_field'] = 'resource_id';

//разбивка по столбцам при импорте и экспорте (content|tv|category)
$cf_config['content_row'] = array(
    array('Артикул',array('articul','content')),
    array('Наименование',array('pagetitle','content')),
    array('Цена',array('price','content')),
    array('Страна',array('country','content')),
    array('Состав',array('consist','content')),
    array('Длина',array('size','content')),
    array('Ширина',array('width','content')),
    array('Высота',array('height','content')),
    array('В наличии',array('available','content')),
    array('Вес',array('weight','content'))
);

//значения по умолчанию при импорте или проверка при экспорте
$cf_config['imp_content_default'] = array(
    'content' => array(
        'deleted' => 0,
        'published' => 1,
        'template' => 808
        //'createdon' => strtotime("now")
        //'publishedon' => strtotime("now")
        //'pub_date' => strtotime("now")
        //'editedby' => 1
        //'editedon' => strtotime("now")
    ),
    'tv' => array(
        //7 => 0
    )
);

//первая строка - названия полей
$cf_config['include_captions'] = true;

//число товаров импортируемых за один раз (загрузка по группам). 0 - не ограничивать.
$cf_config['batch_import'] = 300;

//разбивать по категориям
$cf_config['include_categories'] = false;

//удалять дочерние категории при очистке и обновлении каталога
$cf_config['delete_subcategories'] = true;

//по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении).
$cf_config['imp_chk_field'] = 'pagetitle';

//проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении).
$cf_config['imp_chk_tvid_val'] = false;

//Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field)
$cf_config['imp_if_not_exist'] = true;

//удалять HTML-теги при экспорте
$cf_config['exp_strip_tags'] = false;

//автоматически генерировать псевдоним (alias) при импорте
//false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит.
$cf_config['imp_autoalias'] = true;

//Изменить значения поля для всех вложенных товаров до начала импорта.
//Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе.
//первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым)
$cf_config['imp_before_change'] = '[{"published":0},{"available":"1"}]'; //'[{"published":1},{"tv.available":0}]';//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены

//удалить файл после экспорта (скачивания)
$cf_config['exp_delete_file'] = false;

//кодировка CSV-файла при экспорте
$cf_config['exp_csv_charset'] = 'UTF-8'; //'windows-1251'

//Импортировать (обновлять) пустые значения
$cf_config['imp_empty'] = true;

//Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import".
$cf_config['imp_custom_processor'] = '';

//путь (xpath) в XML структуре до товаров
$cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers';

//Структура XML файла для импорта
$cf_config['imp_xml_structure'] = '';

//тестирование конфигурации (без записи в БД). Отчёты -> Журнал ошибок.
$cf_config['imp_testmode'] = false;


//функция для фильтрации значений при ЭКСПОРТЕ
function filter_import($value_arr){
    $output_arr = $value_arr;
    
    // Импортируем, если наличие = 0 (0 = есть в наличии)
    if(!empty($output_arr['content']['available'])) {
         return null;
    }

    return $output_arr;
}

//функция для фильтрации значений при ЭКСПОРТЕ
function filter_export($value_arr,$doc_id=0){
    $output_arr = $value_arr;
    //var_dump($value_arr,$output_arr);
    //exit;
    /*
    if(isset($output_arr['price']))
        $output_arr[1] = floatval($output_arr[1]) - 200;
    */
    return $output_arr;
}

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.