Прервать выполнение шаблона Smarty

PHProgress

Новичок
Добрый день.

Есть php - файл в котором создаю задаю параметры подключения smarty.
И есть сам шаблон.

Возможно ли как-то прервать обработку шаблона (в самом шаблоне) и сделать print and exit...
Прост если так делаю...

То у меня почему-то выводится кусок шаблона до print & exit и сам этот print...

Т.е. есть шаблон:

PHP:
<b>Текст до</b>
<b>Текст до</b>
<b>Текст до</b>


{php}

// здесь нужно прервать выполнение шаблона
// можно в функции, а можно в php-где подключаю сам smarty - через создание плагина
// и добавления вставки {exitMyFunc}
  print "Выполнение шаблона прервано!";
  exit();

{/php}

<b>Текст после</b>
<b>Текст после</b>
<b>Текст после</b>

Если я так делаю: то выводится:

HTML:
<b>Текст до</b>
<b>Текст до</b>
<b>Текст до</b>
Выполнение шаблона прервано!

А надо что бы выводилось просто "Выполнение шаблона прервано!".


--
 

С.

Продвинутый новичок
Это с какой вдруг стати шаблон сам принимает решение, выполняться ему или нет? Ты хочешь неправильного.
 
  • Like
Реакции: AmdY

PHProgress

Новичок
если только через буфер выплевывать.
И как это вомзожно сделать?

Это с какой вдруг стати шаблон сам принимает решение, выполняться ему или нет? Ты хочешь неправильного.
Есть такая потребность из-за установления 404-ошибки на странице по ходу разбора...
 

PHProgress

Новичок
У тебя нет такой потребности.
Если бы не было - не писал.
Потребность есть.
У меня есть плагин:
PHP:
<!--Извлекаем данные из таблицы tt_content_article-->
								{mysql_exec
									
										type=SELECT 
										item=dampitem_last_article
										table=tt_content_article where="pid = 4" 
										addWhereSpecialFields=1 
										field="*" 
										orderBy="crdate DESC"
										limit=1
										
								}

Если запрос ошибочный (не верная выборка) - мне нужно устанавливать 404-страницу...
В этом плагине (который написан на php).

проблема в том, что если я там (в этом плагине) - делаю print 1; exit; - то выводится еще кусок кода шаблона - Т.е. все то, что идет выше print 1; exit();
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Вот тут я подавился своим недорогим мускатом шато мухрани, и понял: вот он, живой пример того, что вы хоть завнедряйте шаблонизаторы — пиздец неизбежен!
 

PHProgress

Новичок
Вот тут я подавился своим недорогим мускатом шато мухрани, и понял: вот он, живой пример того, что вы хоть завнедряйте шаблонизаторы — пиздец неизбежен!
Мне понадобилось делать 1-у и туже вещь сто раз...
Был выбран данный подход через разработку плагина (mysql_exec).

Вместо того, что бы каждый раз составлять шаблонный mysql-запрос (где меняются условия выборки, имя таблицы и прочее) - я сделал такой плагин для SMARYTY . и им пользуюсь.

Как вариант решения данной проблемы - нашел следующий подход...
Я объявляю константу в данном плагине - если есть ошибка выборки...

И в php-smarty - проверяю ее наличие (константы)...
Если есть ошибка...
Я прекращаю вывод контента. и отдаю 404-ошибку.

Но проблема в том, что у меня часть шаблона будет идти дальше...
А в этом нет потребности - нужно прервать его вывод...

Может быть я скажу дикость...
Но у меня еще идет шаблон SMARTY в SMARTY... и так далее...
По этой причине я и ищу способ прервать его выполнрение и отдать 404-ошибку.
 

Вурдалак

Продвинутый новичок
Верный — сформировать эти данные ещё до вызова шаблона. Там же ты поймёшь нужно ли отдавать 404 или нет.
 

PHProgress

Новичок
Верный — сформировать эти данные ещё до вызова шаблона. Там же ты поймёшь нужно ли отдавать 404 или нет.
И объясняю же---
Что не могу так сделать.
Задача однотипная.

Я бы с удовольствием так сделал... В самом php-где вызываю SMARTY display
Но проблема в том, что я не могу так делать для данной задачи.
 

С.

Продвинутый новичок
Но проблема в том, что я не могу так делать для данной задачи.
Сделать правильно ты не можешь. Сделать неправильно ты тоже не можешь.
Почему же тогда при двух равноценных проблемах ты настаиваешь, чтобы тебе помогли написать именно говнокод?
 

PHProgress

Новичок
Сделать правильно ты не можешь. Сделать неправильно ты тоже не можешь.
Почему же тогда при двух равноценных проблемах ты настаиваешь, чтобы тебе помогли написать именно говнокод?
Интересно - а с чего это Вы решили что у меня будет говно код?
У меня будет говно код - если я буду в каждом однотипном решении фигацить еще php mysql select?

Не для того ли они нужны - плагины?
 
  • Like
Реакции: AmdY

WMix

герр M:)ller
Партнер клуба
все проще,
сначало до того места где идет у тебя вызов SMARTY display, нужно собрать все данные.
убедится что они собираются (никакого дизайна только логика) и если нет вызывать свой 404.
а если собрались их нужно в шаблоне просто обернуть html тегами (никакой логики только дизайн).

иначе ты всеравно пишешь и логику и дизайн, но все происходит через заднее отверстие.
 

AmdY

Пью пиво
Команда форума
PHProgress
как ни странно, я тебя поддерживаю. имхо, делать запрос к модели из шаблона допустимо. только это должен быть селект запрос и метода модели, а не произвольный sql. Если интересно, могу завтра рассказать, а то сейчас под пивом после 2 часов борьбы с линзами.

По задаче, тебе нужно не выводить результат, а ассайнить его в переменную.
PHP:
{mysql_exec
                                    
                                        type=SELECT 
                                        item=dampitem_last_article
                                        table=tt_content_article where="pid = 4" 
                                        addWhereSpecialFields=1 
                                        field="*" 
                                        orderBy="crdate DESC"
                                        limit=1
                                        assign="articles" // та-та-та
                                }
{if $articles}....{else}...{/if}
 

keltanas

marty cats
ИМХО, лучше сделать плагин, который будет вызывать какую-то произвольную Command. А уже из этой Command выполнять запросы, обрабатывать представление этой Command и выдавать обратно в шаблон.
При чем тогда лучше всего в этой Command генерить 404 Exception, который где-то на более высоком уровне будет перехвачен и отображен в виде красивой ошибки.
 

PHProgress

Новичок
PHProgress
как ни странно, я тебя поддерживаю. имхо, делать запрос к модели из шаблона допустимо. только это должен быть селект запрос и метода модели, а не произвольный sql. Если интересно, могу завтра рассказать, а то сейчас под пивом после 2 часов борьбы с линзами.

По задаче, тебе нужно не выводить результат, а ассайнить его в переменную.
AmdY
Наконец-то нашелся человек, который понял, что я хочу сделать и почему именно так...
Очень интересно расскажите...

Именно на это мой плагин и расчитан.
Он извлекает данные из БД и айсит данные.
После их в шаблоне я вывожу через foreach.

Вот пример выборки (список сотрудников):
Но проблема в том, что мне нужно как еще туда и 404-ошибку устанавливать в случае не верно выбранных данных - в самом плагине. Если я так сделаю (а это будет print & exit)... То все что выше моего плагина {mysql_exec} - например еще какие-то куски шаблона - будет выведено также до print & exit - что не нужно.. (т.к. это лишнее).

PHP:
			<!--Извлекаем данные из таблицы tt_content_worker-->
			{mysql_exec
			
				type=SELECT 
				item=dampitem 
				table=tt_content_worker 
				where="pid = 41" 
				addWhereSpecialFields=1 
				field="*" 
				orderBy=sorting 
				
			}
			
			<!--Церез цикл извлекаем данные-->
			{foreach from=$dampitem key=k item=value}
			<div class="tt_content_worker_element">
				
				<div class="tt_content_worker_left_column">
					
					<p align="center">
					<img src="{$value.photo}" align="top" class="tt_content_worker_photo"></p>
					
				</div>
				
				<div class="tt_content_worker_right_column">
				
					<font color="#82847e" face="Georgia" size="5">{$value.name}</font><br /><br />
					<b>{$value.position}</b><br /><br />
						
						<i>Образование:</i> {$value.education}<br />
						<i>Факультет:</i> {$value.faculty}<br />
						<i>Кафедра:</i> {$value.chair}<br />
						
						<br />
						{$value.bodytext}
					
				</div>
			
				<div style="clear: left;"></div>
				
			</div> 	<br />
			{/foreach}
 

PHProgress

Новичок
все проще,
а если собрались их нужно в шаблоне просто обернуть html тегами (никакой логики только дизайн)..
Не совсем понял как это имеется в виду?

ИМХО, лучше сделать плагин, который будет вызывать какую-то произвольную Command. А уже из этой Command выполнять запросы, обрабатывать представление этой Command и выдавать обратно в шаблон.
При чем тогда лучше всего в этой Command генерить 404 Exception, который где-то на более высоком уровне будет перехвачен и отображен в виде красивой ошибки.
И как это можно создать применительно к плагину Smarty?
 
Сверху