Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по смарти

13K
18 марта 2007 года
Mayc
38 / / 01.02.2007
Я хочу выводить список данных, а точнее список пользователей в онлайн. Только вот незнаю, как мне шаблон не отображать n раз, а вывести в нем n данных.
[HTML]
<table border='0'>
<tr><td>&nbsp;<b>Сейчас в онлайн:</b><br></td></tr>
<tr><td>&nbsp;1.Гости:{$num_guest}</td></tr>
<tr><td>&nbsp;2.Юзеры:{$num_users}</td></tr>
<tr><td>Кто они?</td></tr><tr><td>{$users}</td></tr>
</table>
[/HTML]
А вот пхп скрипт:
Код:
$sql->db_connect();
$sql->db_select("session","*");
 $num_guest=0;
  while ($id=$sql->db_Fetch())
   {
    if (empty($id['user'])) $num_guest++;  
    if ($id['user']) $num_users++;
    $users=$id['user'];
    $smarty->assign('users',$users);
   }
  $smarty->assign('num_guest',$num_guest);
  $smarty->assign('num_users',$num_users);
  $smarty->display('header.tpl');
13K
18 марта 2007 года
whitehood
73 / / 02.11.2006
Ну так в smarty есть конструкция для работы с массивами (foreach)
вот в этом разделе
Присваеваем переменной массив, а потом уже в шаблоне его выводим.
13K
19 марта 2007 года
Mayc
38 / / 01.02.2007
Попробовал посл. пример по твоей ссылке
Так получается у меня какая то билиберда
Это сам скрипт
 
Код:
<?
require_once("class.php");
$sql->db_connect();
$mysql=$sql->db_select("users","*");
$smarty->assign("users", $sql->db_Fetch());
$smarty->display("test.tpl");
?>

Это ф-я db_Fetch()
Код:
function db_Fetch()
          {
            if($row = @mysql_fetch_array($this->mySQLresult))
             {
              while (list($key,$val) = each($row))
               {
                $row[$key] = stripslashes($val);
               }
              $this->dbError("db_Fetch");
               return $row;
             }
             else
             {
              $this->dbError("db_Fetch");
                return FALSE;
             }
          }

А вот сам код шаблона смарти
[HTML]
{* Smarty *}
{foreach key=cid item=con from=$users}
{$con.userID}_{$con.name}<br />
{/foreach}
[/HTML]
Результат:абра-кадабра
[HTML]
1_1
1_1
r_r
r_r
c_c
c_c
r_r
r_r
a_a
a_a
t_t
t_t
0_0
0_0
_
_
_
_
1_1
1_1
1_1
1_1
1_1
1_1
1_1
1_1
[/HTML]
15
19 марта 2007 года
shaelf
2.7K / / 04.05.2005
 
Код:
<?
require_once("class.php");
$sql->db_connect();
$mysql=$sql->db_select("users","*");
$result = $sql->db_Fetch();
var_dump($result);
$smarty->assign("users", $result);
$smarty->display("test.tpl");
?>

Что выводит?
92
19 марта 2007 года
Тень Пса
2.2K / / 19.10.2006
есть так же функция для работы с массивами
 
Код:
{section name=sname loop=$array}


тут всё просто

 
Код:
$t->assign("users", $users);


 
Код:
{section name=i loop=$users}
{$user.name} - {$user.nickname}<br>
{/section}


для примера вот..
и все работает...

а если у тебя косячит вывод массива в шаблоне, то в первую очередь проверяй свой массив (print_r), а потом Smarty-шаблон
13K
19 марта 2007 года
Mayc
38 / / 01.02.2007
Всем спасибо, сейчас попробую. Просто ф-ии в факах описываются не совсем понятно, да и опыт приходит когда более сложные вещи разбираешь, а когда не получается начинаешь мучить свой мозг =0)
Выводит вот что:
[HTML]array(26) { [0]=> string(1) "1" ["userID"]=> string(1) "1" [1]=> string(4) "root" ["name"]=> string(4) "root" [2]=> string(32) "c5fe25896e49ddfe996db7508cf00534" ["password"]=> string(32) "c5fe25896e49ddfe996db7508cf00534" [3]=> string(12) "root@mail.ru" ["email"]=> string(12) "root@mail.ru" [4]=> string(12) "av-21913.gif" ["avatare"]=> string(12) "av-21913.gif" [5]=> string(4) "test" ["firstname"]=> string(4) "test" [6]=> string(1) "0" ["age"]=> string(1) "0" [7]=> string(0) "" ["icq"]=> string(0) "" [8]=> string(0) "" ["city"]=> string(0) "" [9]=> string(3) "127" ["ip"]=> string(3) "127" [10]=> string(10) "1170713529" ["datareg"]=> string(10) "1170713529" [11]=> string(1) "1" ["privelegie"]=> string(1) "1" [12]=> string(1) "1" ["status"]=> string(1) "1" }
Номер:1 Имя:1
Номер:1 Имя:1
Номер:r Имя:r
Номер:r Имя:r
Номер:c Имя:c
Номер:c Имя:c
Номер:r Имя:r
Номер:r Имя:r
Номер:a Имя:a
Номер:a Имя:a
Номер:t Имя:t
Номер:t Имя:t
Номер:0 Имя:0
Номер:0 Имя:0
Номер: Имя:
Номер: Имя:
Номер: Имя:
Номер: Имя:
Номер:1 Имя:1
Номер:1 Имя:1
Номер:1 Имя:1
Номер:1 Имя:1
Номер:1 Имя:1
Номер:1 Имя:1
Номер:1 Имя:1
Номер:1 Имя:1[/HTML]
Написал вроде как по примеру, так выдаёт ересть какую-то..
Похимичил и вот, что получилось: Замечу, выводит не одну запись, а все из базы Тут показан вывод одной записи из бд
[HTML]
Номер:1
Номер:1
Номер:root
Номер:root
Номер:c5fe25896e49ddfe996db7508cf00534
Номер:c5fe25896e49ddfe996db7508cf00534
Номер:root@mail.ru
Номер:root@mail.ru
Номер:av-21913.gif
Номер:av-21913.gif
Номер:test
Номер:test
Номер:0
Номер:0
Номер:
Номер:
Номер:
Номер:
Номер:127
Номер:127
Номер:1170713529
Номер:1170713529
Номер:1
Номер:1
Номер:1
Номер:1
[/HTML]
Вопрос, почему они дублируются?Что-то я не понимаю. Код поправил вот так:
Код:
<?
require_once("class.php");
$sql->db_connect();
$mysql=$sql->db_select("users","*");
while ($result = $sql->db_Fetch())
{
//var_dump($result);
$smarty->assign("users", $result);
$smarty->display("test.tpl");
}
?>

шаблон:
[HTML]
{foreach item=con from=$users}
Номер:{$con}<br />
{/foreach}
[/HTML]
13K
19 марта 2007 года
Mayc
38 / / 01.02.2007
Похимичил, и вот до чего дошли мои руки. Сразу вопрос, можно ли в шаблоне выводить н-строк разной инфы, но из одной таблицы.т.е. список юзеров в онлайн к примеру.У меня что-то никак не получается это сделать без привязки оператора while в php.
Код:
<?
require_once("class.php");
$sql->db_connect();
$mysql=$sql->db_select("users","*");
$arr=array();
$i=0;
while ($result = $sql->db_Fetch())
{
    $i++;
//var_dump($result);
$arr[$i]=array($result['userID'],$result['name']);
$smarty->assign("users", $arr[$i]);
$smarty->display("test.tpl");
}
?>

Вывод теперь таков:
[HTML]
1 root

----------------------------------
2 Mayc

----------------------------------
3 Max Volume

----------------------------------
4 zend

----------------------------------
5 Slimane

----------------------------------
6 blasphemer

----------------------------------
7 tester

----------------------------------
[/HTML]
337
19 марта 2007 года
shine
719 / / 09.06.2006
Цитата: Mayc
Похимичил, и вот до чего дошли мои руки. Сразу вопрос, можно ли в шаблоне выводить н-строк разной инфы, но из одной таблицы.т.е. список юзеров в онлайн к примеру.У меня что-то никак не получается это сделать без привязки оператора while в php.



Я тебе посоветую вынести из Smarty все логику. Все преобразования и изменения должны происходить в PHP или еще раньше на этапе выборки из БД. Ассайнь в Smarty уже "готовые к употреблению" данные.

Конкретно по твоему вопросу: выполни в PHP преобразования своего массива так, чтобы в Smarty он попал уже в том формате, в котором собираешься выводить его пользователю. Тогда в Smarty у тебя остается только элементарный foreach.

13K
19 марта 2007 года
Mayc
38 / / 01.02.2007
Цитата: shine
Я тебе посоветую вынести из Smarty все логику. Все преобразования и изменения должны происходить в PHP или еще раньше на этапе выборки из БД. Ассайнь в Smarty уже "готовые к употреблению" данные.

Конкретно по твоему вопросу: выполни в PHP преобразования своего массива так, чтобы в Smarty он попал уже в том формате, в котором собираешься выводить его пользователю. Тогда в Smarty у тебя остается только элементарный foreach.


А можешь подсказать?Я вот хочу вывести к примеру список новостей, шаблон у них ест-нно одинаковый, но загружать шаблон по 20 раз ест-нно не хорошо.А как мне сделать так,чтобы это делал смарти?или так нельзя?
К примеру:

 
Код:
while ($result = $sql->db_Fetch())
{
    $i++;
//var_dump($result);
$arr[$i]=array($result['userID'],$result['name']);
$smarty->assign("users", $arr[$i]);
$smarty->display("test.tpl");
}

Может можно как-то бех "while". а доверить эту работу смарти.Я же к примеру на весь сайт могу повесить один шаблон (куски со всяких разделов) и в зависимости от существования определенной переменной выводить ту или иную чать шаблона.
$smarty->display("test.tpl"); отображается шаблон столько раз, сколько индексов в цикле. Я так понимаю это увеличивает нагрузку на сервер.Если один шаблон весит 8 кб(к примеру), то 20 новостей с одним шаблоном уже будут весить 160кб, а это уже прилично.
Если можете расскажите, или наведите на верный путь, при ознакомлении явно упустил сабж
Как мне сообщить смарти,то что у меня 10 строк извлекаемых из таблицы и мне надо этот шаблон отобразить 10 раз, соотв. заполненный как положено.Я вижу как это делается через массивы, но пытаюсь без while сделать и выводится только одна строка,а загружать шаблон(display();) не хочется по 10 раз.
92
20 марта 2007 года
Тень Пса
2.2K / / 19.10.2006
[quote="Mayc"]
А можешь подсказать?Я вот хочу вывести к примеру список новостей, шаблон у них ест-нно одинаковый, но загружать шаблон по 20 раз ест-нно не хорошо.А как мне сделать так,чтобы это делал смарти?или так нельзя?
[/quote]

ага давай.... зафигачь всё в один файл.... вот тебе потом самому весело будет :) вот увидишь.

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

"php-файл"
 
Код:
$fields = array("id", "name");

$array = array(array(1, "name1"), array(2, "name2"));

$t->assign("array", $array);
$t->assign("fields", $fields);

$t->display("master_template.tpl");


table_header.tpl
 
Код:
{section name=i loop=$fields}
  <th>{$fields}</th>
{/section}


table_row.tpl
 
Код:
{section name=i loop=$row}
  <td>{$row}</td>
{/section}



"master_template.tpl"
 
Код:
<table>
   <tr>
     {include file="table_header.tpl" fields=$fields}
   </tr>
{section name=i loop=$array}
   <tr>
     {include file="table_row.tpl" row=$array}
   </tr>
{/section}
</table>


в итоге получишь:

[html]
<table>
<tr>
<th>id</th><th>name</th>
</tr>
<tr>
<td>1</td><td>name1</td>
</tr>
<tr>
<td>2</td><td>name2</td>
</tr>
</table>
[/html]

всё просто... а ты очень невнимательно читаешь ман =)

ЗЫ: поправил. недосмотрел :)
337
20 марта 2007 года
shine
719 / / 09.06.2006
Цитата: Mayc
Может можно как-то бех "while". а доверить эту работу смарти.Я же к примеру на весь сайт могу повесить один шаблон (куски со всяких разделов) и в зависимости от существования определенной переменной выводить ту или иную чать шаблона.
$smarty->display("test.tpl"); отображается шаблон столько раз, сколько индексов в цикле. Я так понимаю это увеличивает нагрузку на сервер.Если один шаблон весит 8 кб(к примеру), то 20 новостей с одним шаблоном уже будут весить 160кб, а это уже прилично.
Если можете расскажите, или наведите на верный путь, при ознакомлении явно упустил сабж


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

А килобайты не считайте. Они ведь у вас остаются на сервере (Smarty выполняется на сервере) а не передаются в браузер. Поэтому на трафик пользователя они не влияют. А хостер я думаю не станет ругать вас за лишние 100Kb занятые на жестком диске.

13K
20 марта 2007 года
Mayc
38 / / 01.02.2007
попробовал твой код и выдаёт две надписи "array"
13K
20 марта 2007 года
Mayc
38 / / 01.02.2007
:confused: Вот только что пробовал ещё раз написать скриптик...Смотри что получается
dem2.php
 
Код:
$sq = array(array(1, "name1"), array(2, "name2"));
print_r($sq);
$smarty->assign("users", $sq);
$smarty->display("test2.tpl");

test.tpl
[HTML]
<table border="1">
<tr>
{section name=i loop=$users}
{include file="test2.tpl" row=$users}
{/section}
</tr>
</table>
[/HTML]
test2.tpl
[HTML]
{section name=i loop=$row}
<td>{$row}</td>
{/section}
[/HTML]
Что-то я начинаю не понимать, чем там смарти вообще занимается?
ф-я print_r выводит
[HTML]
Array ( [0] => Array ( [0] => 1 [1] => name1 ) [1] => Array ( [0] => 2 [1] => name2 ) )


[/HTML]
а в шаблоне..........пустота :(
Так опять-таки нашёл опечатку, НО вывод теперь такой
[HTML]
<table border="1">
<tr>
<td>Array</td>
<td>Array</td>
</tr>
</table>
[/HTML]
Всё. спасибо всем за огромную помощь. Разобрался.
Единственный только вопрос напоследок
Сначала код:
Код:
require_once("class.php");
$sql->db_connect();
$mysql=$sql->db_select("users","userID,name");
$q=array();
$i=-1;
while ($sqq=$sql->db_Fetch())
{ print_r($sqq);
$i++;
$q[$i]=array('number' => $sqq['userID'],'name' => $sqq['name']);
}        
$smarty->assign('user2',$q);


$smarty->display("test2.tpl");

$i=-1; //Начальное значение ВОПРОС:если $i установить равное 0, тогда будут выводиться не все записи Почему так?Кто знает?
И соотв. вывод:
[HTML]
<p>
<a href="profile.php?user=1">root</a>
</p>
<p>
<a href="profile.php?user=2">Mayc</a>
</p>
<p>
<a href="profile.php?user=3">Max Volume</a>
</p>
<p>
<a href="profile.php?user=4">zend</a>
</p>
<p>
<a href="profile.php?user=5">Slimane</a>
</p>
<p>
<a href="profile.php?user=6">blasphemer</a>
</p>
<p>
<a href="profile.php?user=7">tester</a>
</p>
[/HTML]
15
21 марта 2007 года
shaelf
2.7K / / 04.05.2005
Ну если пишет Array, то мне 8 чувство подсказывает, что это массив, а если это массив, значит по нему нужно пройтись циклом))). Киньте камнем, если я не прав)))
92
22 марта 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата: Mayc
:confused: Вот только что пробовал ещё раз написать скриптик...Смотри что получается
dem2.php
 
Код:
$sq = array(array(1, "name1"), array(2, "name2"));
print_r($sq);
$smarty->assign("users", $sq);
$smarty->display("test2.tpl");

test.tpl
[HTML]
<table border="1">
<tr>
{section name=i loop=$users}
{include file="test2.tpl" row=$users}
{/section}
</tr>
</table>
[/HTML]
test2.tpl
[HTML]
{section name=i loop=$row}
<td>{$row}</td>
{/section}
[/HTML]



ну да, логично. shaelf прав.

ты ему передал массив, вот он тебе и написал что это массив, а ты должен был писать в шалоне {$row} ну и там ключи всякие если каждый елемент является хэшем. благо ты сам разобрался =))))

PS: а свой код я писал без проверки, в поле для быстрого ответа =) так что звиняйте =)

13K
22 марта 2007 года
Mayc
38 / / 01.02.2007
Всем спасибо ещё раз. С последним вопросом тоже разобрался.Блин чем глубже в пхп лезишь, тем загадочнее он становится(к примеру:вчера логотип на сайте повесил, строго огран. по размерам, нормальненько так получилось, так щас захожу на страницу и вижу что сайт разьехался нисх*я)=))
15
22 марта 2007 года
shaelf
2.7K / / 04.05.2005
Глупый вопрос. А при чём тут РНР?))))
13K
23 марта 2007 года
Mayc
38 / / 01.02.2007
Притом. уж верстку то я делать умею очень неплохо. Тем более в таблице заменить содержимое одной ячейки(рисунок другим) имхо мозгов много не надо. Если не пхп, то хтмл явно не клинит же, он попросто этого не умеет.
15
23 марта 2007 года
shaelf
2.7K / / 04.05.2005
Т.е. вёрстку глючит из-за РНР?)))))) Хорошее настроение на вечер обеспеченно)))
13K
23 марта 2007 года
Mayc
38 / / 01.02.2007
Я незнаю где ты вычитал,ч то за верстку отвечает пхп.Не надо тему в юмор превращать и цепляться за слова. Сам прекрасно знаешь как клинит пхп порой.
15
24 марта 2007 года
shaelf
2.7K / / 04.05.2005
Цитата: Mayc
Всем спасибо ещё раз. С последним вопросом тоже разобрался.Блин чем глубже в пхп лезишь, тем загадочнее он становится(к примеру:вчера логотип на сайте повесил, строго огран. по размерам, нормальненько так получилось, так щас захожу на страницу и вижу что сайт разьехался нисх*я)=))


Наверное тут.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог