Как получить свободные данные из БД и вывести их

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

Исходные коды всех шаблонных тегов, не относящихся к какому-либо модулю, находятся в папке themes/functions. Добавим наш файл для шаблонного тега. Назовем его show_last_comments.php:

Пример:

<?php
echo 'DIAFAN.CMS';

Теперь, если в одном из шаблонов, расположенных в папке themes, написать шаблонный тег <insert name="show_last_comments">, то на сайте мы увидим надпись «DIAFAN.CMS».

Расширим наш метод, а именно – выберем с помощью SQL-запроса последние 5 активных комментариев, а также имена пользователей, их добавивших.

Пример:

$rows = DB::query_fetch_all("SELECT u.name, c.text FROM {comments} AS c LEFT JOIN {users} AS u ON c.user_id=u.id WHERE c.act='1' AND c.trash='0' ORDER BY c.id DESC LIMIT 5");
Внимание!
LEFT JOIN в данном случае используем для того, чтобы выбрать все последние комментарии независимо от того, кто их оставил – авторизованный пользователь или гость. Для не авторизованных пользователей поле user_id таблицы {comments} имеет значение 0. Для комментариев, оставленных авторизованным пользователем, это поле соответствует id из таблицы {users}.

Теперь файл примет такой вид:

Пример:

<?php
$rows
= DB::query_fetch_all("SELECT u.name, c.text FROM {comments} AS c
LEFT JOIN {users} AS u ON c.user_id=u.id WHERE c.act='1' AND c.trash='0'
ORDER BY c.id DESC LIMIT 5"
);
$text = '';
foreach (
$rows as $row)
{
    
$text .= $row['text'].'<br>';
}
echo
$text;

Но в таком виде он ничего не выводит. Давайте выведем текст комментариев:

Пример:

$text = '';
foreach (
$rows as $row)
{
    
$text .= $row['text'].'<br>';
}
echo
$text;

Исходный код стал выглядеть так:

Пример:

<?php
$rows
= DB::query_fetch_all("SELECT u.name, c.text FROM {comments} AS c
LEFT JOIN {users} AS u ON c.user_id=u.id WHERE c.act='1' AND c.trash='0'
ORDER BY c.id DESC LIMIT 5"
);
$text = '';
foreach (
$rows as $row)
{
    
$text .= $row['text'].'<br>';
}
echo
$text;

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

Пример:

if ($this->diafan->configmodules("avatar", "users"))
{
    
// ...
}

Если возможность есть, и существует изображение аватара, то можно выводить:

Пример:

if ($this->diafan->configmodules("avatar", "users") && file_exists(ABSOLUTE_PATH.USERFILES.'/avatar/'.$row['name'].'.png'))
{
    
$avatar = BASE_PATH.USERFILES.'/avatar/'.$row['name'].'.png';
    
$avatar_width = $this->diafan->configmodules("avatar_width", "users");
    
$avatar_height = $this->diafan->configmodules("avatar_height", "users");
    
$text .= '<img src="'.$avatar.'" width="'.$avatar_width.'"
    height="'
.$avatar_height.'" alt="'.$row['name'].'"><br>';
}

Получаем код:

Пример:

<?php
$rows
= DB::query_fetch_all("SELECT u.name, c.text FROM {comments} AS c
LEFT JOIN {users} AS u ON c.user_id=u.id WHERE c.act='1' AND c.trash='0'
ORDER BY c.id DESC LIMIT 5"
);
$text = '';
foreach (
$rows as $row)
{
    if (
$this->diafan->configmodules("avatar", "users") && file_exists(ABSOLUTE_PATH.USERFILES.'/avatar/'.$row['name'].'.png'))
    {
        
$avatar = BASE_PATH.USERFILES.'/avatar/'.$row['name'].'.png';
        
$avatar_width = $this->diafan->configmodules("avatar_width", "users");
        
$avatar_height = $this->diafan->configmodules("avatar_height", "users");
        
$text .= '<img src="'.$avatar.'" width="'.$avatar_width.'"
        height="'
.$avatar_height.'" alt="'.$row['name'].'"><br>';
    }
    
$text .= $row['text'].'<br>';
}
echo
$text;

В начале файла добавим следующий код для исключения прямого доступа к файлу.

Пример:

<?php
if (! defined('DIAFAN'))
{
    
$path = __FILE__;
    while(!
file_exists($path.'/includes/404.php'))
    {
        
$parent = dirname($path);
        if(
$parent == $path) exit;
        
$path = $parent;
    }
    include
$path.'/includes/404.php';
}

Получаем итоговый код:

Пример:

<?php
if (! defined('DIAFAN'))
{
    
$path = __FILE__;
    while(!
file_exists($path.'/includes/404.php'))
    {
        
$parent = dirname($path);
        if(
$parent == $path) exit;
        
$path = $parent;
    }
    include
$path.'/includes/404.php';
}

$rows = DB::query_fetch_all("SELECT u.name, c.text FROM {comments} AS c
LEFT JOIN {users} AS u ON c.user_id=u.id WHERE c.act='1' AND c.trash='0'
ORDER BY c.id DESC LIMIT 5"
);
$text = '';
foreach (
$rows as $row)
{
    if (
$this->diafan->configmodules("avatar", "users") && file_exists(ABSOLUTE_PATH.USERFILES.'/avatar/'.$row['name'].'.png'))
    {
        
$avatar = BASE_PATH.USERFILES.'/avatar/'.$row['name'].'.png';
        
$avatar_width = $this->diafan->configmodules("avatar_width", "users");
        
$avatar_height = $this->diafan->configmodules("avatar_height", "users");
        
$text .= '<img src="'.$avatar.'" width="'.$avatar_width.'"
        height="'
.$avatar_height.'" alt="'.$row['name'].'"><br>';
    }
    
$text .= $row['text'].'<br>';
}
echo
$text;

Затем в любом основном шаблоне сайта, например в themes/site.php, функцию можно вызвать в любом месте шаблонным тегом <insert name="show_last_comments">.

Ваши комментарии и дополнения
12 августа 2014 г.
В теге show_block module="comments" этот код можно подсмотреть:

Код
$row["link"] = $this->diafan->_route->link(0, $row["element_id"], $row["module_name"], $row["element_type"]).'#comment'.$row["id"];

Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.