Игорь Терентьев

Игорь Терентьев

С нами с 29 ноября 2013; Место в рейтинге пользователей: #83
Андрей Воробьев
11 сентября 2015, 12:37
1
+1
Написал четырехуровневый импорт из CSV (на быстроту/качественность кода не претендую, замечания приветствуются).
Товаров у меня 75000, обработка в районе 4-х часов идет.
Работает пока что только с включенной автоматической транслитерацией.

Код ниже вставляется от строки // Import до строки // Set default values
При этом задавать «parent» при отправке запроса на импорт не нужно, он указывается в скрипте.

Первые три колонки, как я и писал, указывают на НАИМЕНОВАНИЯ родительских категорий товаров (указывать id не нужно):
группа1; группа2; группа3 (например, Подушки; Декоративные; Синтетические)

Скан происходит в заранее созданной категории с id, указанным в $parent_id (0 — корень);
Создавать категории заранее не нужно. Скрипт проверяет на наличие категории по алиасу и, если категории с таким алиасом не существует, он ее создает.
Если вложенные группа2 или 3 не указываются, то выгружается товар в его родителя (в т.ч. и в корень).

// Import!
$parent_id = 0; // Указываем здесь id корневого каталога, куда выгружать 
$handle = fopen($file, "r");
$rows = $created = $updated = 0;
while (($csv = fgetcsv($handle, 0, $delimeter)) !== false) {
	$rows ++;
	$data = $gallery = array();
	$modx->error->reset();
	$modx->log(modX::LOG_LEVEL_INFO, "Raw data for import: \n".print_r($csv,1));
	foreach ($keys as $k => $v) {
		if (!isset($csv[$k])) {
			exit('Field "' . $v . '" not exists in file. Please fix import file or parameter "fields".');
		}
		if ($v == 'g1') { ///Если поле g1, вычисляем id по транслиту имени каталога
		    if ($csv[$k]=='') {$data['parent']=381;} else {
		    $pdo = $modx->getService('pdoFetch');
            $newcat = $pdo->getObject('modResource', array('pagetitle' => $csv[$k]));
            if (!$newcat) { ///Если такой id не существует, то создаем его
                $parent = $modx->newObject('modResource');
                $parent->set('pagetitle',$csv[$k]);
                $parent->set('alias',$csv[$k]);
                $parent->set('parent',31);
                $parent->set('template',2);
                $parent->set('class_key','msCategory');
                $parent->set('published','1');
                $parent->set('hidemenu','0');
                $parent->save();
            }
		    $data['parent'] = $newcat['id'];
		    }
		}
		if ($v == 'g2') { ///Если поле g2, вычисляем id по транслиту имени каталога
		    if ($csv[$k]!=='') {
		    $pdo = $modx->getService('pdoFetch');
            $newcat = $pdo->getObject('modResource', array('pagetitle' => $csv[$k]));
            if (!$newcat) { ///Если такой id не существует, то создаем его
                $par = $pdo->getObject('modResource', array('pagetitle' => $data['g1']));
                $parent = $modx->newObject('modResource');
                $parent->set('pagetitle',$csv[$k]);
                $parent->set('alias',$csv[$k]);
                $parent->set('parent',$par['id']);
                $parent->set('template',2);
                $parent->set('class_key','msCategory');
                $parent->set('published','1');
                $parent->set('hidemenu','0');
                $parent->save();
            }
		    $data['parent'] = $newcat['id'];
		    }
		}
		if ($v == 'g3') { ///Если поле g3, вычисляем id по транслиту имени каталога
		    if ($csv[$k]!=='') {
		    $pdo = $modx->getService('pdoFetch');
            $newcat = $pdo->getObject('modResource', array('pagetitle' => $csv[$k]));
            if (!$newcat) { ///Если такой id не существует, то создаем его
                $par = $pdo->getObject('modResource', array('pagetitle' => $data['g2']));
                $parent = $modx->newObject('modResource');
                $parent->set('pagetitle',$csv[$k]);
                $parent->set('alias',$csv[$k]);
                $parent->set('parent',$par['id']);
                $parent->set('template',2);
                $parent->set('class_key','msCategory');
                $parent->set('published','1');
                $parent->set('hidemenu','0');
                $parent->save();
            }
		    $data['parent'] = $newcat['id'];
	    	}
		}
		if ($v == 'gallery') {
			$gallery[] = $csv[$k];
		}
		elseif (isset($data[$v]) && !is_array($data[$v])) {
			$data[$v] = array($data[$v], $csv[$k]);
		}
		elseif (isset($data[$v]) && is_array($data[$v])) {
			$data[$v][] = $csv[$k];
		}
		else {
			$data[$v] = $csv[$k];
		}
	}
	$is_product = false;
Александр Лунегов
20 августа 2015, 14:34
1
0
Такая же беда.
По всей видимости это проблема именно MODXа. Там и ссылка на «список изменений» для проверки не правильно указана (пропущен каталог «core»).

Исправил редактированием файла .htaccess в core:
IndexIgnore */*
<Files *.*>
    Order Deny,Allow
    Deny from all
</Files>
То есть заменил «php» на "*" в теге Files.
Василий Наумкин
07 августа 2015, 05:24
4
+3
В pdoResources задача решается несколько иначе:
[[!pdoResources?
	&includeTVs=`manuf,diag,color`
	&where=`{
		"manuf":"Sony",
		"diag:IN":[65,85],
		"color:IN":["black","gray"]
	}`
]]
В принципе, там есть и &tvFilters, но только как временная замена при миграции c getResources. Пользоваться этим параметром я никому не советую — &where гораздо гибче, лучше и удобнее.

Вот здесь кратко написано, а вот здесь значительно подробнее.
Максим Кузнецов
29 июня 2015, 18:05
2
+1
Ок, я поставил minishop2 и mSearch2. Прикладываю рабочие параметры Join'a:
&class=`modResource`
	&leftJoin=`{
		"Thumb": {
			"class": "msProductData",
			"on": "modResource.id = Thumb.id"
		 }
	}`
	&select=`{
		"modResource": "*",
		"Thumb": "Thumb.thumb as preview"
	}`
— вызывать как [[+preview]]. Все дело было в классе — msProductData вместо msProductFile…

Ненавижу LeftJoin..)
Василий Краковецкий
27 марта 2015, 14:20
2
+2
Обалденный скрипт, но можно его улучшить) Например зачем вручную менять провайдера? Достаточно сделать вот так — мой форк
Ivan Shvindin
27 марта 2015, 10:14
1
+1
наверно он имеет ввиду когда включён параметр показывать тв ниже контента
tvs_below_content = 1
Василий Наумкин
28 февраля 2015, 15:15
1
0
Это потому, что там еще дофига условий присоединяется. Нужно включать showLog и смотреть в запрос.

Вот так работает — условия во вложенном массиве, поэтому берутся в скобки:
[[!pdoMenu?
	&parents=`0`
	&level=`1`
	&context=`en`
	&where=`[{"template":1,"OR:template:=":2}]`
	&showLog=`1`
]]

Выходит такое условие выборки:
WHERE  (  ( `modResource`.`template` = 1 OR `modResource`.`template` = 2 )  AND  ( `modResource`.`parent` IN (0) OR `modResource`.`id` IN (0) )  AND `modResource`.`published` = 1 AND `modResource`.`hidemenu` = 0 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'web' ) 

Не стесняйтесь использовать &showLog.
Василий Наумкин
18 февраля 2015, 21:43
3
+1
Перейти в директорию сайта в консоли сервера, затем набрать:
mkdir ./Extras
cd ./Extras
git clone https://github.com/bezumkin/mSearch2.git
php ./mSearch2/_build/build.transport.php
Готовый пакет лежит в ./core/packages/.
Теперь нужно зайти в управление пакетами админки, поискать его там локально и установить.

Куда проще — я не знаю.
Сергей Шлоков
09 февраля 2015, 09:49
1
0
Если ты выводишь документы по годам, то кнопке «Загрузить еще» нужно добавить атрибут, например, data-year, в котором и указываешь год. Изначально может быть пусто (значит текущий год). Нажал — зачитались документы 2015, а кпопке присваиваешь data-year=2014. Потом 2013 и т.д. Передаешь его через ajax. А в pdpTools в where указываешь этот год
&where=`{"YEAR(createdon)": $_POST['year']}`
П.С. $_POST['year'] предварительно лучше обработать.
Алексей Ерохин
20 ноября 2014, 20:25
4
+2
Я так делал.
Перед собственно определением плагина в js-файле добавлял это:
var storesex = new Ext.data.ArrayStore({
    id: 'minishop2-product-sex'
    ,fields: [{name: 'name', type: 'string']}
    ,data: [['Мужской'],['Женский'],['Унисекс']]
});
miniShop2.combo.ProductSex = function(config) {
    config = config || {};
    Ext.applyIf(config,{
        store: storesex
        ,emptyText: _('ms2_combo_select')
        ,displayField: 'name'
        ,valueField: 'name'
        ,hiddenName: 'sex'
        ,mode: 'local'
        ,triggerAction: 'all'
        ,editable: false
        ,selectOnFocus: false
        ,preventRender: true
        ,forceSelection: true
        ,enableKeyEvents: true
    });
    miniShop2.combo.ProductSex.superclass.constructor.call(this,config);
};
Ext.extend(miniShop2.combo.ProductSex,MODx.combo.ComboBox);
Ext.reg('minishop2-combo-product-sex',miniShop2.combo.ProductSex);
Теперь в плагине можно использовать xtype только что зарегистрированного комбобокса

sex: {xtype: 'minishop2-combo-product-sex',fieldLabel: 'Пол'}