modResourceField. Упрощаем работу с TV часть 2.
Не так давно Сергей Шлоков написал статью Упрощаем работу с TV. Видно, что технология эта вызвала интерес у общественности, но данная реализация имеет очень много подводных камней. Сам я это все копаю уже очень давно, не фуллтайм, но сталкивался. В результате на свет появились две довольно объемные заметки (раз и два). Если кто не поленится прочитать, думаю, сможет представить, сколько много тонкостей там имеется. С некоторыми из них Сергей в процессе столкнулся. Но это не все еще имеющиеся проблемы. Попробую перечислить основные.
Необходимость задачать разные имена колонок и ТВшек.
Это Сергей у себя в топике описывал, не буду вдаваться в подробности.
Дублирование значений в виде ненужных запией в таблицу ТВшек.
Гвоздь (сорри, не знаю имени), написал в комментарии про эту проблему и привел плагин, решающий ее, но на это никто не отреагировал (видимо, мало кого заинтересовало решение, в несколько раз превосходящее по объему предложенный продукт).
Отсутствие целостности данных
Если не очищать значения ТВшек, то у нас сильно ограничивается использование MODX API. К примеру, у вас есть метод $resource->set('myColumn', $value) (которое обновит значение колонки ресурса), а есть метод $resource->setTVValue('myColumn', $value) (которое обновит значение в ТВшке). Вот они друг с другом не связаны вообще, и если изменить значение в одном месте, то в другом оно не меняется, и можно изменить значение поля самого ресурса, но зайдя потом в редактор документа, получить совершенно другое не актуальное значение.
Собственно, эта проблема так же решалась опубликованным Гвоздем плагином (так как там в редакторе документа в ТВшки подставлялись именно значения из самого ресурса).
Ломающаяся логика обновления объектов
Плагин (и мой тоже так делал), уже после того, как объект документа сохраняется, обновляет объект и сразу же записывает его в базу данных. Это на самом деле совсем не круто. К примеру, мы не можем выполнить валидацию объекта еще до сохранения и прервать процесс с корректной ошибкой, если вдруг что-то не так. Чтобы это корректно работало, надо чтобы уже в процессор обновления документа передавались значения для его расширенных полей, и тогда, к примеру, в процессе можно выполнить вот такое:
Сам по себе компонент совсем не большой, но это 10 часов напряженной умственной работы (слишком много пришлось переворошить в самом MODX-е, чтобы добиться наилучшей совместимости).
В нем два основных элемента:
1. Кастомная ТВшка, которая дергает значение из самого документа и выводит его в редакторе документов.
2. Плагин, который во-первых, подключает эту ТВшку, а во-вторых, решает проблему с затиранием значения документа из-за совпадения имен колонки и ТВшки.
Пока что кастомная ТВшка только типа textfield, но позже появятся различные типы ТВшек, в том числе расширяющие любые другие ТВшки. Но это — не большая проблема. Главное — теперь это действительно просто работает и довольно универсально. Как добавлять свои кастомные поля — это тема прошлых топиков, я ее повторно раскрывать не буду (способов несколько, пусть каждый выбирает наиболее понравившийся). После того, как колонка добавлена в ресурс, мапа расширена и поле есть у документа, достаточно просто создать новую ТВшку для него с этим названием. joxi.ru/Dr8Ke8OIkkJ9qA
Далее все как с обычными ТВшками (кроме возможности использовать метод $resource->getTVValue(), так как значения не в ТВ, а в самом документе находятся).
Что особенно приятно — можно даже использовать стандартные теги, и даже с модификаторами, например [[*weight:my_snippet]]. Можно и в смарти/феном не заморачиваться {$modx->resource->weight}. И можно в любом месте API использовать $modx->resource->set('weight')/$modx->resource->get('weight'); Само собой все нативно для плагинов, процессоров и т.д. и т.п. В общем, лично я пакетом очень доволен :)
Так как команда у нас расширилась и мы теперь выходим на более широкий рынок, с большой долей вероятности мы начнем выпускать платные пакеты не только под наши технологии, и планируем их постить в modstore.pro
Если кому понравится мой пакет и захочет отблагодарить, может купить modResourceField там за 300 рублей (ждем модерации). По правилам modstore покупка пакета — это в том числе и право на поддержку автора компонента. Но скачать его можно и бесплатно в официальном или нашем репозитории.
UPD: Пакет появился и в modstore.pro
Необходимость задачать разные имена колонок и ТВшек.
Это Сергей у себя в топике описывал, не буду вдаваться в подробности.
Дублирование значений в виде ненужных запией в таблицу ТВшек.
Гвоздь (сорри, не знаю имени), написал в комментарии про эту проблему и привел плагин, решающий ее, но на это никто не отреагировал (видимо, мало кого заинтересовало решение, в несколько раз превосходящее по объему предложенный продукт).
Отсутствие целостности данных
Если не очищать значения ТВшек, то у нас сильно ограничивается использование MODX API. К примеру, у вас есть метод $resource->set('myColumn', $value) (которое обновит значение колонки ресурса), а есть метод $resource->setTVValue('myColumn', $value) (которое обновит значение в ТВшке). Вот они друг с другом не связаны вообще, и если изменить значение в одном месте, то в другом оно не меняется, и можно изменить значение поля самого ресурса, но зайдя потом в редактор документа, получить совершенно другое не актуальное значение.
Собственно, эта проблема так же решалась опубликованным Гвоздем плагином (так как там в редакторе документа в ТВшки подставлялись именно значения из самого ресурса).
Ломающаяся логика обновления объектов
Плагин (и мой тоже так делал), уже после того, как объект документа сохраняется, обновляет объект и сразу же записывает его в базу данных. Это на самом деле совсем не круто. К примеру, мы не можем выполнить валидацию объекта еще до сохранения и прервать процесс с корректной ошибкой, если вдруг что-то не так. Чтобы это корректно работало, надо чтобы уже в процессор обновления документа передавались значения для его расширенных полей, и тогда, к примеру, в процессе можно выполнить вот такое:
function beforeSave(){
if(!$this->object->get('myColumn')){
return 'Это поле не может быть пустым';
}
return parent::beforeSave();
}Есть еще довольно много проблем, но и так достаточно. В общем, так или иначе, в таком виде технология интересная, но мало годится для практического применения. Я над этими проблемами думал уже давно, и вот тут так сложилось, что мне понадобилось ее таки довести до ума. Не буду грузить техническими тонкостями реализации (и сложностями, с которыми довелось столкнуться), но на выходе таки получился компонент, решающий практически все перечисленные (и не только перечисленные) проблемы — modResourceField.Сам по себе компонент совсем не большой, но это 10 часов напряженной умственной работы (слишком много пришлось переворошить в самом MODX-е, чтобы добиться наилучшей совместимости).
В нем два основных элемента:
1. Кастомная ТВшка, которая дергает значение из самого документа и выводит его в редакторе документов.
2. Плагин, который во-первых, подключает эту ТВшку, а во-вторых, решает проблему с затиранием значения документа из-за совпадения имен колонки и ТВшки.
Пока что кастомная ТВшка только типа textfield, но позже появятся различные типы ТВшек, в том числе расширяющие любые другие ТВшки. Но это — не большая проблема. Главное — теперь это действительно просто работает и довольно универсально. Как добавлять свои кастомные поля — это тема прошлых топиков, я ее повторно раскрывать не буду (способов несколько, пусть каждый выбирает наиболее понравившийся). После того, как колонка добавлена в ресурс, мапа расширена и поле есть у документа, достаточно просто создать новую ТВшку для него с этим названием. joxi.ru/Dr8Ke8OIkkJ9qA
Далее все как с обычными ТВшками (кроме возможности использовать метод $resource->getTVValue(), так как значения не в ТВ, а в самом документе находятся).
Что особенно приятно — можно даже использовать стандартные теги, и даже с модификаторами, например [[*weight:my_snippet]]. Можно и в смарти/феном не заморачиваться {$modx->resource->weight}. И можно в любом месте API использовать $modx->resource->set('weight')/$modx->resource->get('weight'); Само собой все нативно для плагинов, процессоров и т.д. и т.п. В общем, лично я пакетом очень доволен :)
Так как команда у нас расширилась и мы теперь выходим на более широкий рынок, с большой долей вероятности мы начнем выпускать платные пакеты не только под наши технологии, и планируем их постить в modstore.pro
Если кому понравится мой пакет и захочет отблагодарить, может купить modResourceField там за 300 рублей (ждем модерации). По правилам modstore покупка пакета — это в том числе и право на поддержку автора компонента. Но скачать его можно и бесплатно в официальном или нашем репозитории.
UPD: Пакет появился и в modstore.pro
Комментарии: 13
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Искренне рад, что ваши дополнения появятся в modstore.
Fi1osofFi1osofFi1osofДля пакета использовалась давняя заготовка: github.com/MODX-Club/MODX_SamplePackage
Еще есть видеоурок по нему www.youtube.com/watch?v=etZlcKVKOS4
Видео старое и немного не актуальное (так как заготовка была переработана Сергеем Прохоровым), но лучше, чем ничего.
Fi1osofFi1osofНет, пока только текстовый тип поддерживается. Мне его хватает, а на развитие пока народ не спонсирует.
UPD: сегодня вот на modMonitor дополнительно проспонсировали, вот его обновленная версия интересная выйдет в воскресенье.
Fi1osofFi1osof