[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос по функции parseTpl()
foxiSfox
Суть вот в чем:

Есть код:


include './libs/irb_paginator.php';
$paginator = new IRB_Paginator($GET['num'], IRB_NUM_POSTS);

$res_comments = $paginator -> countQuery("SELECT * FROM `". IRB_DBPREFIX ."comments`
WHERE
`id_ld` = "
. $GET['id'] . " AND
`lessordown` = 'lesson'"
);

$page_menu_comments = $paginator -> createMenu();

if(mysql_num_rows($res_comments) > 0)
{
$cont_comments = getTpl('lessons/rows_comments');
/**
* We connect a BB-decoder
* Подключаем BB-декодер
*/

include './bbcode/irb_bbdecoder.php';

while($row_comments = htmlChars(mysql_fetch_assoc($res_comments)))
{
$row_comments['date'] = formatDate($row_comments['date'], false);
$row_comments['text'] = createBBtags($row_comments['text']);
$rows1 .= parseTpl($cont_comments, $row_comments, 'com');
}
}




Здесь происходит выборка всех комментариев из БД по "id" статьи.

И есть шаблон этого комментария:


<!-- ./skins/tpl/lessosn/rows_comments.tpl begin -->
<div class = "div_row_comments">
<div
class = "div_row_comments_title">
<div
class = "div_row_comments_title_name">Автор: <?php echo $com_name; ?></div>
<div
class = "div_row_comments_title_date">Дата: <?php echo $com_date; ?></div>
</div>
<div
class = "div_row_comments_avatar"><img src="/skins/images/avatar/none.jpg" width="80" height="80" /></div>
<div
class = "div_row_comments_text"><?php echo $com_text; ?></div>
</div>

<!-- ./skins/tpl/lessosn/rows_comments.tpl end -->



Как видно все данные, которые включает шаблон выбираются из одной таблицы. Но как сделать так, что бы можно выбрать данные из какой либо еще таблицы дополнительно?

Например: путь до аватара(тег <img>) выбирался из таблицы "user". Как он выбирался это моя забота, мне интересно выборка из 2 таблиц для одного шаблона с функцией parseTpl.

Реально ли переписать функцию так, что бы она воспринимала переменные с исключением. То есть, например, я хочу чтоб в переменные с префиксом "tt_" я мог забивать что хочу. И потом выводить это так же в шаблон.

Или же есть другой способ?



Спустя 1 час, 34 минуты, 33 секунды (22.07.2011 - 15:46) twin написал(а):
Выборка идет до шаблона. Поэтому вопрос несколько непонятен. Связи тут нет.
Если имеется ввиду массив $row_comments, то его можно дополнить новыми элементами.
Если имеется ввиду просто выборка из двух таблиц, нужно посмотреть в сторону JOIN. Тут дело просто в запросе, шаблон вообще позже.
Цитата
Реально ли переписать функцию так, что бы она воспринимала переменные с исключением.
Этого вообще не понял

Спустя 1 час, 13 минут, 55 секунд (22.07.2011 - 17:00) foxiSfox написал(а):
Ну смотри:

Сначала идет выборка, это ясно.
Если есть хоть одно значение, тогда мы применяем функцию getTpl.
Далее идет цикл while и в нем функции parseTpl, которая выделит php код, и понимает переменные только с префиксом "com". Любая другая переменная функцию eval() уже не проходит:

<b>Notice</b>: Undefined variable: error in <b>Z:\home\test.ru\www\libs\view.php(72) : eval()'d code</b> on line <b>7</b><br />
<script language=JavaScript src='/denwer/errors/phperror_js.php'>

Что делать?

Ну вот пример:

Есть таблица комментариев и есть таблица пользователей.

В таблице комментариев(comments) хранится: id, title, text, id_user.
В таблице пользователей(users): id, name, rating(рейтинг).

В каждой статье я отображаю комментарии, мне надо в том шаблоне, использовать поля title, text, name, rating, то есть поля из 2-х таблиц. Но я не знаю как. Как переписать тот код? Но что б функции getTpl и parseTpl остались.

Я не знаю как по другому объяснить((( Я просто не понимаю, как в данном случае работать с 2 таблицами.

С одной все ясно. Выбираешь поля и к ним приписываешь префикс, и дальше работаешь с этими, уже переменными(грубо говоря), а с 2 таблицами не понимаю(

Спустя 45 минут, 30 секунд (22.07.2011 - 17:45) twin написал(а):
Все проще. В MySQL есть такая штука, как алиас. Переназначь названия полей и вся недолга.

Давай код, покажу.

Спустя 39 минут, 7 секунд (22.07.2011 - 18:24) foxiSfox написал(а):
read_controller.php
 
if($ok)
{
if(!$POST['value2'])
$info[] = '>>> Введите текст сообщения!!!';

if(count($info) == 0)
{
mysqlQuery("INSERT INTO `". PV_DBPREFIX ."comments`
SET
`name` = '"
. escapeString($_SESSION['user_data']['login']) ."',
`text` = '"
. $POST['value2'] ."',
`id_ld` = '"
. $GET['id'] ."',
`lessordown` = 'lesson'"

);

reDirect();
}
}


/**
* The block of reading of the information
* Блок чтения информации
*/

include './libs/irb_paginator.php';
$paginator = new IRB_Paginator($GET['num'], IRB_NUM_POSTS);

$res_comments = $paginator -> countQuery("SELECT * FROM `". PV_DBPREFIX ."comments`
WHERE
`id_ld` = "
. $GET['id'] . " AND
`lessordown` = 'lesson'"
);

$page_menu_comments = $paginator -> createMenu();

if(mysql_num_rows($res_comments) > 0)
{
$cont_comments = getTpl('lessons/rows_comments');
/**
* We connect a BB-decoder
* Подключаем BB-декодер
*/

include './bbcode/irb_bbdecoder.php';

while($row_comments = htmlChars(mysql_fetch_assoc($res_comments)))
{
$row_comments['date'] = formatDate($row_comments['date'], false);
$row_comments['text'] = createBBtags($row_comments['text']);
$rows1 .= parseTpl($cont_comments, $row_comments, 'com');
}
}



rows_comments.tpl

<!-- ./skins/tpl/lessosn/rows_comments.tpl begin -->
<div class = "div_row_comments">
<div
class = "div_row_comments_title">
<div
class = "div_row_comments_title_name">Автор: <?php echo $com_name; ?></div>
<div
class = "div_row_comments_title_date">Дата: <?php echo $com_date; ?></div>
</div>
<div
class = "div_row_comments_avatar"><img src="" width="80" height="80" /></div>
<div
class = "div_row_comments_text"><?php echo $com_text; ?></div>
</div>

<!-- ./skins/tpl/lessosn/rows_comments.tpl end -->


Таблицы в БД:
pv_comments:id,date,name,text,id_ld(id статьи), lessordown(не важно, там типа урок или загрузка, не суть)
pv_users:id,date,login,password,hash,email,activate,avatar(путь до аватарки)

Хотел изменить, поле "name"(автор комментария) на "id_user"(id пользователя). Тогда связь получается id---id_user. И уже в комменты грузить имя, и путь до аватарки из таблицы pv_user.

В rows_comments.tpl есть тег <img>, в атрибуте "src" так же должен быть путь до аватарки(то есть он должен браться из таблицы pv_user).

Ну а все остальное, так же как у вас на сайте: view.php, router.php, show.tpl, index.tpl и index.php(не буду их расписывать, там стандарт, в основном одни инклуды)

Вот

Спустя 1 час, 19 минут, 6 секунд (22.07.2011 - 19:43) twin написал(а):
Цитата
то есть он должен браться из таблицы pv_user

Так а дамп сей таблицы хотя бы... Про запрос молчу уже

Спустя 36 минут, 14 секунд (22.07.2011 - 20:19) foxiSfox написал(а):
--
-- Table structure for table `pv_user`
--

CREATE TABLE IF NOT EXISTS `pv_user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`login` varchar(50) NOT NULL,
`password` varchar(32) NOT NULL,
`hash` varchar(32) NOT NULL,
`email` varchar(50) NOT NULL,
`activate` int(1) NOT NULL,
`avatar` varchar(200) NOT NULL DEFAULT '/skins/images/avatar/none.jpg',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

--
-- Dumping data for table `pv_user`
--

INSERT INTO `pv_user` (`id`, `date`, `login`, `password`, `hash`, `email`, `activate`, `avatar`) VALUES
(20, '2011-07-22 13:48:07', 'foxiSfox', '6f830f7e08045e81a3e754a911feec80',
'e106e4558e32eec4e2984c138e8c7bb1', 'test@yandex.ru', 1, '/skins/images/avatar/none.jpg');


Пользователей там безграничное множество будет

Спустя 43 минуты, 47 секунд (22.07.2011 - 21:03) twin написал(а):
Если я все правильно понял, запрос должен быть примерно таким:
$res_comments = $paginator -> countQuery("SELECT a.`name`, a.`date`, a.`text`, b.`avatar`  
FROM `"
. PV_DBPREFIX ."comments` a
LEFT JOIN `"
. PV_DBPREFIX ."user` b
ON a.`name` = b.`login`
WHERE a.`id_ld` = "
. (int)$GET['id'] . "
AND a.`lessordown` = 'lesson'"

);

Три момента.
1. Не проверял - нет таблиц. Может где окарал.
2. Обрати внимание, что запрос детерменирован. Другими словами - никаких звездочек.
3. Я бы связь сделал по ключу. Но его не нашел. Или его нет или мало данных.

В общем то пища для размышлений есть - грызи гранит.

Спустя 12 часов, 44 минуты, 31 секунда (23.07.2011 - 09:48) foxiSfox написал(а):
Twin ты гений. Все работает. Не знал даже, что в MySQL можно применять такую конструкцию.(вообще не знал про JOIN). Вообщем смысл уловил, буду разбираться, буду далее изучать!

Насчет связи по ключу. Я и говорю, что хотел вместо поле name в таблице комментов поставить поле user_id. И тут уже будет связь user_id с id.

Вообщем все супер, спасибо еще раз.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.