Да, я знаю, что заново изобретаю колесо, но я не хочу использовать фреймворк или систему шаблонов.
Идея:
$layout['default']
,$layout['twocolumn']
так далее$layouts
preg_match
шорткоды в макетах $ т.е. {MODULEAREA=1}
$module
$layout['default']
со всеми html, окружающими его и замененными шорткодамиЗамечания: Верхний и нижний колонтитулы будут отдельными файлами, «включенными» в index.php
Вот что у меня так далеко:
Иногда он заменяет шорткоды, но удаляет все HTML, в идеале я хотел бы заменить шорткоды и вернуть HTML с новым содержимым.
$layout = '
<div class="module_area_one">
{MODULEAREA=1}
</div>
<div class="module_area_two">
{MODULEAREA=2}
</div>
<div class="module_area_three">
{MODULEAREA=3}
</div>
';
foreach(parselayout($layout, TRUE) as $module) {
$row = $dmodule->getModuleByModuleArea($module);
echo '
<div class="module_wrap">
<div class="module_title">'.$row[0]['module_title'].'</div>
<div class="module_body">'.$row[0]['module_body'].'</div>
</div>
';
}
function parselayout($layout, $check = FALSE) {
$tmp = explode("\n", $layout);
$str = array();
for ($c = 0, $cnt = count($tmp); $c < $cnt; $c++) {
if (preg_match("/[\{|\}]/", $tmp[$c])) {
if ($check) {
if (strstr($tmp[$c], "{MODULE=")) {
$matches = array();
preg_match_all("/\{MODULE=([\d]{1,3})(:[\w\d]*)?\}/", $tmp[$c], $matches);
if(!$matches){
return;
}
foreach ($matches[1] as $match) {
$ret[] = $match;
}
}
}
}
else {
if (!$check) {
echo $tmp[$c];
}
}
}
if ($check) {
return $str;
}
}public function getModuleByModuleArea($moduleMenuArea) {
$query = "SELECT module_title, module_name, module_body FROM wcx_modules WHERE module_menu_area=:module_menu_area AND module_active=1";
$stmt = $this->queryIt($query);
$stmt = $this->bind(':module_menu_area', $moduleMenuArea);
return $this->resultset();
}
Обновить:
Хорошо, так что я немного ближе, следующий код возвращает модули на свои места, но он показывает только один модуль, который он повторяет для всех 3 меню, вы видите здесь что-то не так.
Мне все еще нужно выяснить, как добавить $ layout [‘default’] = »; также.
Preg_match_all:
$pattern = '/\{MENU=([\d]{1,3})(:[\w\d]*)?\}/';
preg_match_all($pattern, $text, $matches);
//print_r($matches[1]);
foreach($matches[1] as $menu) {
$row = $dmodule->getModuleByModuleArea($menu);
$module = '
<div class="module_wrap">
<div class="module_title">'.$row[0]['module_title'].'</div>
<div class="module_body">'.$row[0]['module_body'].'</div>
</div>
';
}
$text = preg_replace($pattern, $module, $text);
echo $text;
Строка:
$text = "<div id='wrapper'>
<div id='maincontainer'>
<div id='leftcolumn'>
{MENU=1}
</div><div id='contentcolumn'>
{MENU=3}
</div><div id='rightcolumn'>
{MENU=2}
</div>
</div>
</div>
<div id='footer'>
<div id='footer_disclaim'>
</div>
</div>
";
Ваша проблема заключается в следующем:
preg_match_all($pattern, $text, $matches);
foreach($matches[1] as $menu) {
$row = $dmodule->getModuleByModuleArea($menu);
$module = 'Simplified for readability';
}
// Now $module holds the last value calculated in the
// foreach-loop, and you are replacing all matches
// with that value.
$text = preg_replace($pattern, $module, $text);
Вы должны взглянуть на preg_replace_callback
.
// This function will be called for every match of your
// regex and the return-value will be used as the replacement
$replaceCallback = function($matches) use ($dmodule) {
$menu = $matches[1];
$row = $dmodule->getModuleByModuleArea($menu);
$module = 'Simplified for readability';
return $module;
};
$text = preg_replace_callback($pattern, $replaceCallback, $text);
Других решений пока нет …