[EVO] globalPlaceholders - модуль глобальных плейсхолдеров, tv и настроек.

Всем доброго времени суток.
Мне наконец надоело заниматься заполнением глобальных настроек через базу и разные быстрые решения. Было решено пошустрому собрать модуль + плагин для редактирования статичных данных которые часто раскиданы по чанкам и разным страницам. В общем собрал все в одно место. Настройка может подменять и плейсхолдер и тв. Редактируется удаляется переименуется все из модуля.

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

Модуль работает на версиях 5.2 и выше. В остальном я думаю никаких ограничений нет, но я не ручаюсь т.к. не тестил на других сборках.

Что может модуль:
1) создавать новые настройки в базе system_settings с префиксом global_
2) редактировать эти настройки из модуля.
3) рассовывать настройки по разным группам.
4) присваивать настройкам разные типы редактирования (чекбокс, изображение, файл и т.д.). Селекты как обычно поддерживают стандартный вариант заполнения значений (1||2||3 и 1==имя1||2==имя2). В дальнейшем наполнится возможными типами редактирования.
5) естественно возможность удалять настройки с префиксом global_
6) Есть возможность при помощи плагина подменять [* и [+ на значение настройки. (пример есть настройка global_sitePhone, при выставлении параметров подмены будет доступен в качестве [*sitePhone*] и [+sitePhone+]. Если значение является массивом то доступ к нему как к массиву можно получить через [(sitePhone)]). Удобно если нужно перевести старый проект на этот модуль а вычищать и менять все вызовы тв на вызовы настройки нет желания, как мне :)

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

Что могут плагины
gPHParser:
1) Парсит глобальные настройки с префиксом global_ отчищает их от шелухи и кладет на место уже без префикса.
2) Раскладывает настройки в зависимости от выбранных типов доступности (плейсхолдер — gPH, ТВ — gTV, настройка — по умолчанию всегда)
3) Если включен frontEditor в настройках то оборачивает все текстовые настройки в div для указания что этот текст можно править.

Плагин вызывается по событию onParseDocument, подмена обрабатывается только один раз, при первом проходе парсера. В последующие проходы парсера они доступны уже во всех положенных местах.

gPHFrontEditor:
1) Добавляет скрипты на страницу для активации фронтэдитора.
2) Активирует доступные к редактированию изображения ссылки видео.
3) Сохраняет новые данные после редактирования.
4) Скидывает кеш страниц т.к. редактор виден обычным пользователям. (нужно сделать сброс кеша исключительно данной страницы ибо выходит немного накладно)

Плагин вызывается по событию onWebPageInit, сброс кеша происходит по событию onWebPageComplete.

Немного скриншотов.




Ссылка на видео

Кому интересно можете покопаться на гите)

UPD 10/03

Создавать настройку с пустым именем нельзя.
Группа назначается автоматом если группа не была выбрана и новая не была указана.
Имена настроек транслитируются на английскую раскладку.
Добавлен ричтекст. Ричтекст рендерится на основании дефолтного. Если у вас в настройках выставлено отсутствие ричтекста то будет выводится большая текстареа.
Поправлены небольшие баги. Проведены небольшие доработки кода.
Добавлен префикс в плагин. Теперь можно не перезаписывать существующие плейсхолдеры и тв. По дефолту префикс «g.»

UPD 10/03

Поправил багу с пересохранением значения ричтекста.
Добавил поддержку разделения настроек по табам исходя из группы.

UPD 15/03

Добавлена запись глобальной настройки вида g_[%option_name%] для доступа к настройке без плагина.
Добавлена настройка позиции для группирования настроек.
Поправлены баги с сохранением текста содержащего переносы строк в базу. (Будет еще допиливаться для сохранения переносов т.к. сейчас они просто вытираются)
Добавлен пользовательский шаблон для вывода настройки, в пользовательском шаблоне не выводится имя настройки а только описание.

UPD 27/03

Сделал простенький фронтенд редактор для настроек. Редактор может править тексты (рич, инпуты, текстареа) работать с тегом видео, изображения, ссылки. Т.е. можно менять изображения текста видео ссылки на файлы и видео прям на живую с фронта.
Немного поправил код плагинов и модуля.
Добавил обработку переносов строки для текстареа. Теперь на фронте они как br а в самой текстареа как \r\n.

UPD 30/03

Полностью убран конфиг модуля. Вместо него теперь полноценная страница настройки в модуле.
Поправлены мелкие недочеты с логикой и всякие мелочи типа общей группы.
Добавлен евент OnWebPageComplete в котором скидывается кеш. Сделано для того чтобы веб пользователь не видел скешированную после плагина страницу (потом переделаю во что-то более путное).
Добавлены конфиги в установочные файлы. Теперь модуль и плагины доступны в Extras в качестве одного пакета.

56 комментариев

avatar
Интересное решение.
А чем вам не понравился плагин customSettings от Андчира community.modx-cms.ru/blog/addons/1778.html?
Он намного проще.
  • 64j
  • 0
avatar
он не проще:) + нужен доступ менеджера к системным настройкам коих там много а это вредно
avatar
Тем что customSettings рендерится в разделе настроек всей системы( А давать манагеру или заказчику доступ к этим разделам крайне негативная практика, проверено…
avatar
это к гадалке не ходи) всё поломают)))
поэтому нужен простой интерфейс для записи и удаления настроек в settings.
avatar
Ну вот он и есть) Для того и написал) Вызывается из модулей, простой интерфейс вроде. Для юзеров скрыт раздел Добавить/Редактировать.) Сейчас поколдую еще и будет поддерживать PHP 5.2 (спасибо Диме) :)

Все настройки хранятся в базе system_settings доступны как через $modx->config/getConfig так и через плейсхолдеры.
Комментарий отредактирован 2016-03-09 20:34:10 пользователем WorkForFood
avatar
не забудьте сделать проверку на пустые значения при создании новых параметров.
Проверил — пустые создаются на ура
avatar
так же не сохраняются значения, если неверно создан параметр

Возможно лучше будет использовать автоматическую транслитерацию, проверку на корректность ввода
avatar
Это да, надо бы добавить) Благодарствую)
Комментарий отредактирован 2016-03-09 20:43:55 пользователем WorkForFood
avatar
Все поправил, добавил ричтекст в качестве типа поля.
avatar
при генерации новых глобальных параметров, могут быть совпадения в названиях. Возможно лучше всего дать им префикс «g.» от — global, и получится типа
[(g.site_name)], [+g.base_image+], [*g.image*]…
avatar
Сделаю в качестве настройки к плагину, но часслово задумывалось именно так что он должен перезаписывать совпадения. т.е. если не хотите перезаписывать можно выключить чекбоксы globalPH и globalTV и настройка будет доступна только в [()]
avatar
Я ы использовал вообще только [(g.site_name)]
что б избежать путаницы :) так во первых сразу понятно где искать и откуда переменная )
а иначе если еще и в своем сниппете то фиг найдешь :)
avatar
Да можно и так. Все зависит от плагина. Модуль только лишь контейнер для заполнения а подменами и распределением занимается плагин) А он крошечный всего 26 строк)
avatar
после добавления параметра, вернулся в редактирование и создал новую Категорию, сохранил и выкинуло с ошибкой.
Зашёл опять в редактирование и нажал просто Сохранить, ошибка повторилась
avatar
Ага. Сейчас гляну.

Хм. Вообще странно. На этой строке берется контент шаблона. и судя по всему он не может отрендерить сам элемент… Странно…
Комментарий отредактирован 2016-03-09 21:27:20 пользователем WorkForFood
avatar
Чет у меня то же самое выскочило, решили проблему?
avatar
Версия новая? если да то подробно опишите проблему и порядок действий для повторения.
avatar
1.1RC-d7.1.6 PHP 5.6
Ставил из Extras, но потом качнул из репозитория и перезалил файлы.
Ошибка:
file_get_contents(..\settingsElement.tpl): failed to open stream: No such file or directory in ..\class.renderer.inc.php on line 90
в общем та же))
Комментарий отредактирован 2016-04-01 17:14:46 пользователем troy
avatar
Настройку с каким типом поля вы заполняли и какой контент туда писали?

Временно решить проблему можно просто потыкав по значениям в базе.
Комментарий отредактирован 2016-04-01 17:38:02 пользователем WorkForFood
avatar
Модуль был бы удобнее чем CfgTV
avatar
В идеале было бы удобнее, использовать дерево документов для создания «справочников» — по аналогии как в 1С, а для статики таблицу settings, как Регистр сведений, либо свои таблицы с выводом через вышеописанный плагин.

Модуль для создания новых справочников — новых таблиц, и вывода их в дереве.
Так же и глобальные настройки для сайта.
avatar
Жень, а чем удобнее? CfgTV позволяет все указанное в модуле реализовать, разбить по секциям и вкладкам можно в самом ресурсе, использовать можно любой тип параметра, в том числе и multiTV, версия РНР подойдет и 5.3 (заказчик иногда упирается и не хочет менять хостера, а тот не ставит выше, недавно столкнулся с таким). В чем этот модуль удобнее, просто интересно?
avatar
Все зависит от стиля разработки. Я конечному заказчику выдаю продукт с полными правами. Вот и получается, что мне необходимо отделить мух от котлет: конфиги в стиле «телефон» и конфиги в стиле «ключ API».
Для первых вполне себе CfgTV с обязательно включенным ManagerManager. Для остального — модуль.
avatar
Спасибо, тоже верно. Хорошо когда заказчик понимает, а то тут некоторые инструкцию к tinymce просят :(
avatar
По части поддержки 5.3 код скинул :) думаю там проще проверку на версию пыхи поставить.
+ Я бы добавил возможность запретить всем кроме админа редактировать настройки.
тоесть только оставлять 1 вкладку. И будет мега.
avatar
В следующем коммите сделаю.))
avatar
А так притулить сюда еще multiTV + rithText и все остальные решения уйдут на задний план )
avatar
и можно будет одними глобальными переменными весь сайт сделать))))
avatar
Ричтекст будет точно. Из-за него все и задумывалось) Композитные поля тож будут.
avatar
Такс. Большую часть поправил) Создавать с пустым именем нельзя, группа назначается автоматом если группы не была выбрана и новая не была указана. Имена настроек транслитируются на английскую раскладку.

Кто установил, обновитесь с гитхаба)
Комментарий отредактирован 2016-03-09 21:55:35 пользователем WorkForFood
avatar
Итак. Обновление модуля. :)

Что сделано:

Запись глобальный настройки вида g_[%option_name%] для доступа к настройке без плагина.
Добавлена настройка позиции для группирования настроек.
Поправлены баги с сохранением текста содержащего переносы строк в базу. (Будет еще допиливаться для сохранения переносов т.к. сейчас они просто вытираются)
Добавлен пользовательский шаблон для вывода настройки, в пользовательском шаблоне не выводится имя настройки а только описание.
Начата разработка фронтэнд редактора для настроек (инпутов, текстареа, ричтекст, изображений и файлов)

Чуть подробней в шапке. Как обычно можно покопать гит)
Комментарий отредактирован 2016-03-15 14:17:56 пользователем WorkForFood
avatar
Срочно надо выбирать время и тестить. Нужная штука.
avatar
Очень нужная и мега удобная уже оттестил на одном проекте )

Если добавить еще небольшой плагин и вынести это все в верхнее меню получается вообще мега удобно для менеджеров ))
avatar
Господа. Я увы не успел до отъезда выложить но поделюсь хоть скринами.
Значится что на скринах. Для редактирования глобальных настроек написан плагин. Этот плагин добавлят скрипты и немного модифицирует страницу. К текстам добавляется wysiwyg к изображениям и файлам mcpuk. Можно редактировать тексты из инпутов, текстареа, ричтекст, прикреплять изображения и видео, менять ссылку на файл или изображение.





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

Заранее спасибо.
Комментарий отредактирован 2016-03-17 18:56:53 пользователем WorkForFood
avatar
Господа. Всем доброго времени суток. Сегодня обновил плагин и модуль плюс добавил новый модуль в дополнение к старому. Новый плагин может редактировать настройки через фронт. Более подробно можно почитать в шапке. :) Пожелания и предложения приветствуются)
avatar
В ближайшие дни на проекте потестю.
Кстати, глупый вопрос. Я ведь ни разу ещё это решение не щупал, поэтому и вопрос такой.

С его помощью можно решить задачу: дать менеджеру клиента (он веб-юзер) доступ с фронта к определённым ресурсам, чтобы он мог для этих ресурсов редактировать значения мульти-ТВ? например, табличку цен на услуги?

И чтобы редактировать он мог только этот мульти-ТВ, и ничего более в ресурсе. Доступ у него только с фронта, ессесссно.
avatar
Увы нет( Для ТВ думаю чуть позже запилить похожее решение. Этот комплект чисто для управления глобальными плейсхолдерами.

З.Ы. Дима потестил. Сказал удобная фича)
avatar
Тогда на другом проекте потестю. На том, на к-ром хотел тестить, уже есть CfgTV. А вот на свежем проекте попробую.
avatar
Господа. Теперь пакет доступен для установки через Extras. Добавлено немного нового функционала + поправлены некоторые недочеты. Подробно в шапке.
avatar
Смущает вот это —
Плагин вызывается по событию onParseDocument, подмена обрабатывается только один раз, при первом проходе парсера
насколько глубоко в чанках видны настройки, видны ли они в чанках Ditto, к примеру и т.п.? Или они видны только в шаблоне?
avatar
Событие отрабатывает по первому проходу парсера (до парса сниппетов) т.ч. подставленные настройки будет видно в сниппетах и чанках как родные конфиги (тонее тв плейсы и конфиги). Проверил сейчас через чанк-чанк-сниппет и просто сниппет: все отработало как часы. К тому же подставленный TV спокойно берется через getTemplateVar. Плейсхолдеры тоже берутся через getPlaceholder т.к. добавляются через setPlaceholder.

В общем думаю что все подмены будут чувствовать себя как родные. В любом случае есть возможность писать настройку без всякой шелухи и использовать ее без плагина. Модуль поддерживает такую фичу если включить в настройках «Использовать настройки без плагина».
Комментарий отредактирован 2016-03-31 08:22:29 пользователем WorkForFood
avatar
Я это к тому, что сам термин
<code>Плагин вызывается по событию onParseDocument, подмена обрабатывается только один раз, при первом проходе парсера</code>
некорректен, поскольку событие onParseDocument вызывается пока все не распарсится (до 10 раз). Раньше парсер остановится только если за предыдущие вызовы ему удалось распарсить все чанки и сниппеты и на текущем шаге длина документа не изменилась (т.е. не осталось ничего, что можно прасить дальше). Соответственно столько же раз вызывается и ваш плагин, а не

только один раз, при первом проходе парсера
п.с. хотя заметил только что

$globalPlaceholders = true;
и понял что был не прав :)
Комментарий отредактирован 2016-03-31 10:33:46 пользователем webber
avatar
Ничего, бывает.) Критика всегда уместна и полезна какая бы она ни была. На тему onParseDocument, я не помню почему я не повесил на onWebPageInit но так было бы немного корректней. Видимо какие-то заморочки с $modx->config были…
avatar
onWebPageInit не сработает на 404 странице и все мои общие настройки, вроде «телефон в шапку» просто там не будут показываться :)
avatar
Это да, фронтэдитор на 404й не работает т.к. сидит на onWebPageInit.

П.С. Я так понял вы уже попробовали модуль) Фидбек имеется?
Комментарий отредактирован 2016-03-31 12:32:25 пользователем WorkForFood
avatar
А есть где нить подробная информация по настройке и использованию?
просто установил через extras, создал настройку

в конфигурации включил плагин для редактирования во фронте

и вот на этом начинается загвоздка:
на сайте в шаблон вставлял по разному
[(g_inputphone)], [(g.inputphone)] — почему то если в ней ввожу номер телефона на сайте выводится только цифра «1», если ввожу слово — то выводится название сайта
если [(global_inputphone)] то выводится следующий код
{"type":"text","frontEditor":0,"values":"(843) 258-31-18","globalTV":0,"globalPH":0,"settingDescription":"Телефон","setting_order":"0","group":"bez_kategorii","groupName":"Без категории","value":"+7 (843) 258-31-18"}


и скрипты от плагина front… загружается но нет возможности ничего редактрировать.

Направьте пжл куда нужно копать и как правильно писать!
avatar
Поддержу вопрос. Какой всё-таки правильный синтаксис просто вызова в чанке глобальной переменной без заморочек с TV итд.?
avatar
Отвечаю сама себе и задавшему вопрос: вот так [(inputphone)] :)
avatar
Сборка 1.1-d8.1 от Дмитрия
У меня при создании переменной пишет такую ошибку
Warning: file_get_contents(D:/OpenServer/domains/site.dev/assets/modules/globalplaceholders/templates/settingsElement.tpl): failed to open stream: No such file or directory in D:\OpenServer\domains\site.dev\assets\modules\globalplaceholders\includes\class.renderer.inc.php on line 90
На сборке 1.1-d8.0 все работает.
Модуль globalPlaceholders ставил с гитхаба, из extra такой же результат.
Не сталкивались с такой ошибкой?
Комментарий отредактирован 2016-05-25 10:57:47 пользователем nohc
avatar
Эх, только дощли руки потестить — а на новой сборе модуль и не работает… Жаль, жаль.
avatar
1) Как вызвать внутри сниппета?
2) Надо бы стили подлатать под новую админку
avatar
Автора уже год здесь нету — видно, пропал модуль :)
avatar
Пропасть-то не пропал, вроде работает, но, видимо, лень автору заниматься
avatar
Собираюсь попробовать его вместо CfgTV, чтобы понять — есть ли смысл в замене.

А автора здесь давным-давно нету, похоже, забросил он Эво.
avatar
Сдохло на 1.4RC и непонятно, что делать теперь
avatar
Так я и не попробовал. Когда собрался — модуль уже не заводился на текущих версиях.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.