Поле - позиция для виджетов. Выводим виджеты в теле записи 2.X

3273
Всем привет.

Однажды появилась необходимость вывести виджет в поле, чтобы можно было показать его в любом месте записи. Долгое время я искал разработчика, кто бы смог реализовать подобное, но все мои усилия были напрасны. И вот несколько недель назад у меня появилась мысль, что было бы неплохо сделать это поле самому. Однако недостаточное количество знаний php привело меня к тому, что я чуть было не забил на эту идею. На помощь пришел Val, за что ему огромное спасибо! В общем, всё получилось.

Конечно, этот вариант не самый идеальный, но работает! И это главное! Если найдутся те, кто сможет усовершенствовать данное решение, вплоть до того, чтобы выбор виджетов производился прямо при создании поля, думаю, сообщество будет этому человеку весьма благодарно.

А пока выкладываю то, что есть (тестировалось на 2.6.1).

1. Скачайте архив и загрузите файлы на сервер.
2. В настройках типа контента выберите Поля и создайте новое поле "Виджет в теле записи".
3. В настройках поля нужно заполнить 2 поля (простите за тавтологию) - указать название позиции виджетов и предустановленное значение. Название позиции должно быть латиницей, предустановленное значение - продублируйте название позиции или укажите любое другое значение.
Поле - позиция для виджетов. Выводим виджеты в теле записи

Поле - позиция для виджетов. Выводим виджеты в теле записи

4. Откройте файл scheme.html и в самом низу добавьте такой код:
Код HTML:
  1. <tr><td class="filled">Позиция виджетов для вывода в поле виджета</td></tr>
  2. <tr><td>{position:[b]field-widgets[/b]}</td></tr>
field-widgets - это название позиции, которое Вы указали на предыдущем шаге, может быть любым.

Дальше всё просто - в админке на странице "Виджеты" в новую позицию вставляете любые виджеты, которые будут выводиться в теле записи данного типа контента.

Минусы данного решения: виджет рендерится 2 раза! Один раз - в нашем поле, и второй раз - вместе со всеми остальными виджетами. Но не выводится с остальными потому, что в шаблоне мы не прописывали, куда выводить нашу позицию. Из-за этого может быть повышенная нагрузка. Также костыльный метод с применением ReflectionClass для доступа к protected свойству.

Еще раз хочу поблагодарить пользователя Val, без его помощи ничего бы не получилось. Вернее, практически весь код - это его работа. Моя была только идея.

Спасибо можете сказать здесь. Нет, не за поле, за этот супер-движок! Надеюсь, разработчики InstantCMS не будут против))
Добавляем картинку в поле навигации
Комментарии (26)
GoodMade.ru 15 января 2017 в 18:45 0
Который раз уже замечанию. Я предлагаю решение а только потом, через год или два появляется что-то похожее. В своём решении я предлагал два варианта вывода, по маске в {widget:заголовок} и через выбор виджета из списка, и вывод через поле.
чебурек дохлэй мыш 15 января 2017 в 19:01 +3
Возможно так и есть. Но я не слежу за Вами и Вашими разработками, а тем более предложениями. Возможно, если бы то, о чем Вы говорите, попалось мне на глаза, этой записи в блоге бы не было.
GoodMade.ru 15 января 2017 в 19:18 0
Да вы и вправе, и нужно предлагать своё решение, не в вашем посте дело. Вы просто упоминали о том, что искали.
чебурек дохлэй мыш 15 января 2017 в 19:24 0
Простите, но если бы заголовок Вашего поста был понятен, то нашел бы возможно)) Кстати, дополнение удалено. Почему?
GoodMade.ru 15 января 2017 в 19:27 0
Ну вот вам ещё понятнее Ссылка.
Не успевал за обновлениями, вот и удалил.Сейчас использую в своих дополнениях. Например в соцсетях.
чебурек дохлэй мыш 15 января 2017 в 19:33 0
Первый вариант больше похож на то, что было нужно, но уж очень сложное название)) А нужно было именно ПОЛЕ. В любом случае, кому нужно, воспользуется этим решением, а кому нет - воспользуется другим, например, Вашим.
GoodMade.ru 15 января 2017 в 19:37 0
А в общем и моя тогдашняя неопытность не дала реализовать это так, как следовало бы. Сейчас я бы создал отдельную таблицу для записи в неё настроек и функцию добавления и настройки виджета прямо при редактировании статьи. Но попутно появляется ещё идея, которую без привязки к шаблону лучше не делать. Скоро покажу на примере своего базового шаблона.
vikont 15 января 2017 в 22:57 +1
Всему виной ваше броуновское движение в разработках!
Как результат, недоделанные разработки, брошенные клиенты, недоверие... А теперь, как видите, то один то другой создает тоже самое и часто с более лучшим решением....
GoodMade.ru 16 января 2017 в 17:36 0
Смысл в другом. Не логичнее ли и не продуктивнее ли, поддерживать и развивать уже готовое решение а не плодить разного рода альтернативы готового решения.
Владимир 17 января 2017 в 01:00 0
Денис Васильевич, вы извините, что как говорится вклиниваюсь в ваш разговор, но вот вы обещаете развивать уже готовые решения, что в общем, логично и правильно и все, в том числе и я только ЗА. Здесь же вы, пишите конкретно по соцсетям
Сейчас использую в своих дополнениях. Например в соцсетях.
. Я уже раньше просил вас разобраться с вышеупомянутым компонентом, но эта просьба переросла в противостояние и утверждение типа "сам дурак" с вашей стороны. В результате вы без уведомления просто удалили ту тему с форума, видимо считая её антирекламой вашей работе (в этом смысле вы по своему правы, да и я был бы не против такого решения, но если б вы после этого уведомили меня, было бы лучше продолжить отшлифовку дополнения в другом месте). Далее вы объявили о доработках всех ваших недочетов и приведения своих работ в надлежащий вид, - я подождал. Но компонент соцсети до сих пор содержит недочеты. В частности в разделе "поделиться" содержится (до сих пор) как минимум 3 досадные грамматические и 2 технические ошибки (не правильно формируются ссылки для письма-уведомления). Пользуясь случаем, хочу вас попросить, как говорится, в ключе ваших добрых намерений, изложенных в том числе постом выше, на который отвечаю, поправить это недоразумение и исправить описанные ошибки.
GoodMade.ru 17 января 2017 в 14:51 0
О недочётах нужно писать на странице дополнения у меня на сайте или писать на мне email. Тема была удалена не из за вас а из за других постов не по теме.
Владимир 19 января 2017 в 00:40 0
Написал на странице дополнения вашего сайта.
GoodMade.ru 19 января 2017 в 14:28 0
Это нужно чтобы я не забыл. По хорошему это нужно писать во кладке Замечания. И отмечать запись после правок по ней. Доделаю шаблон, обязательно добавлю такой функционал к вкладками.
чебурек дохлэй мыш 17 января 2017 в 16:00 0
Не понял ничего. Кто, по-Вашему, должен поддерживать и развивать Ваши готовые решения? Можно подробнее?
чебурек дохлэй мыш 17 января 2017 в 16:02 0
Денис Васильевич:
Смысл в другом. Не логичнее ли и не продуктивнее ли, поддерживать и развивать уже готовое решение а не плодить разного рода альтернативы готового решения.

Не понял ничего. Кто, по-Вашему, должен поддерживать и развивать Ваши готовые решения? Можно подробнее?
GoodMade.ru 17 января 2017 в 20:26 0
А консолидации речь, или как оно там называется. Суть в том что, я готов делиться своими разработками и поддерживать их бесплатно только на одном энтузиазме но поддерживаемом интересом к энной разработке. Но это в прошлом, теперь все силы буду тратить на свою сборку, там и смогу проявить своё стремление. Загроем эту тему, я не ради базара об этом упоминал и тем более не пытался затеть вас.
Shuma 21 января 2017 в 18:04 +1
Была необходимость вывода виджета на странице пользователя в виде поля. Обратился с вопросом. Ответ не получил. Думаю многие с этим сталкивались.
vikont 15 января 2017 в 23:07 0
Заявление "Выводим виджеты в любом месте записи" более чем опрометчиво! Поле - жестко привязанная конструкция. Где сделан вывод поля там и появится выиджет - не более того.
У Дениса Васильевича действительно аналогичное решение, но он уже год ничего не обновляет и дополнения выходят из строя.

В любом случае, спасибо, что взяли на себя смелость и смогли реализовать. И Val-у спасибо, за поддержку живых идей.
чебурек дохлэй мыш 21 января 2017 в 19:43 0
взяли на себя смелость и смогли реализовать
Я в самом начале написал, что не смог)) Была идея, но нет знаний. Однако есть хорошие люди. Среди них и Val, который, собственно, всё и сделал. А я лишь опубликовал это здесь с его позволения, вдруг кому-то еще пригодится. А вышло, что как бы я автор. Это не совсем так. Что касается смелости - а страшного то ведь ничего нет в том, чтобы пробовать. Не всё получается, но и риск невелик.
kirkr 16 января 2017 в 05:40 0
А поле для показа рекламы? внутри статьи или просто сверху снизу или по центру?
Просто не понятно что мешало создать дополнительное поле простое в типе контента в разделе поля ?

Просто если структура для всех статей одинаковая, то можно хоть 50 полей стандартно нагенерировать и будет все работать, а не таким костылем.
Владимир 19 января 2017 в 00:46 0
При таком подходе, kirkr , поле придётся заполнять постоянно в каждой записи контента (странице) и даже если заполнить полуавтоматически (предустановленным значением), то потом править трудно при необходимости изменения.
Shuma 21 января 2017 в 18:06 0
Будет ли работать данное решение с полями профиля пользователя?
чебурек дохлэй мыш 21 января 2017 в 19:14 0
Нет, не работает.
Shuma 25 января 2017 в 01:05 -1
И никак невозможно допилить, чтобы была возможность вывода в полях профиля?
чебурек дохлэй мыш 26 января 2017 в 12:30 0
Может и возможно, попробуйте. Если получится, можете поделиться с другими.
Def 6 июля 2019 в 10:19 0
Друзья, подскажите на 2.12.2 работать будет?