Для удобства вернул прямое скачивание пакетов на странице загрузок. Скачивание доступно для тех, у кого есть действующая подписка. Это может быть удобно, если вы работаете на чужом сайте, нужно установить какой-то пакет, но нет желания указывать свои логин и апи-ключ. Скачал пакеты и залил на сайт напрямую.
В последнее время я здесь мало чего писал про наши пакеты, а меж тем у нас появились не только новые версии имеющихся компонентов, но и были выпущены совершенно новые решения. Этой статьей я начну небольшой цикл публикаций, посвященных последним новинкам. Первая из них про пока еще мало оцененный, но имеющий очень высокий потенциал пакет — UserKarma. Довольно подробно я про него писал здесь. Советую внимательно ознакомиться с материалом. Совсем скоро выйдет обновленная версия сборки ShopModxBox, которая будет включать в себя в том числе и систему скидок, а так же автоматический переброс пользователей в группы «Серебряный клиент», «Золотой клиент» и «Платиновый клиент» с различными скидками для этих пользователей. Очень хорошая программа лояльности для интернет-магазинов с частыми повторными продажами. Основан этот функционал будет как раз на базе этого компонента.
Добрый день! Есть мультиязычный сайт, реализован на контекстах (через Babel). Нужно сделать категории/теги. На данный момент реализовано TV (Автометкой) и TagLister. Но очень не удобно, потому что автометки подтягиваются из всех языков. Хотелось бы сделать в админке отдельный ресурс «категории» и там создавать документы с нужными названиями. И в TV реализовать через «Список (множественный выбор)». Работает хорошо, если добавить новости только 1 тег. Если 2 и более выводит их с сепаратором: #все категории||#искусство. И поэтому не работает TagLister ( В TV «Возможные значения» прописано:
@EVAL $parent = $_GET; switch(end($parent)){ case 'web': $parent_c = 130; break; case 'ua': $parent_c = 131; break; case 'en': $parent_c = 132; break; } $output = $modx->runSnippet('pdoResources',array( 'parents'=> $parent_c, 'tpl'=>'@CODE:[[+pagetitle]]==<li><a href="[[++site_url]][[+url]]">[[+pagetitle]]</a></li>', 'sortdir'=>'ASC', 'sortby'=>'menuindex', 'outputSeparator'=>'||')); return $output;
Должно получиться как на скрине ниже. Может у кого-то есть решение, или идеи? yadi.sk/i/WuqtyzfhqZGji
Согласен. Тут много таких публикаций, которые я иногда с удовольствием могу перечитать.
Скоро доберусь, сделаю-таки кнопочку «Избранное». Подобные материалы однозначно маст хэв в избранных :)
Потрясающе, Николай! Не думал, что такой короткий код сделает столько действий! Я бы наговнокодил в данной задаче, определённо! :)
Расширения кругозора пост. Просто для демонстрации того, что можно делать с помощью xPDO, без задействования процессоров.
Задача стоит такая: есть каталог с вложенностью Каталог-Раздел-Товар. У большинства товаров в ТВ-поле указан производитель. Надо пройтись по всем товарам во всех разделах, создать в родительском разделе документ-производитель и «переместиться» в него. Конечно же на каждой итерации надо проверять есть ли уже такой родитель-производитель или нет. Если есть, то просто в него «перемещаться». Предлагаю внимательно изучить представленный код.
$q = $modx->newQuery('modResource'); $alias = $q->getAlias(); $q->innerJoin('modTemplateVarResource', "tv", "tv.tmplvarid = 22 AND tv.contentid = {$alias}.id"); $q->innerJoin('modResource', 'brand', "brand.id = tv.value"); $q->innerJoin('modResource', 'Parent'); $q->where(array( "Parent.template" => 2, )); $q->select(array( "brand.pagetitle as brand", "{$alias}.*", )); $q->sortby("{$alias}.id"); foreach($modx->getIterator('modResource', $q) as $doc){ $data = array( "parent" => $doc->parent, "pagetitle" => $doc->brand, "template" => 23, ); // Пытаемся получить раздел-производитель, если уже есть if(!$parent = $modx->getObject('modResource', $data)){ // Если раздел не был получен, создаем новый $data = array_merge($data, array( "alias" => $doc->brand, "isfolder" => 1, "published" => 1, "publishedon" => time(), "publishedby" => $modx->user->id, "createdby" => $modx->user->id, "createdon" => time(), )); $parent = $modx->newObject('modResource', $data); // Устанавливаем id не null, чтобы не ловить нотис $parent->set('id', 0); } // Устанавливаем родителя для текущего документа $doc->Parent = $parent; $doc->save(); // print_r($doc-> toArray()); // print_r($doc->Parent-> toArray()); }
Обратите внимание, что сам по себе объект $parent здесь нигде не сохраняется, даже когда создается новый. Он просто назначается текущему документу в качестве свойства $doc->Parent = $parent. Такой синтаксис эквивалентен вызову $doc->addOne($parent, 'Parent'); Так как же у нас родитель сохраняется, да еще и перемещение документа выполняется? Давайте посмотрим мап-файл класса modResource. Для этого класса прописана связь с псевдонимом Parent.
'aggregates' => array ( 'Parent' => array ( 'class' => 'modResource', 'local' => 'parent', 'foreign' => 'id', 'cardinality' => 'one', 'owner' => 'foreign', ),
Рассмотрим детальней параметры этой связи: class — класс связанного объекта. local — название колонки текущего объекта, участвующей в связи. foreign — название колонки внешнего объекта. cardinality — тип связи объектов (в нашем случае один-к-одному, бывает еще один-ко-многим). owner — владелец, то есть кто главный в этой связке. Вот владелец — это для нас самое главное. Этот признак влияет на то, свойства какого объекта будут назначены какому объекту. В нашем случае, владельцем является именно родитель Parent (foreign означает — внешний) и вот не смотря на то, что мы сохраняем дочерний документ, механизм xPDO работает таким образом, что сначала сохраняются связанные объекты, а потом уже сам объект (на самом деле потом и связанные объекты еще раз сохраняются, но не суть). В итоге, сначала у нас создается родительский новый документ-раздел (в этот момент он уже получает из базы данных свой id), затем этот id устанавливается текущему документу в качестве значения колонки parent, и когда уже сохраняется текущий документ, он фактически попадает в новый раздел. А если документ-раздел сразу был получен (то есть он не новый), то при сохранении просто его id назначается текущему документу.
Зачем так извращаться, когда можно просто воспользоваться процессорами? Отвечу. Вопрос просто в производительности. Как выяснилось уже не вчера, не смотря на то, что в create/update-процессорах документов есть параметры syncsite и clearCache, которые сигнализируют, что не надо сбрасывать кеш, несколькими строчками выше кеш сайта все равно сбрасывается (смотрим раз и два). Таким образом, обновление двух тысяч ресурсов займет и время не малое, да еще и сервер помучает. В моем случае я знал, что у меня не будет дублей, мне не требуется выполнения плагинов и т.п., поэтому я с чистой совестью поработал тут с объектами напрямую. В итоге, две тысячи документов перелопатилось за 25 секунд (это при том, что хостинг имеет серьезные ограничения на файловые иопсы). На каталогах в десятки тысяч товаров и более такой прием может значительно съэкономить ресурсы.
Не смотря на то, что все очень запутано, советую все-таки внимательно изучить этот материал, так как его понимание значительно вам поможет в разработке.
Один, тот что я прикреплял, еще есть файл с остатками (Но его скорее всего не нужно будет выгружать).
Несколько файлов — это как раз нормально для 1С. Как правило они выгружают import.xml (сам каталог, включая товары) и offers.xml (товарные предложения (как правило цены и остатки)). Так же, если у них картинки идут в самой 1Ске, то они могут выгружать сразу архив с картинками. Но если вы говорите, что у вас картинки отдельно заливаются, то это совсем не обязательно.
Правильно я понял, что за 10000 настроите импорт этого файла, и соответственно чтобы он обновлялся по расписанию?
И еще нужно будет чтобы картинки прицепить, они так же находятся на ftp компании предоставляющей файл. Названия файлов в папках соответствуют уникальному идентификационному коду товаров. Это за дополнительную стоимость или уже включено?
Да, все «под ключ».
По крону замечательно будет. Единственно только сайт находится пока в разработке, как только до делается будет перенесен на отдельный сервер.
Это не проблема. Практически любой хостинг сейчас предоставляет услугу крона, обычно с этим проблем нет. Но подводные камни действительно могут быть. К примеру, тот же таймвеб убивает процессы, которые в течение 5 секунд нагружают процессор на 100%, так что надо будет потом протестировать предполагаемый хостинг. Но если у вас не шаредхостинг будет, а выделенный сервер (пусть и виртуальный), проблем не должно возникнуть никаких.
К сожалению я с 1С не работал, так что не могу вам точно сказать какой именно там формат. Но предполагаю что да. Компания предоставляет несколько файлов. Один, тот что я прикреплял, еще есть файл с остатками (Но его скорее всего не нужно будет выгружать). Как они заявляют ежедневно они обновляются. Правильно я понял, что за 10000 настроите импорт этого файла, и соответственно чтобы он обновлялся по расписанию? И еще нужно будет чтобы картинки прицепить, они так же находятся на ftp компании предоставляющей файл. Названия файлов в папках соответствуют уникальному идентификационному коду товаров. Это за дополнительную стоимость или уже включено?
По крону замечательно будет. Единственно только сайт находится пока в разработке, как только до делается будет перенесен на отдельный сервер.