|
|
|
| столкнулся с такой проблемой:
есть шаблон:
<html>
<head>
<?php echo $class->head; ?>
</head>
<body>
<?php echo $class->include_module('module_name'); ?>
</body>
</html>
|
<?
$class->head
//уже сформированная до вывода переменная с базовыми значениями которые включаются в любой шаблон.
|
<?
$class->include_module('module_name');
// вызывается модуль который на лету рендерится(различается в каждом шаблоне по разному, гдето может быть подключен модуль гдето нет, поэтому происходит всё на лету.
//Но при рендеринге модуля может быть вызван скрипт который изменяет $class->head.. собсно выползает загвоздочка..
|
В голове пока только:
• отрендерить все модули до вывода шаблона, а уже в сам шаблон, при вызове модуля посылать уже готовые переменные с нарисоваными модулями.. но это както грязно.
• Использовать псевдотеги, например <include_module name="module_name">
где потом это всё будем заменять на модули, но тут тоже вылазит постоянные гонялки регулярными выражениями, что есть не очень хорошо.
У кого какие идеи? | |
|
|
|
|
|
|
|
для: sl1p
(19.10.2010 в 16:04)
| | Какая структура движка у вас, я не знаю. Может. где-то не так вас поняла, но из рассказанного мысли вот какие.
Не очень понятно, почему вы до того, как отправлять данные в шаблон не установили что-то типа контроллера, который будет решать, что выводить между <head></head>.
Например, этом контроллере может быть такое(схема):
<?php
if(данный модуль подключен){ //или здесь делать проверку на массив всех подключенных модулей
//применяем метод, который меняет базовые установки
//метод может принадлежать какому угодно классу, который в данный момент отвечает за содержимое шапки
$header = $class->head_module; //или $header = $class2->head_module;
}else{
//применяем базовые установки
$header = $class->head;
}
|
И в шаблоне выводить уже:
<head>
<?php echo $header; ?>
</head>
|
Можно еще так сделать. Чтобы привести все к порядку. Создается базовый класс, который отвечает за содержимое шапки. При необходимости в каждом модуле создаются дочерние классы, методы которых переопределяют методы родителя. При формировании контента шапки в зависимости от условий вызывается либо дочерний, либо метод родителя. Можно по умолчанию сделать и так, что если в модуле нет какого-либо метода, то начинает работать метод ближайшего родителя, т.е. должна соблюдаться наследственность. Тогда у вас случая, что где-то вылезет скрипт, который меняет $class->head, не будет. | |
|
|
|
|
|
|
|
для: Лена
(20.10.2010 в 00:33)
| | Не совсем понял ваши мысли, либо мы с вами вообще друг друга не поняли:)
модуль это не контент, это дополнительные блоки, типа меню, случайная новость, форма входа и т.д.
----------------------------------------------------
+модуль+ +контент+ +модуль+
+модуль+ +модуль+
+модуль+
----------------------------------------------------
+модуль+
----------------------------------------------------
|
Сам контент генерится до вывода шаблона, т.к. везде он будет одинаковый.
модули же подключаются в разных шаблонах разные (сделал это дабы не привязываться к структуре шаблона), можно было конечно сразу все модули сгенерировать и уже отдавать шаблону.
код в первом посте можно заменить на:
<?php
// тут генерится компонент(контент)
$class->head = '<title>ololo</title>';
?>
<html>
<head>
<?php echo $class->head; // тут уже выводим сам хтмл код т.е. переменную уже нет смысла изменять т.к. она уже была выведена ?>
</head>
<body>
<?php
//echo $class->include_module('module_name');
// тут вызывается метод класса который меняет {$class->head}
// к примеру нужно подключить какойто файл JS и т.п.
$someClass->addToHead('<script></script>');
// function addToHead($txt) {
// $class->head .= $txt;
// }
$module = '<div>какойто контент</div>';
echo $module;
?>
</body>
</html>
|
так будет выглядеть в раскрытом виде.. | |
|
|
|
|
 2.9 Кб |
|
|
для: sl1p
(20.10.2010 в 00:54)
| | То, что вы называете модулем, на самом деле называется "блок" - часть модуля.
Вы предлагаете менять все задним числом.
Есть у вас дефолтная "шапка", появилось в модуле что-то типа "<script>...</script>" - давайте теперь "шапку" поменяем.
Я предлагаю проверять, подключен ли модуль, если подключен - мы к дефолтному шаблону "долепливаем" "шапку"
подключенного модуля. И так делаем с каждым модулем.
То, что у меня получилось, я прикрепила.
Загрузите себе все в корень и посмотрите сначала, как работает, у меня там два подключенных модуля.
Есть каталог для классов. Для каждого модуля есть свой каталог, где лежат файлы модуля. В каталоге модуля есть каталог
templates - в нем должны лежать все шаблоны.
Основной файл - index.php, вот он:
<?php
// тут генерится компонент(контент) - это по вашему
//по-моему - тут должен вытягиваться нужный файл шаблона для "шапки",
//"шапка" одного модуля + "шапка" второго модуля = вся "шапка" страницы
$head = '';
//интерфейс
interface headerAll{
public function addToHead($value);
}
//генератор "шапки"
class headerGenerator{
private $_gen;
public function __construct(headerAll $header){
$this->_gen = $header;
}
public function getTemplate($text){
if($this->_gen->addToHead($text)){
return $this->_gen->addToHead($text);
}
else{
//throw exception
}
}
}
//в каталоге class пройти по всем файлам, начинающимся с header, подключить их.
//название файла == названию класса -headerMod1.php,headerMod2.php
foreach (glob("class/header*.php") as $filename) {
include_once($filename);
//создаем нужный объект
$tt = basename(substr($filename,0,-4));
$currentHeader = new headerGenerator(new $tt);
//ищем в модуле шаблон "шапки", где находится ваш '<script></script>', подключаем шапку
$tpl = 'modules/' . substr($filename,12,-4) . '/templates/header.html';
$mod = 1; //подключен ли модуль, у меня эта информация лежит в базе 0/1
//шаблон "шапки" по умолчанию,
//MainHeaderGenerator - класс занимается выводом "шапки" по умолчанию
/*
$default_tpl = 'templates/header.html';
$currentHeader = new MainHeaderGenerator($default_tpl);
$head .= $currentHeader->getTemplate();*/
//если модуль подключен, выводим его блок и "шапку" для этого модуля
if($mod){
//это вывод шапки
$head .= $currentHeader->getTemplate($tpl);
//здесь можно сделать вывод блока
//$block = ...
}
}
// тут уже выводим сам хтмл код
?>
<html>
<head>
<?php
echo $head;
?>
</head>
<body>
<?php
//echo $block;
$module = '<div>какойто контент</div>';
echo $module;
?>
</body>
</html>
|
Все написала в комментах.
Вы кстати, в предыдущем после страницу до ужаса растянули, неудобно читать. | |
|
|
|
|
|
|
|
для: sl1p
(19.10.2010 в 16:04)
| | нельзя вызывать $class->head из под модуля?
сложности с областью видимости заставляют вызывать $class->head до $class->include_module('module_name') или почему вы так поступаете? областью видимости можно легко манипулировать и подавать каждую часть контента только когда это нужно, не пытаясь сделать класс/метод на все случаи жизни.
>использовать псевдотеги, например <include_module name="module_name">
и без этого вполне можно обходиться. | |
|
|
|