Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: очередность выполнения
 
 автор: sl1p   (19.10.2010 в 16:04)   письмо автору
 
 

столкнулся с такой проблемой:

есть шаблон:

<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">
где потом это всё будем заменять на модули, но тут тоже вылазит постоянные гонялки регулярными выражениями, что есть не очень хорошо.

У кого какие идеи?

  Ответить  
 
 автор: Лена   (20.10.2010 в 00:33)   письмо автору
 
   для: 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, не будет.

  Ответить  
 
 автор: sl1p   (20.10.2010 в 00:54)   письмо автору
 
   для: Лена   (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>


так будет выглядеть в раскрытом виде..

  Ответить  
 
 автор: Лена   (20.10.2010 в 17:21)   письмо автору
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>



Все написала в комментах.
Вы кстати, в предыдущем после страницу до ужаса растянули, неудобно читать.

  Ответить  
 
 автор: deimand   (24.10.2010 в 02:19)   письмо автору
 
   для: sl1p   (19.10.2010 в 16:04)
 

нельзя вызывать $class->head из под модуля?
сложности с областью видимости заставляют вызывать $class->head до $class->include_module('module_name') или почему вы так поступаете? областью видимости можно легко манипулировать и подавать каждую часть контента только когда это нужно, не пытаясь сделать класс/метод на все случаи жизни.

>использовать псевдотеги, например <include_module name="module_name">

и без этого вполне можно обходиться.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования