Задача.
"виртуально" создавать несколько копий модуля в движке, при этом дать возможность устанавливать свои настройки каждому модулю
Постановка задачи.
Есть свой движок сайта (MVC архитектура). Для формирования контента на странице сайта используется коллекция модулей (тоже самописных).
Каждый такой модуль имеет блок настроек - например "имя модуля для отображения".
Столкнулся с проблемой. Если нужно использовать модуль "А" на одной странице сайта с одними настройками, а на другой странице сайта с другими - то необходимо как бы "клонировать" этот модуль (создать модули "А-копия1", "А-копия2") и полученной копии задать нужные настройки.
При этом сам код модуля остается в единичном экземпляре.
Не знаю как подойти к этой проблеме - какие методы решения могут существовать.
Подобное реализовано в той же Joomla - когда мы копируем модуль и указываем копии свое место положение в шаблоне и свои настройки, но при этом копии кода модуля не создается (или я не прав? )
Все настройки модуля, у меня, хранятся в папке с ним в файле configmod.php
Информация о положении модуля в шаблоне хранится в конфиге самого шаблона (не в базе данных)
Есть мысль что нужно просто создавать новые "configmodХХ.php" для копий модуля. Только вот не могу придумать как обращаться из шаблона к этим копиям модуля.
1. sheff2000 - 30 Июля, 2012 - 15:39:02 - перейти к сообщению
2. Andrusa95 - 01 Августа, 2012 - 11:31:11 - перейти к сообщению
Используете метод __clone()
3. caballero - 01 Августа, 2012 - 11:41:21 - перейти к сообщению
И кто может догадатся что сие такое у тебя "модуль"?
Не говоря уже о том на фига его клонировать. Если там разные данные та и выводи их в каждом месте свои
Не говоря уже о том на фига его клонировать. Если там разные данные та и выводи их в каждом месте свои
4. Stierus - 01 Августа, 2012 - 11:54:28 - перейти к сообщению
я прям вижу конечное решение в виде симлинков )))
5. sheff2000 - 01 Августа, 2012 - 15:05:23 - перейти к сообщению
caballero пишет:
И кто может догадатся что сие такое у тебя "модуль"?
Не говоря уже о том на фига его клонировать.
Не говоря уже о том на фига его клонировать.
Вроде как раздел форума "CMS" называется - думал в этом разделе понятие "модуль" не должно вызывать вопросов.
Поясню.
Модуль - набор (либо один) php файлов который выводит на сайт определенные данные.
Например "Новые комментарии". Набросал 2D визуализацию в пеинте и прекрепил ее к сообщению - может поможет понять мой вопрос.
Сайт имеет разные шаблоны внешнего вида. В каждом из них предусмотрены определенные позиции для вывода модулей.
Каждый модуль имеет свои настройки внешнего вида. Например в "Новые комментарии" можно выводить или нет аватар автора, менять количество комментариев. Все настройки хранятся в файле /modules/{имя модуля}/config.php
Но бывают ситуации когда нужно модуль "Новые комментарии" вывести на одной странице в двух разных позициях (пример - в левой колонке и подвале). В каждой позиции с разными настройками (например в левой колонке 5 комментов, в подвале - 3 коммента с аватарами авторов).
Я хотел у Вас узнать - какие существует алгоритмы (хотя бы намеки) реализации таких задач. Можно на примере той же Джумлы, где можно сколько угодно много создавать копий модулей, менять каждой копии настройки вывода и размещать в любых доступных блоках шаблона.
Andrusa95 пишет:
Используете метод __clone()
Спасибо за совет - но наверное это мне не поможет.
__clone() создает копию объекта, которая живет столько, сколько выполняется серверный скрипт, после чего благополучно исчезает.
Мне требуется физически хранить разные наборы настроек для скрипта (модуля)
Stierus пишет:
я прям вижу конечное решение в виде симлинков Улыбка)))
дайте посмотреть через Ваши очки, тоже хочу решение увидеть
P.S. Неужели я так неясно изложил суть моей проблемы и просьбу помочь (не сарказм) ?
6. voskan - 02 Августа, 2012 - 09:40:25 - перейти к сообщению
записывать настройки в бд и выводить их задав условие вывода. копировать зачем ?
7. Stierus - 02 Августа, 2012 - 09:50:33 - перейти к сообщению
вы сейчас путаете настройки с параметрами Одни и те же вещи могут быть настройками и параметрами в разных ситуациях. Если у вас одна бд - параметры соединения с ней - это настройки, они всегда едины для сервера и меняются лишь при переезде или запуске на тест-маине. Если у вас баз данных много (например для кажждого языка своя или еще от чего-то зависит, какую выбрать) - то это уже параметр, передаваемый в модуль. Запуская функцию модуля, этот параметр надо передавать.
Если у вас разное количество комментариев выводится - логичнее всего передавать дополнительным (можно необязательным) параметром количество комментариев в функцию их отображения. Но никак не физически копировать модуль и делать вид, что это другой модуль.
ps
про симлинки была ирония, если я расскажу что имел ввиду - вам понравится и вы именно так и сделаете, но это будет неправильным решением.
Если у вас разное количество комментариев выводится - логичнее всего передавать дополнительным (можно необязательным) параметром количество комментариев в функцию их отображения. Но никак не физически копировать модуль и делать вид, что это другой модуль.
ps
про симлинки была ирония, если я расскажу что имел ввиду - вам понравится и вы именно так и сделаете, но это будет неправильным решением.
8. sheff2000 - 02 Августа, 2012 - 10:19:48 - перейти к сообщению
Stierus пишет:
Если у вас разное количество комментариев выводится - логичнее всего передавать дополнительным (можно необязательным) параметром количество комментариев в функцию их отображения. Но никак не физически копировать модуль и делать вид, что это другой модуль.
Если у вас разное количество комментариев выводится - логичнее всего передавать дополнительным (можно необязательным) параметром количество комментариев в функцию их отображения. Но никак не физически копировать модуль и делать вид, что это другой модуль.
Я как раз это и спрашиваю - я понимаю что копировать сам модуль (множить его код) это глупое решение и надо передавать в функцию нужные параметры, которые меняет пользователь. У меня как раз вопрос в этом, где и как лучше хранить эти наборы параметров - какие механизмы (алгоритмы) в таком случаи применяются популярными CMS .
voskan предложил делать это в БД.
Но в той же Джумле я не заметил такого механизма. Да и сама идея спорная - модули могут быть самыми разнообразными и содержать неопределённое число параметров самых разных типов. Как такое можно структурировать в одной таблице БД ?
9. Stierus - 02 Августа, 2012 - 10:32:47 - перейти к сообщению
ну если у вас модули собираются в шаблонах - там же и храните параметры этих подгружаемых модулей
(Добавление)
если шаблоны, что бы собрать модули, откуда-то получают список этих модулей и их позиции - то и параметры модулей надо положить туда же, откуда шаблоны забирают информацию,
и т.д. - ну вы поняли
(Добавление)
если шаблоны, что бы собрать модули, откуда-то получают список этих модулей и их позиции - то и параметры модулей надо положить туда же, откуда шаблоны забирают информацию,
и т.д. - ну вы поняли
10. caballero - 02 Августа, 2012 - 10:45:52 - перейти к сообщению
Цитата:
Вроде как раздел форума "CMS" называется - думал в этом разделе понятие "модуль" не должно вызывать вопросов.
В каждой CMS свое понятие и с воя реализация модуля. Определение модуля как набора файлов выводящих контент ни о чем не говорит. Все фпйлы так делают.
11. sheff2000 - 02 Августа, 2012 - 11:38:04 - перейти к сообщению
Stierus - спасибо, как то наверное заработался и решения, которые на поверхности тупо не вижу.
Попробую написать очень упрощенно как это реализовано у меня
(сильно не пинать, пишу без ООП для себя)
Пример набора скриптов для вывода одной страницы, меню и механизм генерации ссылок и прочего упускаю. Все страницы сайта идут через главный index.php
Вот его пример mysite.ua/index.php:
Попробую написать очень упрощенно как это реализовано у меня
(сильно не пинать, пишу без ООП для себя)
Пример набора скриптов для вывода одной страницы, меню и механизм генерации ссылок и прочего упускаю. Все страницы сайта идут через главный index.php
Вот его пример mysite.ua/index.php:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- # подключаем различные наборы функций, файл конфигурации сайта, переменных и шаблона
- include 'config_site.php'; # параметры подключения к БД и другие параметры сайта
- include 'lib/function.php'; #файл общих функций
- include 'template/mytemplate/config.php'; #настройки шаблона, например цвет и т.д.
- include 'router/page1.php'; #подключаем роутер нашей страницы сайта
- include 'template/mytemplate/index.php'; #подключаем файл шаблона - генерить html для вывода
- ?>
Шаблон для страницы сайта содержит специальный файл, где есть перечень доступных блоков для подключения модулей и собственно какие модули туда выводить
название файла template/mytemplate/page1.php и его содержимое:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- $k_block=3; # количество позиций (блоков) для вывода модулей
- $block_c[1]='leftmenu;marka'; #первый блок и его содержимое, модули - "левое меню" и "марка"
- $block_c[2]='marka'; #второй блок и его содержимое тот же модуль "марка", вот тут они должен выводится не так как в первом блоке
- $block_c[3]='lastnews'; # третий блок, сюда выведем последние новости
- ?>
Далее идет сборка данных для вывода на странице, файл router/page1.php:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- # шаблон для каждой страницы содержит
- include 'template/mytemplate/page1.php'; # подключаем файл с перечнем доступных блоков для модулей и их содержимым
- # запускаем компонент, который генерирует основной контент на странице
- include 'components/mycomponent/router.php'; # он нам не важен, это для наглядности
- # запускаем модули, которые мы хотим видеть на странице, согласно файлу template/mytemplate/page1.php
- $i=1; # просто счетчик
- while ($i<=$k_block) # перебираем все блоки, у нас их в примере три штуки
- {
- $block[$i]=''; # тут будем хранить результат работы модуля (готовый html для вывода)
- # в одном блоке может быть несколько модулей, выбираем все их названия
- foreach( $modul_block as $modul_view)
- {
- if ($modul_view!='')
- {
- # и по очереди запускаем на выполнение
- include IRB_ROOT.'modules/'.$modul_view.'/router.php'; # название модуля в переменной совпадает с названием папки где лежит код модуля
- }
- }
- $i++; # переходим к следующему блоку
- }
- ?>