Сложное извлечение переменных / preg_match / replace / shortcodes для темы

Да, я знаю, что заново изобретаю колесо, но я не хочу использовать фреймворк или систему шаблонов.

Идея:

  • Создайте theme.php, который содержит переменные для макета страницы, т.е.
    $layout['default'],$layout['twocolumn'] так далее
  • Читайте theme.php $layouts
  • Извлечь макеты на основе некоторых переменных, т.е. Страница вашего просмотра
  • preg_match шорткоды в макетах $ т.е. {MODULEAREA=1}
  • Вернуть номер {MODULE = т.е. = 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>
";

0

Решение

Ваша проблема заключается в следующем:

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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]