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.
Искренне рад, что ваши дополнения появятся в modstore.
Постараюсь, чтобы их было побольше и они были полезными :)
Тоже жду! Спасибо, Николай! Изящный компонент, в плане реализации. Вот сижу — изучаю. Рад, что есть исходники папки _build. Во многом отличается от заготовки Василия — modExtra. Интересно сравнить одно с другим.
Не за что!
Для пакета использовалась давняя заготовка: github.com/MODX-Club/MODX_SamplePackage
Еще есть видеоурок по нему www.youtube.com/watch?v=etZlcKVKOS4
Видео старое и немного не актуальное (так как заготовка была переработана Сергеем Прохоровым), но лучше, чем ничего.
Для пакета использовалась давняя заготовка: github.com/MODX-Club/MODX_SamplePackage
Еще есть видеоурок по нему www.youtube.com/watch?v=etZlcKVKOS4
Видео старое и немного не актуальное (так как заготовка была переработана Сергеем Прохоровым), но лучше, чем ничего.
Если не затруднит скиньте ссылку на топики как добавить кастомные поля. Спасибо
Кастомные поля вы создаете через тот же phpMyAdmin, вручную. Главное потом — расширить мета-данные класса. Простейший способ описан здесь.
Николай, привет! В топике написано, что modResourceField работает только с ТВ типа «Текстовое поле». Как обстоит дело на сегодняшний момент? Поддерживает ли дополнение поле «Множественный выбор»???
Иван, привет!
Нет, пока только текстовый тип поддерживается. Мне его хватает, а на развитие пока народ не спонсирует.
UPD: сегодня вот на modMonitor дополнительно проспонсировали, вот его обновленная версия интересная выйдет в воскресенье.
Нет, пока только текстовый тип поддерживается. Мне его хватает, а на развитие пока народ не спонсирует.
UPD: сегодня вот на modMonitor дополнительно проспонсировали, вот его обновленная версия интересная выйдет в воскресенье.
Жаль. Мне нужен именно множественный выбор. Сколько будет стоить добавление поля «Множественный выбор»?
А что, Migx/Migx DB тебе не подходит? Или тебе важно именно хранить данные эти в допколонке самой таблицы документа? Множественный выбор хранить в одной записи не круто, потом ни выборки нормальные сделать, ничего. Можно только будет получить данные на уровне самого php.
Спасибо за совет! Прикину, и если что — напишу.
Не за что!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.