Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Libraries > php код в smarty


Автор: niaz 15.8.2008, 08:19
Уже давно не могу понять как рализовать 2 решения!

1) передавать в assign не переменню а код php чтобы он сначала выполнился передался шаблону для вывода:
(примерное такое)
Код

$smarty->assign("content", echo"test";);


1) передавать в assign не переменню а код php чтобы он выполнился в шаблоне:
(примерное такое)
Код

$smarty->assign("content", echo"test";);


Я знаю что можно добавить код php  в шаблон методом {php}{/php}. Но я же не могу воткнуть весь код сайта в шаблон.

Автор: Feldmarschall 15.8.2008, 08:38
код надо сначала выполнить, получить его результат в переменную, и эту переменную передавать в смарти.
неужели это не является очевидным при просмотре любых примеров приложений, работающих со смарти?

Автор: solenko 15.8.2008, 08:39
1. Можете объяснить зачем вы используете smarty?
2. Можете привести реальный пример того, что вы спрашиваете?


Автор: niaz 15.8.2008, 09:34
Цитата(Feldmarschall @ 15.8.2008,  08:38)
код надо сначала выполнить, получить его результат в переменную, и эту переменную передавать в смарти.
неужели это не является очевидным при просмотре любых примеров приложений, работающих со смарти?

Примеры приложений я не нашел.

Добавлено через 1 минуту и 45 секунд
Цитата(solenko @ 15.8.2008,  08:39)
1. Можете объяснить зачем вы используете smarty?
2. Можете привести реальный пример того, что вы спрашиваете?

1.) Смарти использую для шаблона своего портала. А вы что все делаете без шаблона? Можете привести пример?
2.) Пример я привел выше в первом посте.

Автор: solenko 15.8.2008, 09:44
niaz, А зачем вам шаблон? Я не использую шаблонов, но суть не в этом.
А в первом примере вы привели двух сферических коней. Например
Код

$smarty->assign("content", echo"test";);

эквивалентно
Код

echo "test";

Автор: Anarki 15.8.2008, 10:38
Цитата(niaz @  15.8.2008,  11:19 Найти цитируемый пост)
1) передавать в assign не переменню а код php чтобы он сначала выполнился передался шаблону для вывода:
(примерное такое)
код PHP
1:
    
$smarty->assign("content", echo"test";);

Смысла в echo "test" тут нет, нужно в php скрипте подготавливать данные для вывода в шаблон
Код

$smarty->assign("content","test");



Цитата(niaz @  15.8.2008,  11:19 Найти цитируемый пост)
1) передавать в assign не переменню а код php чтобы он выполнился в шаблоне:
(примерное такое)
Выделить всёкод PHP
1:
    
$smarty->assign("content", echo"test";);


Я знаю что можно добавить код php  в шаблон методом {php}{/php}. Но я же не могу воткнуть весь код сайта в шаблон. 

Чтобы код выполнился в шаблоне только через {php}{/php},  а вообще зачем он там нужен не хватает что ли конструкций смарти?  smile 

Автор: Feldmarschall 15.8.2008, 11:07
niaz, http://www.smarty.net/manual/ru/
там есть примеры.

но суть я, по-моему, уже объяснил.

не 
Код

$smarty->assign("content", $r = mysql_query('SELECT * FROM имя_таблицы'); echo  mysql_num_rows($r););

а
Код

$r = mysql_query('SELECT * FROM имя_таблицы');
$num=mysql_num_rows($r);
$smarty->assign("content", $num);

это, надеюсь, не слишком сложно для понимания?

Автор: niaz 15.8.2008, 11:31
Нверное я неправильно выразился! Ну ладно попробую еще раз все обьяснить:
Вот сам код шаблона:
Код

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<title>{$title}</title>
<META name="DESCRIPTION" content="{$description}">
<META name="KEYWORDS" content="{$keywords}">

<link href="/my.css" rel="stylesheet" type="text/css">

</head>

<body>
      {$content} 
</body>
</html>


А вот теперь сам код сценария smarty:

Код

<?php

require './Smarty/Smarty.class.php';

$smarty = new Smarty;

$smarty->compile_check = true;
$smarty->debugging = false;

$smarty->assign("title",'Мой сайт');

$smarty->assign("description",'сайт');

$smarty->assign("keywords",'познавательный сайт');

$smarty->config_load('site.conf','my');

$smarty->assign("glava",'раздел');

$smarty->assign("content", "мой php код");

$smarty->display('index.tpl');

?>


Мне охота выполнить в сценарии какой либо код либо функцию, чтобы результат вышел в шаблоне в блоке ($content). Код может быть любой: данные из базы, или отправка почты и .т .п. У меня есть страницы статистические, т.е. содержание не меняется, тогда я просто через:

Код

$smarty->assign("content", "html");


просто передаю весь html теги данных и все.

если я в шаблоне укажу {php}{/php} то ведь шаблон будет расти, и у страниц ведь разные коды. Точнее говоря я пишу портал: там есть обьявления, новости, фотки и все такое. А шаблон ведь один. Я же не могу весь код портала занести в {php}{/php} в шаблоне. Сами подумайте что тогда получиться. Пожалуйста обьясните по подробней.

Автор: Feldmarschall 15.8.2008, 12:10
Ты не ответил на вопрос, зачем тебе смарти.
"он мне нужен для шаблона" - это не ответ.
судя по всему, ты не понимаешь, для чего нужны шаблоны. В этом случае тебе вообще не нужно ими пользоваться.
"шаблон" тебе нужен для того, чтобы не писать 10 раз <html xmlns="http://www.w3.org/1999/xhtml">?

ну так возьми свой "шаблон", пропиши в него все свои титлы и кейворды, и просто инклюдь в свой портал.
Код

include "shablon.html";

вот и все.


Автор: niaz 15.8.2008, 12:19
Цитата(Feldmarschall @ 15.8.2008,  12:10)
Ты не ответил на вопрос, зачем тебе смарти.

Шаблон мне нужен чтобы дизайн страниц был одинаков. Прикинь если на сайте 200 страниц и в каждом прописан дизайн. А если захочешь поменять стиль одной буквы или таблицы, тогда ваще пипец. Вот и использую чтобы дизайн отделить от програмного кода пхп. Можно уже дизайн менять одним кликом если нужно. А ты сам как делаешь? Или ваще ничего сам не пробовал создавать?

Автор: niaz 18.8.2008, 09:14
вы не поняли меня! Повторю вопрос снова!
Вот приведу пример синтаксиса Smarty:

Код

<?php

require './Smarty/Smarty.class.php';

$smarty = new Smarty;

$smarty->compile_check = true;
$smarty->debugging = false;

$smarty->config_load('my.conf','test');

$smarty->assign("title",'Мой сайт');

$smarty->assign("description",'Описание');

$smarty->assign("keywords",'ключи');


function test()
{
echo 'test';
}

$smarty->display('index.tpl');

?>


и приведу код шаблона.

Код

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>{$title}</title>
<META name="DESCRIPTION" content="{$description}">
<META name="KEYWORDS" content="{$keywords}">

<link href="/my.css" rel="stylesheet" type="text/css">


</head>

<body>

{$content}

</body>
</html>


мне охота чтобы функция test() выполнилась и результат отображался в шаблоне в переменной {$content}

Добавлено через 3 минуты и 48 секунд
Не уж то в Smarty нет простого решения. Как тогда пользуется весь мир? Вроде внимательно прочитал весь мануал!

Наверное есть один выход, написать свой шаблонизатор! Раньше так и делал. Не надо было переходить в Смарти.

Автор: solenko 18.8.2008, 09:24
Код

$smaty->assigne('content', test());
function test() {
  return 'test';
}


Код

ob_start();
test();
function test() {
  echo 'test';
}
$smaty->assigne('content', ob_get_contents());


Добавлено через 2 минуты и 10 секунд
Цитата(niaz @  18.8.2008,  08:14 Найти цитируемый пост)
Наверное есть один выход, написать свой шаблонизатор! Раньше так и делал. Не надо было переходить в Смарти.

Есть еще более верное решение -- написать свой php

Автор: Feldmarschall 18.8.2008, 10:33
solenko, очень, очень умное решение. Шаблоны и буфферинг только для этого и придуманы были. 

Автор: niaz 18.8.2008, 12:24
а как передать такой код? ob_get_contents() - ом не получается, почему то код выполняется 2 раза!
Код

if(isset($Submit))
{
send_mail();
}
else
{
form_mail();
}

function send_mail()
{
$to_email="mail@mail.ru";
$subject=$_POST['subject'];
$msg=$_POST['msg'];
$email=$_POST['email'];

   if(eregi("^[a-zA-Z0-9\._-]+@[a-z0-9\._-]+\.[a-z]{2,4}\$",$email))
   { 
             if(empty($subject))
             {
             echo '<div align="center">Введите ваше имя</div></br>';
             form_mail();
             }
             else 
             { 
                             if(empty($msg))
                             {
                             echo '<div align="center">Введите текст сообщения</div></br>';
                             }
                             else
                             { 
                                mail ($to_email,$subject,$msg,
                                "Content-type: text/html; charset=windows-1251\n". 
                                "From: $email\n".                                
                                "Reply-To: $emaip\n".
                                "Content-type: text/html; charset=windows-1251"
                                );
                                echo '<div align="center">Ваше письмо отправлено!</div></br>';
                                form_mail();
                             }
             }
             
   } 
   else
   {
   echo '<div align="center">E-mail неправильно введен или содержит недопустимые символы. Пожалуйста вернитесь и заполните все поля правильно</div></br>';
   form_mail();
   }

}

function form_mail()
{
echo'
<table width="97%" cellpadding="5" cellspacing="0">
          <tr>
            <td width="14%"></td>
            <td valign="top"><p align="left">Ваши вопросы.</p>
                <form name="form1" method="post" action="">
                  <table width="300">
                    <tr>
                      <td>Ваше имя: </td>
                    </tr>
                    <tr>
                      <td><input name="subject" type="text"></td>
                    </tr>
                    <tr>
                      <td>Ваш e-mail:</td>
                    </tr>
                    <tr>
                      <td><input type="text" name="email"></td>
                    </tr>
                    <tr>
                      <td>Текст письма: </td>
                    </tr>
                    <tr>
                      <td><textarea name="msg" cols="60" rows="10"></textarea></td>
                    </tr>
                    <tr>
                      <td height="5">&nbsp;</td>
                    </tr>
                    <tr>
                      <td><input type="submit" name="Submit" value="Отправить"></td>
                    </tr>
                  </table>
                </form><p align="justify">&nbsp;</p></td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td valign="top">&nbsp;</td>
          </tr>

        </table>';
}



Автор: solenko 18.8.2008, 12:25
Feldmarschall, естественно для этого! А вы сомневались? А что, их можно еще для чего-то использовать?
Выше 10 упоминаний того, как сделать правильно. В моем последнем посте одно упоминание того как сделать правильно. Человек хочет  делать неправильно -- это его проблеммы.

Автор: Feldmarschall 18.8.2008, 12:31
solenko, вместо того, чтобы ставить человека костыли, да еще и вниз головой, надо ему объяснить, что он не понимает, что такое шаблон. Он не знает, что у страницы тоже бывает шаблон, так же, как у всего сайта. Он сделал шапку, назвал её шаблоном, и не хочет ничего больше слушать. Полагая, что знает больше всех. 
Так вот, ему надо объяснять, что в данном случае смарти ему нужен, как рыбке зонтик. Если он не использует его по назначению, для шаблонов страниц. Одного не послушал - может быть, к 10 прислушается.
А с твоим подходом - давай, рассказывай ему, как целиком готовый скрипт, со всеми его запусками, засунуть в шаблон сайта.

Автор: niaz 18.8.2008, 12:43
вы не поняли меня! у меня на сайте один шаблон страницы! приведу пример
вот он (просто скопировал без внутренних менюшек и прочемм) index.tpl:

Код

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{$title}</title>
<META name="DESCRIPTION" content="{$description}">
<META name="KEYWORDS" content="{$keywords}">
<link href="/my.css" rel="stylesheet" type="text/css">
</head>
<body>
      {$content} 
</body>
</html>


мне хочеться чтобы результат следующего кода был в {$content} . Ребята может я и php плохо знаю. Но очень надо пишу для себя крупный портал и пишу уже давно. Не хотелось бы все переписывать!
вот код сценария целиком:

Код

<?php

require './Smarty/Smarty.class.php';

$smarty = new Smarty;

$smarty->compile_check = true;
$smarty->debugging = false;

$smarty->assign("title",'');

$smarty->assign("description",'');

$smarty->assign("keywords",'');

$smarty->assign("den",'3 days');

$smarty->config_load('my.conf','zakaz');

$smarty->assign("glava",'');

/* отсюда начинается код */

if(isset($Submit))
{
send_mail();
}
else
{
form_mail();
}

function send_mail()
{
$to_email="mail@mail.ru";
$subject=$_POST['subject'];
$msg=$_POST['msg'];
$email=$_POST['email'];

   if(eregi("^[a-zA-Z0-9\._-]+@[a-z0-9\._-]+\.[a-z]{2,4}\$",$email))
   { 
             if(empty($subject))
             {
             echo '<div align="center">Введите ваше имя</div></br>';
             form_mail();
             }
             else 
             { 
                             if(empty($msg))
                             {
                             echo '<div align="center">Введите текст сообщения</div></br>';
                             }
                             else
                             { 
                                mail ($to_email,$subject,$msg,
                                "Content-type: text/html; charset=windows-1251\n". 
                                "From: $email\n".                                
                                "Reply-To: $emaip\n".
                                "Content-type: text/html; charset=windows-1251"
                                );
                                echo '<div align="center">Ваше письмо отправлено!</div></br>';
                                form_mail();
                             }
             }
             
   } 
   else
   {
   echo '<div align="center">E-mail неправильно введен или содержит недопустимые символы. Пожалуйста вернитесь и заполните все поля правильно</div></br>';
   form_mail();
   }

}

function form_mail()
{
echo'
<table width="97%" cellpadding="5" cellspacing="0">
          <tr>
            <td width="14%"></td>
            <td valign="top"><p align="left">Ваши вопросы.</p>
                <form name="form1" method="post" action="">
                  <table width="300">
                    <tr>
                      <td>Ваше имя: </td>
                    </tr>
                    <tr>
                      <td><input name="subject" type="text"></td>
                    </tr>
                    <tr>
                      <td>Ваш e-mail:</td>
                    </tr>
                    <tr>
                      <td><input type="text" name="email"></td>
                    </tr>
                    <tr>
                      <td>Текст письма: </td>
                    </tr>
                    <tr>
                      <td><textarea name="msg" cols="60" rows="10"></textarea></td>
                    </tr>
                    <tr>
                      <td height="5">&nbsp;</td>
                    </tr>
                    <tr>
                      <td><input type="submit" name="Submit" value="Отправить"></td>
                    </tr>
                  </table>
                </form><p align="justify">&nbsp;</p></td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td valign="top">&nbsp;</td>
          </tr>

        </table>';
}

/* здесь заканчивается код*/

$smarty->assign('content', '');


$smarty->display('index.tpl');

?>


это один из страниц

Добавлено через 48 секунд
Надеюсь теперь вы меня поймете, чего на самом деле я хочу.

Автор: Feldmarschall 18.8.2008, 12:45
об этом и речь. его никто не понимает. его.
сам он вообще ничего не слышит, даже не читает. а вот его - такого гениального, и с уникальными проблемами - никто не понимает. жестокие бессердечные люди.

Автор: niaz 18.8.2008, 12:54
Цитата(Feldmarschall @ 18.8.2008,  12:45)
об этом и речь. его никто не понимает. его.
сам он вообще ничего не слышит, даже не читает. а вот его - такого гениального, и с уникальными проблемами - никто не понимает. жестокие бессердечные люди.

Feldmarschall ты не прав. Я да признаю что не верно написал. Говорят "хочешь услышать умный ответ, задай умный вопрос". 
Вот с эти у меня проблемы, наверное я не могу спросить красиво. В последнем посте я уже полностью привел код. У меня ваще такое чувство что кроме меня нафиг никто не использует Smarty. Так мало примеров в инете и форумов нет (кроме английского на оф сайте).

Я все внимательно читаю и пробую. Я уже весь смарти разворотил. Может все решается какой то функцией самого php который мне не известен. Честно говоря уже голова кругом.

Автор: Feldmarschall 18.8.2008, 13:08
Я тебе в третий раз повторяю - тебе не нужен шаблонизатор смарти.  Ты просто не понимаешь, зачем он нужен.
Этот ы его не используешь, а не "все".

Та "волшебная функция", о которой ты говоришь - это нарисовать шаблон страницы отправки емейла в смарти!
То есть, переделать весь твой "портал". Чего ты, разумеется, не хочешь.
В этом случае я предлагаю тебе самое простое решение - отказаться от смарти вообще.

Автор: solenko 18.8.2008, 13:14
Feldmarschall, ну что ж, попробуй занятся просвятительной работой а не сказать "я ценю свое время", как обычно.
//ушел за попкорном

niaz, Я удивляюсь, почему так мало инфы по использованию персональных компьютеров для вспашки земли. Такое впечатление, что только я использую в качестве плуга системник.

http://www.smarty.net/manual/ru/language.function.include.php
вы этот раздел документации читали? Не натолкнуло на мысль, что можно иметь более одного шаблона?

Автор: niaz 18.8.2008, 13:36
solenko да я читал этот раздел! И честно говоря в данное время так и поступаю! Но тогда приходиться держать десятка файлов шаблона. А я хочу оставить шаблон только 1 и все.

Автор: Feldmarschall 18.8.2008, 13:43
Не "приходится". Держать десяток файлов шаблона - это именно то, для чего были придуманы шаблонизаторы.
Если тебе не хочется - нет проблем - не используй шаблонизатор вовсе.
То, что тебе нужно, делается двумя инклюдами.

Автор: niaz 18.8.2008, 13:54
Feldmarschall ты прав! Я раньше инклудил и хотел попробовать раз все блоги и форумы хвалили этот шаблонизатор. Но оказалось полезного там нет, а все наоборот муторно раз никто им не пользуется. Придется все переписывать и переделывать, думаю за месяцев 4 закончу. Спасибо всем кто помагал и советовал. Но тему оставлю открытым, вдруг кто найдет решение и надумает поделиться.

Автор: Feldmarschall 18.8.2008, 13:57
Полезное там есть. Ты просто не понимаешь, для чего нужен шаблонизатор. 
Он нужен для того, чтобы разделить логику приложения и отображения.
А ты думаешь, что он нужен для того, чтобы сделать шапку сайта в одном файле.
Со временем поймешь. Возможно.

Автор: niaz 21.8.2008, 21:08
Вот я и вернулся написать ответ. Почему то к сожалению либо модератор либо администратор удалил мои посты в другой теме. Раз никто из здешних профессионалов не смогли ответить, решил искать ответ сам. И знаете как советовал Фельдмаршал сам догадался.

Все очень просто, если хотите чтобы ваш php код обрабатывался в шаблоне то надо сделать следующее: весь php код вписываете в функцию в синтаксисе Smarty:

Код

function test() 
{
echo 'test';
}


а в шаблоне пишем следующее:
Код

{php}
test();
{/php}


и все. Фельдмаршал, теперь обращаюсь тебе, пожалуйста не сори постами мою тему.

Автор: skyboy 21.8.2008, 21:31
niaz, насчет функции - это, надеюсь, шутка?

Автор: niaz 22.8.2008, 06:24
Цитата(skyboy @ 21.8.2008,  21:31)
niaz, насчет функции - это, надеюсь, шутка?

Почему шутка? В чем? А какое решение этой проблемы у тебя?

Автор: Feldmarschall 22.8.2008, 09:22
Этот топик интересен уже не в области технологии, а в области столкновения мировоззрений.
С одной стороны мы имеем мировоззрение "все можно понять, если стараться".
С другой - "я все знаю лучше всех".
Отсюда и разность подходов. 
С одной стороны - "попробуем так объяснить. попробуем эдак рассказать"
С другой - "Я! Задал! Вопрос! Как сделать, чтобы 2х2 было равно 5!!! Кто не может ответить - тот ничего не понимает"
Ну, и закономерный результат:
- все лохи, а я нашел правильный ответ: написать функцию function twobytwo () { return 5 }

Я думаю, в таких случаях надо менять методологию ответов.


Автор: niaz 22.8.2008, 11:32
Я не считаю никого лохом! У меня даже такой и мысли небыло. Теперь у меня есть мысля другая: "Никто не использует в своих проектах такой похвальный Smarty". И сразу отвечаю почему:

Потому что если бы кто то пользовался бы смарти он бы обязательно столкнулся бы моей проблемой! И думаю если кто то знал бы ответ то бы сразу помогли. А тут вместо помочь мне говорят зачем тебе смарти лошара, пользуйся инклудом.

Да чуть не забыл: Я нашел еще один вариант моего решения, надо вывести весь код в отдельный файл только вписать ее в {php}{/php} и подключить в синтаксис fetch ом. Но я свой следующий проект буду делать на инклудах! Это самое правильное решение!

Автор: Feldmarschall 22.8.2008, 12:07
Цитата(niaz @  22.8.2008,  11:32 Найти цитируемый пост)
Теперь у меня есть мысля другая: "Никто не использует в своих проектах такой похвальный Smarty". И сразу отвечаю почему:
Потому что если бы кто то пользовался бы смарти он бы обязательно столкнулся бы моей проблемой! 

анекдот

Автор: niaz 22.8.2008, 12:14
Может быть!

Автор: Feldmarschall 22.8.2008, 12:19
Эти твои "может быть" - пустые слова.
Ты сначала соглашаешься, что можешь быть неправ, а потом выдаешь перл еще похлеще.

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

Автор: niaz 22.8.2008, 13:11
Раз не понимаю что ж не обьяснил зачем шаблонизатор? Раз ползовался значит видел выгоду! А эти тысяча людей которые пользуются, что то не один не помог, и ты в их числе. Вместо того помочь ты начал допрос устравивать и говорит зачем тебе смарти. Я ведь не спрашивал пользоватся мне смарти или нет! а спросил конкретно проблему!

Сам небось из языков только русский язык знаешь? А ПХП , перл и си первый раз слышишь!  smile 

Автор: Feldmarschall 22.8.2008, 13:26
фантастическое сочетание невежества и наглости

Автор: skyboy 22.8.2008, 13:38
Цитата(niaz @  22.8.2008,  12:11 Найти цитируемый пост)
Раз не понимаю что ж не обьяснил зачем шаблонизатор?

потому что не обязан.
Цитата(niaz @  22.8.2008,  10:32 Найти цитируемый пост)
Потому что если бы кто то пользовался бы смарти он бы обязательно столкнулся бы моей проблемой!

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

M
skyboy
Вследствие перехода беседы в русло взаимных упреков(справедливых, несправедливых) тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)