Автоматическое формирование поля контента на основе значений других полей по шаблону

InstantCMS 2.X

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

#1 6 ноября 2022 в 15:26

На базе InstantCMS 2.15.2 создается база социального служения, которая будет в помощь тем, кто помогает разным категориям нуждающихся людей. При наполнении пользователями базы типовыми объектами вида «Благотворительная столовая» или «Пункт раздачи одежды» приходится  вручную вводить это название в заголовок, а также добавлять в скобках название храма с городом (при котором эти столовые или пункты раздачи находятся). Чтобы в итоге у нас получались уникальные заголовки карточек. При этом поле «Храм (город)» заполняется пользователем в форме. Выбирается наименование конкретного храма из связанного родительского контента (parent_hram_id).

Хотелось бы иметь возможность, заполняя основные поля контента, поле заголовок (title) получать автоматически путем соединения значений уже введенных полей по определенному шаблону.

В моих примерах это «Благотворительная столовая» & "(" & [заголовок связанного храма] & ")" или  «Пункт раздачи одежды» & "(" & [заголовок связанного храма] & ")". При этом  наименования «Благотворительная столовая» и «Пункт раздачи одежды» совпадают с названием категорий, где создается данный контент. Т.е. title мог бы формироваться полностью по шаблону: [название выбранной категории] & "(" & [заголовок связанного храма] & ")" .

Ситуации с наименованием могут быть совершенно разные. Где-то нужно даже использовать значение, которое введет пользователь в само поле заголовок (title). Но все значения для формирования title могут быть или значениями полей данного контента, введенными в форму (включая значения свойств этого контента) или доступны по связям. Например, название текущей категории. Или имя родительского связанного контента.

Пример карточки храма со связанными учреждениями на тестовом сайте.

Я понимаю, что задача получается довольно объемная. И за просто так, наверное, никто не возьмется за нее. Я пока обошелся бы самостоятельной правкой кода системы, просто вписав в $item['title'] значения нужных полей из редактируемой формы в зависимости от id редактируемого контента. Это хотя бы  позволило облегчить пользователям ввод сотен типовых столовых, пунктов раздачи одежды. Но без без вашей коллективной помощи мне будет сделать это весьма трудно. Буду благодарен за любые подсказки!

Я правильно понял, что нужно править два actions для content: item_add.php и item_edit.php?

Где-то в конце после проверки формы на ошибки.

 if (!$errors){.....

и перед  return $this->cms_template->render('item_form', [.........

Нужно проверять id контента, а также категорию и в зависимости от этих значений что-то такое формировать в $item['title'] 

Вот бы еще значения родительских полей суметь получить...

Или более правильно писать что-то типа хука? А как в хуке будут доступны нужные мне значения? Для меня этот путь пока совсем не понятен.

Пока есть только опыт небольшой правки actions register.php, чтобы при регистрации пользователя поле nickname формировалось из нескольких других полей формы.

  1. .......
  2. if(!isset($user['nickname'])){
  3. // $user['nickname'] = strstr($user['email'], '@', true);
  4. if (!strcmp($fields['san']['handler']->setItem($user)->parse( $user['san'] ),"мирянин")) $user['nickname'] = $user['name'].' '.$user['surname']; // (c)MNN 2022-10-21
  5. else $user['nickname'] = $fields['san']['handler']->setItem($user)->parse( $user['san'] ).' '.$user['name'].' '.$user['surname']; // (c)MNN 2022-10-21
  6.  
#2 6 ноября 2022 в 16:40

Хотелось бы иметь возможность, заполняя основные поля контента, поле заголовок (title) получать автоматически путем соединения значений уже введенных полей по определенному шаблону.

bestit

Так есть же уже всё...

docs.instantcms.ru/manual/settings/seo-patterns

Для типа контента, в «SEO для записей» создаете нужный шаблон (по документации), и будет title для записи на основе нескольких полей...

Добавлено спустя 4 минуты

Если же имелось в виду не title, а именно заголовок записи (h1) тогда другой вопрос...

#3 6 ноября 2022 в 17:40

Если же имелось в виду не title, а именно заголовок записи (h1) тогда другой вопрос...

RSN

Да, да именно заголовок записи. Поле, которое хранится в БД в поле 'titile'  в таблице каждого контента.

#4 6 ноября 2022 в 17:51

Да, да именно заголовок записи. Поле, которое хранится в БД в поле 'titile'  в таблице каждого контента.

bestit

Можно генерировать и его, но придется в БД изменить тип поля заголовка с caption на seostring и использовать это поле:

Пример — nifigasse.ru/doc/sysoljatin-svjatoslav-pavlovich-chelyustno-licevoi-hirurg.html — ФИО добавляется отдельно, специализация отдельно.

Стоит уточнить, что работает с полями, насчет свойств не уверен.

#5 7 ноября 2022 в 15:16

Можно генерировать и его, но придется в БД изменить тип поля заголовка с caption на seostring и использовать это поле:

Нифигаccе о-го-гошеньки

Спасибо. Но не хотелось бы править систему через БД, ставить новое поле, потом что-то делать с его стилями. Ведь штатное поле title есть и настроено для всех типов контента. В идеале, хотелось бы иметь системную возможность гибкого расширенного управлениями полями. Не только заголовком. Вот, например, виртуальные поля придумали.

Системные action контента тоже не хочется ломать. Обновлять систему станет сложнее. Пока, как-нибудь, может быть через свой хук, можете что-то посоветовать?

#6 7 ноября 2022 в 15:30

не хотелось бы править систему через БД, ставить новое поле, потом что-то делать с его стилями. Ведь штатное поле title есть и настроено для всех типов контента

bestit

Вам и не придется ничего делать со стилями. Да и правка в БД минимальная и делается один раз. Надо в таблице cms_con_типконтента_fields заменить у поля заголовка в столбце type тип caption на seostring. Ну и добавить дополнительное поле в админке, например, name, куда вы будете вводить название приюта или столовой. А поле title вы не сможете заполнять при создании и редактировании записи, так как оно будет генерироваться автоматически из значений других полей. При этом на сайте оно будет выводиться так же, как и сейчас. Но дело ваше, конечно)) Можно хотеть, а можно делать — выбирайте сами.

#7 26 октября 2023 в 21:11

не хотелось бы править систему через БД, ставить новое поле, потом что-то делать с его стилями. Ведь штатное поле title есть и настроено для всех типов контента

bestit

Вам и не придется ничего делать со стилями. Да и правка в БД минимальная и делается один раз. Надо в таблице cms_con_типконтента_fields заменить у поля заголовка в столбце type тип caption на seostring. Ну и добавить дополнительное поле в админке, например, name, куда вы будете вводить название приюта или столовой. А поле title вы не сможете заполнять при создании и редактировании записи, так как оно будет генерироваться автоматически из значений других полей. При этом на сайте оно будет выводиться так же, как и сейчас. Но дело ваше, конечно)) Можно хотеть, а можно делать — выбирайте сами.

&$!#%

Подниму тему. Сделал нужные изменения в БД, но вместо заголовка выводится просто цифра 1. При этом URL формируется так, так будто заголовок является seo-полем и получает нужные данные с других полей. Не подскажите в чем может быть причина? Спасибо.

#8 27 октября 2023 в 07:13

но вместо заголовка выводится просто цифра 1

Ostrova

Может быть надо выводить кэш, типа {поле_cache}...

Вот здесь есть о паттернах:

docs.instantcms.ru/manual/settings/seo-patterns

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.