Всего 125 350 комментариев

Futuris
28 июня 2022, 12:08
0
Насчет копирования категорий — это отход от темы и не в этом суть. Важен технический момент, который заключается для меня в том, чтобы проставленная мной цена за куб, в конкретной категории модифицировалась по вышеописанной формуле: «цена куба / количество блоков в кубе = цена за штуку».

Т.е. газоблоков размером 600х200х300 мм в кубе 27,77 шт и стоят они за штуку (при цене 7000 за куб) — 252 руб.
Блоков 600х250х50 мм в кубе 133,33 шт и они за штуку стоят — 52,5 руб. (т.е. 7000 делим на 133,3)
Блоков 600х250х500 мм в кубе 13,33 и они стоят 525 руб. за штуку.
И размеров блоков — десятки. Но все их объединяет одна цена за куб — в описанном примере — 7000 руб.

Т.е. вы считаете, что есть возможность модифицировать эту цену для всех размеров блоков в определенной категории (не во всем каталоге магазина) по описанной выше простой формуле? И чтобы в дальнейшем я менял в этой категории только одну цену за куб, а для всех размеров эта цена будет пересчитываться «поштучно»?
Артур Шевченко
28 июня 2022, 11:53
0
Где-то есть скрипт, который это делает, либо это будет первый в новейшей истории случай божественного вмешательства в работу сайт.
Артур Шевченко
28 июня 2022, 11:50
0
Копировать категорию с товарами на мой взгляд не лучшая идея, особенно если на сайте они друг от друга никак отделяться не будут. Можно в карточке товара добавить опции с вариантами выбора Опт и Розница, если выбрана розница, то в плагине на добавление в корзину пересчитывать цену.
Futuris
28 июня 2022, 10:05
0
Не совсем так. Газобетон на сайте продается кубами. Но чтобы охватить запросы на розницу — решили экспериментально создать категорию с ценами за штуку. Но если за куб — одна цена, фактически на один-завод производитель у которого сотни блоков разных размеров. Т.е. блоки завода «Бонолит», к примеру — все по 7500 за куб. И цену менять быстро и удобно. А вот за штуку — нужно высчитывать в зависимости от размера и это время занимает.

Поэтому чисто логически задача выглядит так:
Клонируется обычная категория с ценой за куб. Далее на эту категорию вводится скрипт, модифицирующий цену (если это возможно конечно). Т.е. скрипт просто берет уже существующую цену за куб и делит ее на цифровое значение опции «количество блоков в кубе» (опция присвоена каждому размеру блоку) — и выводит в итоге цену за штуку. Цена за куб при этом в данной категории также есть, но ее можно даже не выводить в стилях страницы.

И в итоге при следующем изменении цен (а они меняются несколько раз в месяц) — я просто выгружаю обе категории блоков (с ценой за куб и с ценой за штуку) и меняю цену например с 7500 на 7000. И блоки «кубовой» категории так и висят с ценой 7000, а блоки «штучной» категории пересчитываются по формуле: «цена куба / количество блоков в кубе = цена за штуку».
vectorserver
28 июня 2022, 05:50
0
Выше на скрине решение, простой калькулятор
Максим
28 июня 2022, 01:01
0
А почему нельзя было воспользоваться услугами JSON? Evo формирует, Revo забирает, обрабатывает (если нужно) и кладет в базу… У меня такой метод переноса контента прошел безболезненно…
Артур Шевченко
27 июня 2022, 21:58
0
Если я правильно понял, товар продается поштучно, но цена указывается за объем? Если так, то думаю, нужно создать прайс отдельным ресурсом, и написать плагин на его сохранение, который будет пересчитывать цены по обозначенной формуле.
Артур Шевченко
27 июня 2022, 21:38
0
Для json нужны двойные кавычки.
Futuris
27 июня 2022, 16:49
0
Вы хотите предложить такое решение?
vectorserver
27 июня 2022, 16:14
0
Зачем вручную!? Скрипт сам пересчитает все!
Futuris
27 июня 2022, 14:39
0
Вопрос в удобстве изменений цен. На 300 позиций газобетона — дается одна цена за куб. Но у каждого конкретного блока есть свой размер, и соответственно — своя цена поштучно. Если каждый раз при изменении цен на куб газобетона я буду вручную пересчитывать штучную цену каждого размера — это можно с ума сойти.
Pavel
27 июня 2022, 14:21
0
Вот рабочий вариант. Спасибо!
[[pdoResources?
   &tpl=`asideNewsElement`
   &includeTVs=`img,relatedProducts`
   &limit=`3`
   &parents=`62`
   &where=`{"relatedProducts:LIKE": "%[[*id]]%"}`
]]
Евгений Лазарев
27 июня 2022, 13:31
0
Почитал я все тут (api, json файлы и просто файлы). Самым простым способом будет из этого api. Его писать не охото было.
Я думал, что если сайты лежат на одном серваке, то можно будет подключиться из одного проекта к index.php другого и все — мол есть объект $modx_old — вращай им как хочешь.
Но если выбора иного нет, то проще будет тогда на старом сайте работать из консоли и на новом делать записи через rest, Таким образом не придется с 2х сторон писать обработчики (грубо говоря rest подключить времени нужно меньше).
vectorserver
27 июня 2022, 13:16
0
Если единоразово можно использовать компонент к примеру catalogfill-2.4.10-pl.transport
на доноре делаешь экспорт, на основном импорт из файла.

Описание (автор шлепнул свой сайт)
## Описание

Импорт/экспорт товаров (документов MODX) в/из CSV, XLS, XLSX.

## Возможности

- Импорт и экспорт товаров (документов MODX).
- Импорт и экспорт данных для любых лаблиц БД (в т.ч. созданных с помощью MIGXDB).
- Поддерживаются форматы файлов для импорта и экспорта: CSV, XML (только импорт), XLS, XLSX.
- Простая конфигурация. Можно настроить какой столбец куда (контент/TV-параметр) импортировать.
- Возможность создания конфигурационных файлов для разных задач. Конфигурацию можно выбрать перед импортом и экспортом.
- Удобная загрузка файлов.
- Режимы обновления (очистка до импорта) и добавления.
- Архивирование файлов. Все импортированные и экспортированные файлы хранятся на диске. Их можно удалить в любой момент.
- Поддержка категорий. Неограниченная вложенность.
- Возможность обновления данных товаров без их удаления (проверка соответствия по полю или значению TV).
- Возможность загрузки товаров по группам (можно подстроить под ресурсы сервера).
- Импорт и обновление товаров по Cron-у.

## Требования

- MODX Revolution 2.1 или выше
- кодировка сайта UTF-8
- PHP версии 5.2.0 или выше
- PHP расширение php_zip
- PHP расширение php_xml
- PHP расширение php_xmlwriter
- PHP расширение php_gd2

## Установка

1. Загрузите архив "catalogfill-2.x-pl.transport.zip" в папку core/packages/ вашего сайта. В панеле управления перейти "Система" -> "Управление пакетами" -> "Загрузить дополнения" -> "Искать пакеты локально" -> "Да".

2. В таблице пакетов появится пакет "catalogfill". Нажать кнопку "Установить".

3. Закончить установку.

4. Установить права 0777 на папку ``/assets/components/catalogfill/files/``.

5. В Настройках системы вашего сайта включите загрузку csv файлов ("Файловая система" -> "Разрешённые к загрузке файлы" (setting_upload_files)).

## Инструкция по использованию

1. Открыть компонент "Импорт/экспорт".
2. Нажать на поле "Родительский ресурс" и в дереве документов кликнуть документ-категорию, в/из которого нужно импортировать/экспортировать товары.

### Импорт
3. В списке "Файл для импорта" выбрать файл, которые находятся в папке ``/assets/components/catalogfill/files/`` на сервере. Нажав кнопку "Загрузить файлы", можно загрузить новый файл.
4. Выбрать конфигурацию для импорта в списке и нажать кнопку "Импортировать". В браузере появится индикация выполнения загрузки, нужно подождать завершения операции.

### Экспорт
5. В дереве документов выберите родительский ресурс (категорию), из которой нужно экспортировать товары.
6. Выбрать конфигурацию экспорта в списке "Конфигурация". Выбрать тип (формат) файла и нажать кнопку "Экспортировать".
7. Можно сразу скачать файл на жесткий диск вашего компьютера. Также экспортированные файлы хранятся в папке ``/assets/components/catalogfill/files/``.

## Конфигурирование

Для импорта и экспорта значений полей (таблица "site_content" в БД) товаров (документов) в конфигурационном файле в массиве ``$cf_config['content_row']`` нужно указать название столбца в файле, имя поля и тип содержимого.
Пример:
~~~
1 => array('Наименование',array('pagetitle','content')),
~~~

Для импорта и экспорта TV-параметров (таблица "site_tmplvar_contentvalues" в БД) нужно указать название столбца в файле, ID TV-параметра и тип содержимого.
Пример:
~~~
2 => array('Цена',array(7,'tv'))
~~~

Для импорта и экспорта категорий нужно указать название столбца в файле, ID шаблона категории и тип содержимого.
Пример:
~~~
0 => array('Категория',array(7,'category')),
~~~
7 - ID шаблона для категории.
Категории в файле должны идти последовательно от верхнего уровня к нижнему.

---

Предусмотрена возможность обновления данных товаров без их удаления (сохраняются ID).
Проверку на соответствие существующего товара и импортируемого можно осуществлять по полям (в БД) товара или значениям его TV-параметров.

Примеры:
~~~
$cf_config['imp_chk_field'] = 'pagetitle'; //Если найден товар с названием соответствующим названию импортируемого товара, его данные будут обновлены.
~~~
~~~
$cf_config['imp_chk_tvid_val'] = 10; //Проверка соответствия происходит по значению TV-парамтера с ID 10. Например это может быть артикул.
~~~

---

Для программистов есть возможность сделать обработку значений перед импортом или экспортом. Смотреть пример в конфигурационном файле.

---

Имена всех полей таблицы "site_content" (ресурсы) можно посмотреть, например, здесь: [http://bobsguides.com/modx-object-full-reference.html#modResource](http://bobsguides.com/modx-object-full-reference.html#modResource).

### Отмена публикации или изменение значения TV для товаров, которых нет в новом прайс-листе

Пример:
~~~
$cf_config['imp_before_change'] = '[{"published":0},{}]';
~~~
В данном случае перед импортом будет отменена публикация всех вложенных товаров и при импорте товары, которые есть в прайс-листе будут обновлены и опубликованы (использовать параметр "imp_content_default").
Таким образов старые товары будут сняты с публикации (можно также поместить в корзину - "deleted").
~~~
$cf_config['imp_before_change'] = '[{"tv.inventory":0},{}]';
~~~
В данном случае для всех вложенных товаров будет изменено значение TV-параметра "Кол-во на складе" (inventory) на "0".
При импорте если старых товаров нет в новом прайс-листе, они так и останутся с нулевым значением.

## Импорт товаров из XML

Для импорта товаров из XML-файла в конфигурационный файл нужно скопировать кусок XML (один товар) со структурой и указать названия полей. Для TV параметров (доп.полей) указывать ID TV с префиксом "tv".

Пример:
~~~
$cf_config['imp_xml_structure'] = <<<EOF
<Good>
    <Kod>tv8</Kod>
    <Name>pagetitle</Name>
    <Options>
        <Stock>tv5</Stock>
        <Image>tv2</Image>
    </Options>
    <Prices>
        <RegularPrice>tv1</RegularPrice>
        <OldPrice>tv20</OldPrice>
    </Prices>
</Good>
EOF;
~~~
Здесь "pagetitle" - это наименование товара. Остальные поля это TV-параметры.

Если товары находятся дальше первого уровня вложенности, можно указать вложенность в параметре ``$cf_config['imp_xml_itemsparent_path']``.
Пример:
~~~
$cf_config['imp_xml_itemsparent_path'] = '/catalog/shop/offers';
~~~

## Импорт и обновление товаров по Cron-у

Для импорта товаров по Cron-у использовать скрипт ``core/components/catalogfill/cron.php``.
Можно использовать, например, для обновления цен и т.п. с определенной периодичностью.

Аргументы:
1 - ID документа-контейнера или название контекста.
2 - название конфигурации без ".php"
3 - название файла в папке ``assets/components/catalogfill/files/``

Пример использования:
~~~
[путь папки сайта]core/components/catalogfill/cron.php 2 default example1.xls
~~~

Пример настройки Cron-а в текстовом формате. Запускать импорт каждый день в 00:00:
~~~
0 0 * * * [путь папки сайта]core/components/catalogfill/cron.php 2 default example1.xls
~~~

~~~
* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 6) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)
~~~

---

При необходимости добавить в файл ``.htaccess`` (сервер Apache) строки, чтобы снять ограничения:

php_value memory_limit 128M
php_value upload_max_filesize 15M
php_value post_max_size 15M
php_value max_input_time 1200
php_value max_execution_time 1200
steve.kon
27 июня 2022, 13:12
0
Спасибо большое! Помогло, скрипт выполнился без ошибок.

… вот только webp изображений почему-то не создал… Может в этих версиях еще не было его поддержки? (MODX Revolution 2.7.1-pl + miniShop2 2.5.0-pl)?
vectorserver
27 июня 2022, 12:20
0
Продавай по штучно товар 288,8 шт, а визуально показывай получившейся объем!

Я клиенту делал так (скрин), по сути товар это одна единица (1 доска)
Человек к примеру вбирает к примеру 8 м3 длинна X, ширина Y, в корзину упало 2,315 досок.

Pavel
27 июня 2022, 10:11
0
у меня внутри шаблона другое написание, я немного переделал
Правильно сделал? В таком варианте такое ощущение что условие WHERE не работает
[[pdoResources?
    &tpl=`asideNewsElement`
    &showHidden=`1`
    &includeTVs=`img,relatedProducts`
    &limit=`3`
    &parents=`62`
    &showLog=`1`
    &where=`{'relatedProducts:LIKE':'%[[*id]]%'}`
]]
И как сделать чтоб ваш вариант у меня в шаблонах работал?
vectorserver
26 июня 2022, 22:03
1
+2
Напиши в лс, помогу