Наумов Алексей

Наумов Алексей

Был в сети 28 июля 2026, 14:21
Заказы принимаю
Неа.

Когда мне нужно было так сделать я создал ВСЕ нужные свойства, затем такие же TV, которые назначил шаблонам, как мне нужно, и в плагине при сохранении товара копировал значения из TV в свойства. Весь этот трюк для правильной и быстрой сортировки и фильтрации, ибо делать JOIN множества TV — накладно
Тоже готов скинуться. Но ввиду значительного объема работ и их сроков действительно считаю более разумным сделать поэтапную разработку. Периодическое появление результата будет стимулировать интерес к затее и не позволит ей «затухнуть» в наших умах.
Если своими словами:
1. делаем xml схему
2. На ее основе через migx: а) создаем компонент, б) парсим классы, в) создаем таблицы
3. Так же через migx настраиваем интерфейс, настроек там много, но все делается визуально, он сохраняется как конфигурация
4. создаем TV с типом migxdb, указываем ему id конфигурации с прошлого шага, назначаем шаблону, и создаем ресурс с этим шаблоном

в примере по ссылке выше есть поле resource_id, по нему идет автоматическая привязка записей к текущему ресурсу, я всегда это использовал…

по идее после всего этого при редактировании ресурса будет доступна табличка с вашими записями, которые можно добавлять, удалять, изменять
Мне кажется, что речь шла об «умеренном использовании» TV. Я лично пользуюсь, но в меру стараюсь. Что бы избежать излишнего их количества или сортировки по ним.

К примеру если нужно вывести список в 1000 строк и 20 столбцов, где каждый столбец — TV, будут проблемы, так как у нас 20 джойнов получится.

А если же эти 20 TV выводятся просто на одной странице для одного объекта — разницы в скорости вы не увидите.

В общем с умом подходим к делу.
Ну вот в форме:
<input type="hidden" name="resource_id" value="[[*id]]" />
resource_id — вы ставите id ТЕКУЩЕГО документа, на котором форма расположена

а в сниппете код:

$doc = $modx->getObject('modResource',array('id'=>$hook->getValue('resource_id')));
 
if (empty($doc)){
    $doc = $modx->newObject('modResource');
    $doc->set('createdby', $modx->user->get('id'));
}
else{
    $doc->set('editedby', $modx->user->get('id'));
}
построчно:
найти ресурс, который указан в поле resource_id
если он пустой — то создать новый ресурс
иначе — редактировать существующий.

отсюда и все идет…

кстати, если кто-то умный подменит и установит resource_id = 1, то будет преспокойно менять текст главной страницы вашего сайта =)

а вообще задача для новичка в MODx — сложная
В принципе я тоже согласен с добавлением пары полей.

Придумать можно много чего.
Например смело:
alt, title,tags (или для упрощения я бы назвал это group). Теги предполагают что их может быть несколько через запятую, все это несколько усложняет реализацию, а группа она группа =), одна, без деления запятыми.

Ну и вообще было бы прикольно добавить field1, field2, field3 просто на всякий случай).

И еще замечание, при генерации названия картинки из имени файла стоит сразу удалять расширение файла, а то руками приходится делать это.
Сразу в голову пришло запихнуть куда-нибудь массив вида $sales[$resource_id] = $sale в виде json и проверять новое значение TV с ним.

Или для этих же целей можно использовать:

$prop = $modx->fromJSON($resource->get('properties'));
$old_sale = empty($prop['old_sale']) ? 0 : $prop['old_sale'];

... тут сравниваем скидку с $old_sale
...

$prop['old_sale'] = $resource->getTVValue('sale');

$resource->set('properties', $modx->toJSON($prop')))
$resource->save();


как то так…