Вопрос по смарти
[HTML]
<table border='0'>
<tr><td> <b>Сейчас в онлайн:</b><br></td></tr>
<tr><td> 1.Гости:{$num_guest}</td></tr>
<tr><td> 2.Юзеры:{$num_users}</td></tr>
<tr><td>Кто они?</td></tr><tr><td>{$users}</td></tr>
</table>
[/HTML]
А вот пхп скрипт:
$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');
Так получается у меня какая то билиберда
Это сам скрипт
require_once("class.php");
$sql->db_connect();
$mysql=$sql->db_select("users","*");
$smarty->assign("users", $sql->db_Fetch());
$smarty->display("test.tpl");
?>
Это ф-я 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]
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");
?>
Что выводит?
тут всё просто
{$user.name} - {$user.nickname}<br>
{/section}
для примера вот..
и все работает...
а если у тебя косячит вывод массива в шаблоне, то в первую очередь проверяй свой массив (print_r), а потом Smarty-шаблон
Выводит вот что:
[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]
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]
Я тебе посоветую вынести из Smarty все логику. Все преобразования и изменения должны происходить в PHP или еще раньше на этапе выборки из БД. Ассайнь в Smarty уже "готовые к употреблению" данные.
Конкретно по твоему вопросу: выполни в PHP преобразования своего массива так, чтобы в Smarty он попал уже в том формате, в котором собираешься выводить его пользователю. Тогда в Smarty у тебя остается только элементарный foreach.
Конкретно по твоему вопросу: выполни в PHP преобразования своего массива так, чтобы в Smarty он попал уже в том формате, в котором собираешься выводить его пользователю. Тогда в Smarty у тебя остается только элементарный foreach.
А можешь подсказать?Я вот хочу вывести к примеру список новостей, шаблон у них ест-нно одинаковый, но загружать шаблон по 20 раз ест-нно не хорошо.А как мне сделать так,чтобы это делал смарти?или так нельзя?
К примеру:
{
$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 раз.
А можешь подсказать?Я вот хочу вывести к примеру список новостей, шаблон у них ест-нно одинаковый, но загружать шаблон по 20 раз ест-нно не хорошо.А как мне сделать так,чтобы это делал смарти?или так нельзя?
[/quote]
ага давай.... зафигачь всё в один файл.... вот тебе потом самому весело будет :) вот увидишь.
не извращайся, а сделай кучу разных шаблонов, прям все что можно разнеси по частям на разные шаблоны... а внутри можешь делать так
"php-файл"
$array = array(array(1, "name1"), array(2, "name2"));
$t->assign("array", $array);
$t->assign("fields", $fields);
$t->display("master_template.tpl");
table_header.tpl
<th>{$fields}</th>
{/section}
table_row.tpl
<td>{$row}</td>
{/section}
"master_template.tpl"
<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]
всё просто... а ты очень невнимательно читаешь ман =)
ЗЫ: поправил. недосмотрел :)
$smarty->display("test.tpl"); отображается шаблон столько раз, сколько индексов в цикле. Я так понимаю это увеличивает нагрузку на сервер.Если один шаблон весит 8 кб(к примеру), то 20 новостей с одним шаблоном уже будут весить 160кб, а это уже прилично.
Если можете расскажите, или наведите на верный путь, при ознакомлении явно упустил сабж
Не делайте так. Вместо одного большого и навороченного шаблона, который вы будете боятся трогать "чтобы все не завалилось из-за добавления одной запятой", лучше сделать 5 маленьких шаблонов которые вы потом сможете безбоязненно изменять.
А килобайты не считайте. Они ведь у вас остаются на сервере (Smarty выполняется на сервере) а не передаются в браузер. Поэтому на трафик пользователя они не влияют. А хостер я думаю не станет ругать вас за лишние 100Kb занятые на жестком диске.
dem2.php
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]
Всё. спасибо всем за огромную помощь. Разобрался.
Единственный только вопрос напоследок
Сначала код:
$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]
dem2.php
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: а свой код я писал без проверки, в поле для быстрого ответа =) так что звиняйте =)
Наверное тут.