Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повторное использование шаблонов в рекурсии? 
:(
    Опции темы
Sanchezzz
Дата 25.7.2012, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Добрый день, сделал  себе велосипед для рендинга шаблонов.

Проблема встала иза рекурсивного вывода дерева с итерацией в 100-5000 проходов 
Прошлый вариант без рендинга скажим пилотный был без реализации шаблона все было в параметрах класса и выводился через вызов приватной функции в рекурсии. 
Это накладывало ряд трудностей и не удобств таких как простота и быстрота изменения шаблона.

2 вопроса:
Как справляются громоздкие фреймворки уяя, кохан, зендя итд с такой задачей как повторное использование шаблона с новыми параметрами в рекурсии ?
Неужто ли в преставлении делают вывод рекурсии с собственной функцией?






--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Fortop
Дата 25.7.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Sanchezzz @  25.7.2012,  11:07 Найти цитируемый пост)
Как справляются громоздкие фреймворки уяя, кохан, зендя итд с такой задачей как повторное использование шаблона с новыми параметрами в рекурсии ?
Неужто ли в преставлении делают вывод рекурсии с собственной функцией?

Что такое вывод рекурсии?

ZF имеет view helpers:
partial
partialLoop

для вывода шаблона или шаблона в цикле



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Sentox
Дата 25.7.2012, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Не пойму что есть рекурсия, но может это поможет
   
Код

 /**
     * Рендеринг формы из файла передаваемого параметром и определение переменных в пространстве метода.
     *
     * @param $pathToFile
     * @param array $params
     */
    public function render($pathToFile, $params = array())
    {
        extract($params, EXTR_OVERWRITE);
        include($pathToFile);
    }


Это сообщение отредактировал(а) Sentox - 25.7.2012, 16:31
PM MAIL   Вверх
Sanchezzz
Дата 25.7.2012, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



рекурсия - это алгоритм который в последствие выполнения вызывает себя повторно.

Fortop, partial partialLoop я незнаком с фреймворком от зенда и даже не представляю как они работают.
в общим рейдеринг выполняется у меня через класс и пару функциий
Код

cv_view::make('/teml/tree.php' , array('arrData  ' =>$arrData ))->render();

// маке() создает экземпляр класса фабрика  и  подключает файл представления (шаблон)
Код

protected static function load_view($cv_view_filename, array $cv_view_data){
    ob_start() and extract($cv_view_data, EXTR_SKIP);
    try{
        include $cv_view_filename;
    }
    catch (Exception $e){
        ob_end_clean();
        throw $e;
    }
        return ob_get_clean();
}


В данной реализации меня не устраивает то что для каждой итерации в цикле в модели построения дерева подключается файл шаблона.
Сейчас дерево строится с функцией внутри шаблона что некрасиво и не правильно.







Это сообщение отредактировал(а) Sanchezzz - 25.7.2012, 22:19


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Sanchezzz
Дата 25.7.2012, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Есть задумка которую я еще не проверял открыть файл на чтение некий шаблон HTML который нужно вывести прочитать его  и вернуть в переменю.
До вывода переменной с содержание разметки хтмл  и {$var1} объявить переменные и вывести.
Фактически мы получим тоже самое что.
Код

$var1 = 1;
 echo " <b>{$var1}</b>"; 

Если все проканает то функцию из шаблона можно перенести в модуль, добавить проверок если я гружу опять такой тип шаблона то вернуть из временного кеша шаблон и использовать.







Это сообщение отредактировал(а) Sanchezzz - 25.7.2012, 22:25


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Fortop
Дата 25.7.2012, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Sanchezzz @  25.7.2012,  22:07 Найти цитируемый пост)
Fortop, partial partialLoop я незнаком с фреймворком от зенда и даже не представляю как они работают.

Погуглить нет?

"Example #9 Using PartialLoop to Render Iterable Models"

В общем существует шаблон выводящий какой-либо элемент.
Существует некий хелпер (класс) который на вход принимает итератор и имя шаблона.
И последовательно выводит данные на каждом шаге итератора в шаблоне.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Sentox
Дата 25.7.2012, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(Sanchezzz @ 25.7.2012,  22:24)
Есть задумка которую я еще не проверял открыть файл на чтение некий шаблон HTML который нужно вывести прочитать его  и вернуть в переменю.
До вывода переменной с содержание разметки хтмл  и {$var1} объявить переменные и вывести.
Фактически мы получим тоже самое что.
Код

$var1 = 1;
 echo " <b>{$var1}</b>"; 

Если все проканает то функцию из шаблона можно перенести в модуль, добавить проверок если я гружу опять такой тип шаблона то вернуть из временного кеша шаблон и использовать.

Цитата

рекурсия - это алгоритм который в последствие выполнения вызывает себя повторно.

A не в этом смысле сказал, так риторический вопрос был smile

Поидее в этом случае лучше использовать eval, если всё таки будут использоваться примитивные алгоритмы в коде html.

Ксати интересен был бы эксперимент всё же если неморочиться и поставить одну из уже существующих функций:
include_once или require_once. Судя по всему должны работать быстрее, так как логика проверки подключенного файла с уже сформированным байт кодом будет производится непосредственно на платформе самого интерпритатора. Тот же кэш но на уровне интерпритатора и в байт коде. Может быть и не быстрее ... интересно smile

Это сообщение отредактировал(а) Sentox - 25.7.2012, 23:51
PM MAIL   Вверх
Sanchezzz
Дата 26.7.2012, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Цитата

Example #9 Using PartialLoop to Render Iterable Models

Я так понял принцип действия зашит в некой вспомогательном классе с тучей функций которые смотрят по шаблону если строка с  <p>getTree</p> то тут выполнить функцию из определеного зарания в параметрах класса  и подставить результат, это не годится такой подход мудреный  мне не нужен. 
Не вижу плюсов как в скорости разработки так и выполнения.

С таким же успехом я могу оставить рабочий вариант и не переносить функцию обратно в класс и оставить ее в шаблоне.
Да люблю экономю на спичках) 

Цитата

include_once или require_once. Судя по всему должны работать быстрее, так как логика проверки подключенного файла с уже сформированным байт кодом будет производится непосредственно на платформе самого интерпритатора. Тот же кэш но на уровне интерпритатора и в байт коде. Может быть и не быстрее ... интересно 
 не уловил суть если можно небольшой краткий пример ?) 


Это сообщение отредактировал(а) Sanchezzz - 26.7.2012, 08:03


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Sentox
Дата 26.7.2012, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Код

protected static function load_view($cv_view_filename, array $cv_view_data){
    ob_start() and extract($cv_view_data, EXTR_SKIP);
    try{
        // Функция подключит файл единожды и на уровне интерпритатора будет проверять  существование 
        // и из кэша своего вытаскивать уже байт код
        include_once $cv_view_filename;
    }
    catch (Exception $e){
        ob_end_clean();
        throw $e;
    }
        return ob_get_clean();
}

PM MAIL   Вверх
MoLeX
Дата 26.7.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



немного не по теме, но лучше переделать вызов
Код

cv_view::make('/teml/tree.php');
//на
cv_view::make(['teml', 'tree']);


и соответственно
Код

protected static function load_view($cv_view_filename, array $cv_view_data){
$cv_view_filename = implode(DIRECTORY_SEPARATOR, $cv_view_filename);

}



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Sanchezzz
Дата 26.7.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



MoLeX, а зачем переделывать метод подключения ? 
если ты по поводу то что "/teml/tree.php"  явно указывать файл то это временный вариант планируется просто / папка / папка / файл без разрешения или с разведением. 

сам посуди что написать быстрей  ['teml', 'tree']  или нежели просто путь с косой чертой 
а намек что DIRECTORY_SEPARATOR в разных системах разный я уже давно перестал на это обращать внимание.
винда понимает оба варианта пути к файлу и в стили линукс и в собственном 


Sentox, я один фиг не догоняю (((


// инициализация в классе в некой функции которая выводит мне нужный шаблон
Код

$buffer = cv_view::make("/tmpl/tree.php", array(
                'treeComents' => $treeComents,
                'username'   => $username,
                'hashpage'   => $hashpage,
                'count_page' => $count_page,
                'levelMax'   => $levelMax
            ))->render();


вот есть функция зашита в шаблон и там выполняется,  все работает и не дает сбоев просто хочется отделить эту функцию от html.
функцию перетащить в класс а то что разделено  в шаблон.
смотреть с полным открытием 3х блоков это вся одна функция разделил на 3 куска чтобы было более понятно.
Код

function __getTreeComments($parent , $tree , $level = 0,  $levelMax = 12){
        static $coments_list , $level, $lastparent;    
        
        if(is_null($coments_list)){ $coments_list = ''; $level=0; $lastparent =0;}    
        if(!isset($tree[$parent]))    return;
        
        if( isset($tree[$parent]) && $parent>0){
            $level++;
            $lastparent = $parent;
            if($level > $levelMax) $level = $levelMax;
        }
        
        foreach($tree[$parent] as $item):
            if($item['comment_pid']!=$lastparent && $level>0){ 
                $level--;            
                if($level < 0){ $level=0;}
                $lastparent = $item['comment_pid'];
            }
            if($item['comment_pid']==0) $level = 0;
            
                // Уровень
                //$level = isset($item['level'])?$item['level']: 0;    
                //Имя пользователя
                $avtor = 'Guest';
                if(!empty($item['user_guest'])) $avtor = $item['user_guest'];    
                if(!empty($item['user_profile_name'])) $avtor = $item['user_profile_name'];
                //Время UnixTime
                $time = strtotime( $item['comment_date'] );
                //Аватарка
                if(!empty($irem['user_profile_avatar'])) $ava = $irem['user_profile_avatar'];
                if(!empty($irem['user_profile_foto']))   $ava = $irem['user_profile_foto']; 
                
                // Рейтинги, голоса
                //$item['comment_rating'];  $item['user_skill']; 
                
            ?> 


Вот эту часть подключить из файла один раз прогонять в цикле меняя переменный ток)

             
Код
<li class="comm-elements comment-level<?=$level?>" datapid="<?=$item['comment_pid']?>" datalevel="<?=$level?>" dataid="<?=$item['comment_id']?>">
            <div class="icon-top">
                <span class="data"><?=date('d m Y' , $time)?></span>
                <span class="date time"><?=date('H:i' , $time)?></span>
                
                <span class="score">
                    <span class="score-pl"><?=$item['comment_count_plus']?></span>
                    <span class="score-mn"><?=$item['comment_count_minus']?></span>
                </span>
                
                <span class="updown">
                    <span class="l"></span>
                    <span class="r"></span>
                </span>
                
            </div>
            <div class="img" style="background:url(<?=$ava?>) center center no-repeat;">
            <img class="avatar" src="/media/px.gif"></div>
            
            <div class="usertext">
                <div class="h"><span class="ulogin"><?=$avtor?></span><br></div>
                <div class="text">
                <span class="s1"><?=$item['comment_text']?></span>
                    <div class="comm_reply">
                        <span class="l"></span>
                        <span class="txt">Ответить</span>
                        <span class="r"></span>
                    </div>
                </div>
                <div></div>
            </div>
        </li>
    


     
 
Код
  
            <?
            __getTreeComments($item["comment_id"], $tree , $level);    
        endforeach;
        //отдача
        return;    
    }
?>

<ul>
<?
__getTreeComments(0 , $treeComents,0 , $levelMax);
?>
</ul>
 


Это сообщение отредактировал(а) Sanchezzz - 26.7.2012, 14:10


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 26.7.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Sanchezzz @  25.7.2012,  11:07 Найти цитируемый пост)
Как справляются громоздкие фреймворки уяя, кохан, зендя итд с такой задачей как повторное использование шаблона с новыми параметрами в рекурсии ?

imho, фреймворки достаточно мудры, чтобы доверить эту операцию шаблонизаторам.

В twig, например, пишешь макрокоманду, или блок и используешь ее повторно хоть в цикле, хоть в рекурсии. Дальше транслятор языка шаблонов порождает php, в котором каждый код является функцией некоего класса и все конструкции шаблона - конструкциями php.


Цитата(Sanchezzz @  25.7.2012,  22:07 Найти цитируемый пост)
В данной реализации меня не устраивает то что для каждой итерации в цикле в модели построения дерева подключается файл шаблона.


Можно пользоваться функцией create_function.

Код

function Compile($name){
  return  create_function('$cv_view_data','
    extract($cv_view_data, EXTR_SKIP);'<'.'?php 
'.file_get_contents($name).'
?'.'>');

}

Будет что-то типа compile в регулярках Javascript. Иногда - полезно...
Можно пойти дальше и смастерить готовый "откомпилированный" php в виде класса, где каждый шаблон - отдельный метод. Нет пределов извращениям совершенству  smile 
 

Это сообщение отредактировал(а) ksnk - 26.7.2012, 15:51


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0941 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.