Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Клонирование модуля с заданием индивидуального конфига каждому клону
Форумы портала PHP.SU » » CMS и фреймворки » Клонирование модуля с заданием индивидуального конфига каждому клону

Страниц (2): [1] 2 »
 

1. sheff2000 - 30 Июля, 2012 - 15:39:02 - перейти к сообщению
Задача.
"виртуально" создавать несколько копий модуля в движке, при этом дать возможность устанавливать свои настройки каждому модулю

Постановка задачи.
Есть свой движок сайта (MVC архитектура). Для формирования контента на странице сайта используется коллекция модулей (тоже самописных).
Каждый такой модуль имеет блок настроек - например "имя модуля для отображения".

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

Подобное реализовано в той же Joomla - когда мы копируем модуль и указываем копии свое место положение в шаблоне и свои настройки, но при этом копии кода модуля не создается (или я не прав? )

Все настройки модуля, у меня, хранятся в папке с ним в файле configmod.php
Информация о положении модуля в шаблоне хранится в конфиге самого шаблона (не в базе данных)

Есть мысль что нужно просто создавать новые "configmodХХ.php" для копий модуля. Только вот не могу придумать как обращаться из шаблона к этим копиям модуля.
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
про симлинки была ирония, если я расскажу что имел ввиду - вам понравится и вы именно так и сделаете, но это будет неправильным решением.
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:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. # подключаем различные наборы функций, файл конфигурации сайта, переменных и шаблона
  3. include 'config_site.php';                          # параметры подключения к БД и другие параметры сайта
  4. include 'lib/function.php';                          #файл общих функций
  5. include 'template/mytemplate/config.php'; #настройки шаблона, например цвет и т.д.
  6.  
  7. include 'router/page1.php';     #подключаем роутер нашей страницы сайта
  8.  
  9. include 'template/mytemplate/index.php'; #подключаем файл шаблона - генерить html для вывода
  10. ?>


Шаблон для страницы сайта содержит специальный файл, где есть перечень доступных блоков для подключения модулей и собственно какие модули туда выводить
название файла template/mytemplate/page1.php и его содержимое:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $k_block=3; # количество позиций (блоков) для вывода модулей
  3. $block_c[1]='leftmenu;marka';      #первый блок и его содержимое, модули - "левое меню" и "марка"
  4. $block_c[2]='marka';                    #второй блок и его содержимое тот же модуль "марка", вот тут они должен выводится не так как в первом блоке
  5. $block_c[3]='lastnews';                 # третий блок, сюда выведем последние новости                    
  6. ?>



Далее идет сборка данных для вывода на странице, файл router/page1.php:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.     # шаблон для каждой страницы содержит
  3.    include 'template/mytemplate/page1.php'; # подключаем файл с перечнем доступных блоков для модулей и их содержимым
  4.    
  5.     # запускаем компонент, который генерирует основной контент на странице
  6.      ob_start();
  7.       include 'components/mycomponent/router.php'; # он нам не важен, это для наглядности
  8.      $content=ob_get_contents();
  9.       ob_end_clean();
  10.              
  11.            
  12.     # запускаем модули, которые мы хотим видеть на странице, согласно файлу template/mytemplate/page1.php
  13.    $i=1;   # просто счетчик
  14.    while ($i<=$k_block)         # перебираем все блоки, у  нас их в примере три штуки
  15.    {
  16.       $block[$i]='';                  # тут будем хранить результат работы модуля (готовый html для вывода)
  17.      # в одном блоке может быть несколько модулей, выбираем все их названия
  18.      $modul_block = explode(";", $block_c[$i]);    
  19.  
  20.       foreach( $modul_block as $modul_view)
  21.       {
  22.         if ($modul_view!='')
  23.         {
  24.           ob_start();    
  25.                             # и по очереди запускаем на выполнение
  26.              include IRB_ROOT.'modules/'.$modul_view.'/router.php'; # название модуля в переменной совпадает с названием папки где лежит код модуля
  27.          
  28.           $block[$i] .=ob_get_contents(); # сохраняем результат
  29.          ob_end_clean();        
  30.         }        
  31.       }
  32.       $i++; # переходим к следующему блоку
  33.    }
  34. ?>
  35.  


Сам модуль лежит в папке /modules/{название модуля}/ , например /modules/marka/ - модуль "марка", выводит список брендов
Вот пример из чего состоит модуль (упрощенно) "марка":
config.php - параметры модуля, их можно менять в админке
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.      $modulname = "Брэнды";  # название модуля, выводится на странице сайта
  3.     $viewcontrol=2;                 #  как выводить список брендов  1 - в столбец  2 - в строку | это к примеру
  4. ?>

Вот с этим конфигом вся загвоздка Недовольство, огорчение - если мне захочется на одной странице два раза вывести этот модуль но в одном месте "в строку", а в другом "в столбец" - мне нужно иметь два таких файла с параметрами. Создать такой еще один файл config2.php не проблема. Но я никак не соображу как лучше придумать механизм управление (роутер для конфигов) этими конфигами + надо"знать" к какому блоку на сайте какой конфиг будет соответствовать

router.php - код который создает/загружает данные для вывода
tpl.php - файл шаблона , генерирует html код работы модуля

Далее в файле шаблона template/mytemplate/index.php формируем общий html код всей страницы.
Вот часть его содержимого где выводятся модули и контент (упрощенный пример)

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php if ($block[1]!='')
  2.      {  echo '<div id="block1">
  3.                         '.$block[1].'</div>';
  4.      }?>
  5. <div class="content">
  6.         <?php      echo $content;    ?>
  7. </div>
  8. <?php if ($block[2]!='')
  9.      {  echo '<div id="block2">
  10.                         '.$block[2].'</div>';
  11.      }?>


Вот скрин админ-части где можна указать какой модуль в какое место сайта поставить и тут же его настроить.
Проблема у меня как раз в этом - как дать возможность установить одни параметры для модуля "марка" в блоке 1 и совсем другие параметры для модуля "марка" в блоке 2
Сейчас где бы я не поставил параметры - они применяться для этого модуля на весь сайт, что логично, ведь config.php у модуля один.

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

P.S. извините если много кода, может кому интересно будет, может кто покритикует и скажет что реализация фиговая - буду только рад отзывам
12. Stierus - 02 Августа, 2012 - 11:46:13 - перейти к сообщению
$viewcontrol=2; # как выводить список брендов 1 - в столбец 2 - в строку | это к примеру

из config.php должна уйти в template/mytemplate/page1.php и выглядеть как-то так, например:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $k_block=3; // WTF, почему не count($block_c) ?
  3. $block_c[1]='leftmenu;marka(viewcontrol:2)';      #первый блок и его содержимое, модули - "левое меню" и "марка"
  4. $block_c[2]='marka(viewcontrol:3)';                    #второй блок и его содержимое тот же модуль "марка", вот тут они должен выводится не так как в первом блоке
  5. $block_c[3]='lastnews';                 # третий блок, сюда выведем последние новости                    
  6. ?>
13. sheff2000 - 02 Августа, 2012 - 12:10:13 - перейти к сообщению
Stierus пишет:
из config.php должна уйти в template/mytemplate/page1.php и выглядеть как-то так, например:


хм.. то есть /modules/marka/config.php вообще не создавать. А на этапе подключения и настройки модуля (в админке) редактировать файл шаблона template/mytemplate/page1.php

тогда у него получится примерно такой вид:
PHP:
скопировать код в буфер обмена
  1.   <?PHP
  2.     $k_block=3; # - файл создается руками когда делается шаблон, посчитал что лишняя операция count($block_c) попросту не нужна, ведь это число может поменяться только если переделаем сам шаблон
  3.  
  4.     $block_c[1]='leftmenu(modulname:Левое меню);marka(modulname:Производители|viewcontrol:2)';      #первый блок
  5.    $block_c[2]='marka(modulname:Производители|viewcontrol:3)';                    #второй блок      
  6.    ?>

знак "|" - использовать как разделитель параметров модуля, чтоб потом разобрать строку удобно было. Ну и собственно все параметры получатся уникальными для каждого блока и для каждой страницы сайта.

Я правильно Вас понял ?
14. Stierus - 02 Августа, 2012 - 12:13:05 - перейти к сообщению
Цитата:
то есть /modules/marka/config.php вообще не создавать.
Можно оставить для настроек - общих для всех инстансов модуля, в остальном - да.
(Добавление)
В 1-м симфони это выглядит как-то так:

1 Через слоты:
PHP:
скопировать код в буфер обмена
  1. <?PHP slot('js_template', get_partial('order/js_template', $sf_data)) ?>

2 Через компоненты
PHP:
скопировать код в буфер обмена
  1. include_component('order', 'seo_counters_advance', array('step' => 2))

3 Через партиалы
PHP:
скопировать код в буфер обмена
  1. get_partial('order/js_template', $sf_data)
15. sheff2000 - 02 Августа, 2012 - 12:57:45 - перейти к сообщению
замечательно, значит не все со мной потеряно ... будем реализовывать .. Спасибо за наводку!

Stierus пишет:
В 1-м симфони это выглядит как-то так:


это которая http://www[dot]symfony-project[dot]org ?
пойду почитаю как люди делают, интересно ... я мало смотрю на различные фреймворки, видимо в этом моя ошибка .... пишу "сам с собой для себя" ..надо расширять кругозор Улыбка

Скажите, а в целом моя схема работы движка не совсем "страшная" ?

P.S. при попытке нажать "спасибо" получаю
количество сообщений оставленных Вами на форуме, недостаточно для данной операции
сколько ж надо этих сообщений чтоб отблагодарить человека Недовольство, огорчение

 

Powered by ExBB FM 1.0 RC1