modResourceField. Упрощаем работу с TV часть 2.

Не так давно Сергей Шлоков написал статью Упрощаем работу с TV. Видно, что технология эта вызвала интерес у общественности, но данная реализация имеет очень много подводных камней. Сам я это все копаю уже очень давно, не фуллтайм, но сталкивался. В результате на свет появились две довольно объемные заметки (раз и два). Если кто не поленится прочитать, думаю, сможет представить, сколько много тонкостей там имеется. С некоторыми из них Сергей в процессе столкнулся. Но это не все еще имеющиеся проблемы. Попробую перечислить основные.

Необходимость задачать разные имена колонок и ТВшек.
Это Сергей у себя в топике описывал, не буду вдаваться в подробности.

Дублирование значений в виде ненужных запией в таблицу ТВшек.
Гвоздь (сорри, не знаю имени), написал в комментарии про эту проблему и привел плагин, решающий ее, но на это никто не отреагировал (видимо, мало кого заинтересовало решение, в несколько раз превосходящее по объему предложенный продукт).

Отсутствие целостности данных
Если не очищать значения ТВшек, то у нас сильно ограничивается использование 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
Fi1osof
08 декабря 2015, 15:28
modx.pro
12
3 333
+13

Комментарии: 13

Максим Кузнецов
08 декабря 2015, 19:49
+2
Класс) Жду в магазине.
Искренне рад, что ваши дополнения появятся в modstore.
    Fi1osof
    08 декабря 2015, 19:51
    +3
    Постараюсь, чтобы их было побольше и они были полезными :)
      Fi1osof
      09 декабря 2015, 21:40
      0
      Павел Гвоздь
      08 декабря 2015, 20:06
      +2
      Тоже жду! Спасибо, Николай! Изящный компонент, в плане реализации. Вот сижу — изучаю. Рад, что есть исходники папки _build. Во многом отличается от заготовки Василия — modExtra. Интересно сравнить одно с другим.
        Fi1osof
        08 декабря 2015, 20:13
        1
        +2
        Не за что!

        Для пакета использовалась давняя заготовка: github.com/MODX-Club/MODX_SamplePackage
        Еще есть видеоурок по нему www.youtube.com/watch?v=etZlcKVKOS4
        Видео старое и немного не актуальное (так как заготовка была переработана Сергеем Прохоровым), но лучше, чем ничего.
        v2254303
        09 декабря 2015, 21:12
        0
        Если не затруднит скиньте ссылку на топики как добавить кастомные поля. Спасибо
          Fi1osof
          09 декабря 2015, 21:39
          0
          Кастомные поля вы создаете через тот же phpMyAdmin, вручную. Главное потом — расширить мета-данные класса. Простейший способ описан здесь.
          Иван Бондаренко
          11 мая 2017, 14:21
          0
          Николай, привет! В топике написано, что modResourceField работает только с ТВ типа «Текстовое поле». Как обстоит дело на сегодняшний момент? Поддерживает ли дополнение поле «Множественный выбор»???
            Fi1osof
            11 мая 2017, 14:40
            0
            Иван, привет!

            Нет, пока только текстовый тип поддерживается. Мне его хватает, а на развитие пока народ не спонсирует.
            UPD: сегодня вот на modMonitor дополнительно проспонсировали, вот его обновленная версия интересная выйдет в воскресенье.
              Иван Бондаренко
              11 мая 2017, 14:43
              0
              Жаль. Мне нужен именно множественный выбор. Сколько будет стоить добавление поля «Множественный выбор»?
                Fi1osof
                11 мая 2017, 14:46
                0
                А что, Migx/Migx DB тебе не подходит? Или тебе важно именно хранить данные эти в допколонке самой таблицы документа? Множественный выбор хранить в одной записи не круто, потом ни выборки нормальные сделать, ничего. Можно только будет получить данные на уровне самого php.
                  Иван Бондаренко
                  11 мая 2017, 14:58
                  0
                  Спасибо за совет! Прикину, и если что — напишу.
                    Fi1osof
                    11 мая 2017, 15:09
                    0
                    Не за что!
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            13