Как сделать аналог Blitz::fetch для PHP-native шблона ?

AmdY

Пью пиво
Команда форума
Вурдалак
чтобы эта переменная не попала в нэймспэйс шаблона, но это нужно смотреть остальной код, возможно там это всё равно не получится и unset - оставшийся при рефакторинге мусор.

-~{}~ 04.04.10 20:49:

Fortop
ага, только так контроллер делает то, чем должен заниматься view. Я сам делаю примерно так, фетчу в переменную, но это не есть хорошо. проще для подшаблонов вызывать вывод прямо в шаблоне, а шабюлонизатор просто клонировать и забивать переменными только для этого шаблона.

-~{}~ 04.04.10 20:51:

в Zend_View есть layout для таких вещей
 

nerezus

Вселенский отказник
Можно узнать задачу?
Не "как помочь с костылем для ххх", а "как сделать ххх"?
 

Fortop

Новичок
AmdY
ага, только так контроллер делает то, чем должен заниматься view.
Эта был пример логики не в контролере, а в шаблонах для подключения подшаблонов.
 

HraKK

Мудак
Команда форума
Вурдалак
затем что далее следует вывод шаблона где в локальном scope можно будет его заюзать.

-~{}~ 05.04.10 03:19:

AmdY
подшаблонов вызывать вывод прямо в шаблоне
и я так делаю не вижу как это противоречит концепции блоков - как по мне даже лучше реализует.
 

AmdY

Пью пиво
Команда форума
HraKK
ага. я тоде так считаю лучше, но это исторически сложившаяся привычка говнокодить :(
 

fisher

накатила суть
возможно я щас скажу ерунду, но по-моему задача вовсе не решается, то есть в эту сторону вообще не надо думать. в blitz можно прямо в шаблоне сделать фетч другого блока из _этого_ же шаблона. иначе как функцией в нативном шаблоне этого не сделать. но вложенные блоки в функции не превратить. что и требовалось доказать.
 

fixxxer

К.О.
Партнер клуба
ну почему не превратить, я вот пример подхода к вопросу привел (только чото никто не понял кажется, ну короче смысл в стеке+рекурсии и генерации карты путь к блоку -> имя метода).

другой вопрос зачем. :)

-~{}~ 09.04.10 22:26:

и кстати нахрена фетчить самого себя? =) это такая замена layout-ов, которые в тех же django/twig делаются наследованием? ;)

ну собственно тоже прекрасно мапятся все вызовы - компиляем в class __Template_<md5(name)> extends Blitz...
 

pilot911

Новичок
Автор оригинала: fixxxer
и кстати нахрена фетчить самого себя? =) это такая замена layout-ов, которые в тех же django/twig делаются наследованием? ;)
фетчить себя для того, чтобы не дублировать шаблон, например, в выводе результатов опросов через ajax после голосования и обычным списком
 

pilot911

Новичок
Автор оригинала: fixxxer
не, себя в смысле
{{ fetch('/block') }}
это иногда необходимо для многоуровнего меню в виде дерева, когда уровни в шаблоне невложенные, а просто в виде блоков один за другим
 

fisher

накатила суть
я ошибся! HraKK прав. я рассматривал случай с прекомпиляцией, без него не интересно. когда происходит прекомпиляция, блок очевидно должен бы превартиться в if или foreach. и дальше у меня было "вложенные блоки в функции не превратить" - это логически неверно и потому, что превратить, и потому, что не надо функции.

например, вложенные блоки
{{ BEGIN list }}
begin list {{ $a }}
{{ BEGIN item }}
something {{ $b }}
{{ END item}}
end list {{ $c }}
{{ END list }}

могут быть превращены в такой прегенеренный код (возможно с кодом для элемента можно поэлегантнее без дублирования - не суть)
Код:
<?

if ($list) {

?>
begin list <?= $a ?>
<?
    if (is_array($list)) {
        foreach ($list) {
?>
something <?= $b ?>
<?
        }
    } else {
?>
something <?= $b ?>
<?
    }
?>
end list <?= $c ?>
<?
}
?>
и затем фетч может быть осуществлен так
- приготовить специальную структуру для итераций, положить в стек
- просто заинклюдить с тем что по стеку: взали со стека итерацию, в отдельную функцию передали чтобы скоп был чистый, заэкспортировали итерации, закспортировали глобальные, и просто инклюд шаблона
- вернуться по стеку к предыдущим значениям

>>ну почему не превратить, я вот пример подхода к вопросу привел
да, я ни хрена не понял в этом. это похоже на то что я написал?
 

fixxxer

К.О.
Партнер клуба
да по сути то же самое, только я распихал блоки по методам а ты их окружил ифами.

вобщем то твой способ проще и работать быстрее будет, это у меня уже ООП головного мозга =)
 

fisher

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

fixxxer

К.О.
Партнер клуба
а если ограничиться php 5.3 то кстати можно просто наставить меток и делать goto ;)
 

pilot911

Новичок
Автор оригинала: fisher
я ошибся! HraKK прав. я рассматривал случай с прекомпиляцией, без него не интересно. когда происходит прекомпиляция, блок очевидно должен бы превартиться в if или foreach. и дальше у меня было "вложенные блоки в функции не превратить" - это логически неверно и потому, что превратить, и потому, что не надо функции.

например, вложенные блоки
{{ BEGIN list }}
begin list {{ $a }}
{{ BEGIN item }}
something {{ $b }}
{{ END item}}
end list {{ $c }}
{{ END list }}

могут быть превращены в такой прегенеренный код (возможно с кодом для элемента можно поэлегантнее без дублирования - не суть)
Код:
<?

if ($list) {

?>
begin list <?= $a ?>
<?
    if (is_array($list)) {
        foreach ($list) {
?>
something <?= $b ?>
<?
        }
    } else {
?>
something <?= $b ?>
<?
    }
?>
end list <?= $c ?>
<?
}
?>
и затем фетч может быть осуществлен так
- приготовить специальную структуру для итераций, положить в стек
- просто заинклюдить с тем что по стеку: взали со стека итерацию, в отдельную функцию передали чтобы скоп был чистый, заэкспортировали итерации, закспортировали глобальные, и просто инклюд шаблона
- вернуться по стеку к предыдущим значениям

>>ну почему не превратить, я вот пример подхода к вопросу привел
да, я ни хрена не понял в этом. это похоже на то что я написал?
по этому шаблону

{{ BEGIN list }}
begin list {{ $a }}

{{ BEGIN item }}
something {{ $b }}
{{ END item}}

end list {{ $c }}
{{ END list }}

допустим, надо извлечь fetch('/list/item')

данные подготовили в виде

PHP:
array['list'][0]['item'][0]['b'] = 1;
array['list'][0]['item'][1]['b'] = 2;
array['list'][0]['item'][2]['b'] = 3;
array['list'][0]['item'][3]['b'] = 4;

и как выглядит функция, обрабатывающая такой массив для получения лишь блока

{{ BEGIN item }}
something {{ $b }}
{{ END item}}

не представляю, ведь begin list <?= $a ?> будет выводится всегда

-~{}~ 12.04.10 01:25:

Автор оригинала: fixxxer
а если ограничиться php 5.3 то кстати можно просто наставить меток и делать goto ;)
можно :)
хорошая идея, но не очень надежная, поскольку в какой-нибудь следующей версии могут goto отменить и придется перелопачивать кучу кода
 

fisher

накатила суть
>>не представляю, ведь begin list <?= $a ?> будет выводится всегда
упс, косяк. похоже я сам забыл, как фетч работает.
 

stanlee

Новичок
Ребят, а чем закончилось все?
Тоже интересует решение под зендовый фрейм
пытаюсь пока но как то не так
 

newARTix

Новичок
Я под зендом делаю вложенный шаблон (можно include, чтобы сохранить нэймспейс, можно partial чтобы вставить полностью самостоятельный блок) и не парюсь как это делают в других системах. Можно конечно придумать какой-нить хелпер или еще чего-нибудь намутить, но настолько остро эта "проблема" пока не вставала.

Для AJAX есть опять же layout, есть jQuery с его XPath, можно вставить блок просто как функцию. Инструментов более чем достаточно. Всё зависит от нюансов и удобства в каждом конкретном случае.

PS Кстати щас подумал... дык наверняка к Zend_View можно сделать fetch который будет выбирать блоки по определенным меткам. Хм... это могло бы быть удобным... и делов на полчаса.
 
Сверху