Тип контента - кастомное поле - дополнительные значения

InstantCMS 2.X
#1 17 октября 2017 в 19:52
Привет всем) разбираюсь с типом контента помогите пожалуйста, подскажите как правильно сделать и правильно ли я сделал то что уже сделал.
Сделал кастомное поле — "Имя сайта", грубо говоря это текстовое поле.
Сделал в админке новый тип контента "Каталог сайтов". В типе добавил мое кастомное поле — Имя сайта.

У кастомного поля кроме имени должны быть дополнительные параметры. К примеру это ТИЦ.
Для этого я сделал отдельную табличку site_params, в ней сделал столбцы
id — автоинкрементное
id_item_content — ИД записи контента что бы связать контент и дополнительные параметры
tic — собственно значение ТИЦ
так же я добавил контроллер site, там модель для работы с таблицей site_params ну и бекэенд будет… в нем будут настройки компонента.

ТИЦ определяется автоматически при добавлении сайта и периодически будет обновляться.
Поиск в этом контенте буду делать с помощью стандартных средств и если будут задаваться параметры ТИЦ то будут использовать left join

ну собственно вопрос… правильно ли я делаю..
вроде я где то натыкался на статью как делать для типа контента свою модель… а не добавлять отдельный компонент и пользоваться его моделью… но могу ошибаться)
ну и если есть где то инфа для разработчиков касаемая типов контента — киньте ссылкой пожалуйста…
наколхозить можно все что угодно… но вдруг тут есть уже то что мне нужно)) а я велосипед свой делаю))

Спасибо.
#2 17 октября 2017 в 20:36
У вас в типе контента "Каталог сайтов" в одной записи будет "стотыщьпитсот" сайтов или одна запись в типе контента об одном сайте?
Если одна запись об одном сайте, то достаточно вывести в одном стандартном поле "Имя сайта", в другом стандартном поле вывести "тИЦ", в третьем стандартном поле вывести ещё что-то и т.д. А для заполнения "тИЦ" написать хук в вашем контроллере (content_before_add, content_after_add).

не добавлять отдельный компонент и пользоваться его моделью

kaktus
Модель привязана к контроллеру, вы можете связать один тип контента со своим компонентом, но модель без компонента не сработает.
#3 17 октября 2017 в 21:04

У вас в типе контента "Каталог сайтов" в одной записи будет "стотыщьпитсот" сайтов или одна запись в типе контента об одном сайте?
Если одна запись об одном сайте, то достаточно вывести в одном стандартном поле "Имя сайта", в другом стандартном поле вывести "тИЦ", в третьем стандартном поле вывести ещё что-то и т.д.

Loadырь
в одной записи — один сайт…
я как то решил что отдельной табличкой в которой будут параметры будет проще… а Ваш вариант действительно интересен… только не очень понял как это работает..

А для заполнения "тИЦ" написать хук в вашем контроллере (content_before_add, content_after_add).

вот кстати насчет контроллера…
1. Я создал тип контента "Каталог сайтов"
2. Создал в нем два кастомных поля
2.1. Имя сайта текстовое поле
2.2. Тиц — числовое поле… там есть такое, плюс там есть поиск по диапазону…
3. Сделал контролер, в манифесте повесил хук который при сохранении контента будет вычислять тиц исходя из параметров поля "Имя сайта", я так понял это общий хук content_before_add для любого контента, надо будет вычислять где там мой контент добавляется… и когда вычислим то считать.

правильно?)
Спасибо)
#4 17 октября 2017 в 21:05

Модель привязана к контроллеру, вы можете связать один тип контента со своим компонентом, но модель без компонента не сработает.

Loadырь
а как связываеться?
#5 17 октября 2017 в 21:37

я так понял это общий хук content_before_add для любого контента

kaktus
Да, это общий хук, но есть и такие content_имятипаконтента_before_add.

только не очень понял как это работает..

kaktus
Если поле ТИЦ не заполняется вручную, его можно сделать скрытым с доступом для определённой группы или заморочиться с виртуальным полем.

а как связываеться?

kaktus
Имел в виду, что папку контроллера всё равно надо делать для своей модели.
#6 19 октября 2017 в 10:09
у меня еще вопрос, с помощью хука я навесил все что мне надо, вычисляется ТИЦ, количество в индексе страниц и т.п.
а вот если указали не правильный адрес сайта — то ничего не вычисляется естественно..
но не могу найти как в этом случае отказать в сохранении контента и вывести ошибку…
подскажите пожалуйста..
Спасибо.
#7 19 октября 2017 в 17:11
kaktus, валидацию поля лучше делать не в хуке, а в контроллере.

Вспомнил, есть и такой хук
  1. list($item, $errors) = cmsEventsManager::hook('content_validate', array($item, $errors));
#8 20 октября 2017 в 16:30
а как сделать валидацию в контроллере если он по сути то не связан с типом контента? мне надо перед сохранение перехватить приложение и сказать что валидация не пройдена потому что сайт не найден в инете…
не совсем понял как этим хуком воспользоваться что Вы подсказали..
спасибо…
#9 22 октября 2017 в 08:46

не совсем понял как этим хуком воспользоваться что Вы подсказали

kaktus
Принцип такой: создаёте хук в своём контроллере, по $item['ctype_name'] и $item['id'] получаете поля
  1. $fields = cmsCore::getModel('content')->getContentFields($item['ctype_name'], $item['id']);
дальше проверяете в цикле наличие вашего поля — если нет возврщаете что пришло, если есть валидируете поле. Причём метод валидатора может быть во фронтенде вашего контроллера.
если проверка прошла возвращаете, что получили, если не прошла — в $errors добавляете
  1. $errors['название_поля']='Не угадал';
Не точно, но как-то так.
#10 3 ноября 2017 в 12:30
Люди-человеки, добавьте чуточку кармы уважаемому Кактусу на бложик: есть подозрение, ему будет чего написать )
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.