Публичные закладки. Вывод в профиле. » Techno-Co — Всё для вебмастера, для создание сайтов с нуля. {title}

В DataLife Engine есть компонент, позволяющий всем пользователям, имеющим аккаунт, добавлять понравившиеся публикации в личный каталог избранного контента. «Модуль закладок» — двумя словами. По-умолчанию публикации из избранного доступны только для того аккаунта, с которого были занесены туда. Но может случиться так, что разрабатываемый сайт должен быть глубоко социальный и показывать закладки каждого пользователя. То бишь зашел к Васе на страницу и посмотрел какие публикации ему нравятся. Иногда это и правда удобно, по-этому, под катом, будет описан метод реализации.

Нагрузка и подводные камни

Не стоит переживать что модификация повлечет за собой большую нагрузку на сервер. Начал я с этого пункта не для того чтобы напугать, а наоборот, предостеречь.Хак делает один запрос к БД и понятно почему — публикации-то нужно откуда-то брать. В среднем, чтобы сформировать профиль пользователя, выполняется 6-7 запросов (+1 для выборки закладок) — это многовато даже для такой малопосещаемой страницы как аккаунт. Вообще в DLE ужасная проектировка БД… Ну да ладно, пост не об этом.С запросами разобрались и, т. к. их сумма оставляет желать лучшего, мной было предусмотрено кэширование постов для каждого профиля. Вроде-бы это хорошо, но тут и кроется подводный камень. Он, в принципе, очевиден, но я приведу цифры дабы каждый мог оценить ситуацию. Допустим у нас средний сайт с 1000-ей зарегистрированных пользователей. 300-та неактивны и еще 300-та не используют закладки в принципе. В остатке получаем 400 аккаунтов, при просмотре каждого из которых будет создан файл кэша. Теперь представим что кэш очищается редко и все 400 профилей были посещены. Т. е. мы получили 400 файлов. Размер их зависит от кол-ва новостей и их объемности. Сочтем, что приблизительное число постов в избранном 3, а размер каждого из них, включая форматирование — 7 Кб. В итоге, по достаточно скромным подсчетам, получим ~8 Мб кэша. Это тоже «не торт».Если вы дочитали до этого абзаца, то, несмотря на вышеописанное, решили двигаться дальше и, чтобы немного вас подбодрить, я приведу строку кода, которой будет подключаться модификация (использовать в userinfo.tpl):

{favorites count="2" template="favs" cache}

Примечание:
Параметр template может принимать любое значение которое соответствует существующему файлу шаблона (.tpl).

Параметр cache может присутствовать либо отсутствовать.

В первом случае посты попадут в кэш, а во втором — нет.

Параметр count отвечает за число публикаций, отображаемых в блоке.

Максимальное число — любое трехзначное.Шаблонами, кэшем и кол-вом постов можно очень легко управлять — это уже хорошо.

П.С. В шаблоне модификации можно использовать все те же макросы, что и в шаблоне кратких новостей.

Реализация — правим файлы

1. Открыть /engine/modules/functions.php и перед строкой:

function check_ip($ips) { 

добавить следующий блок кода (функцию):

/* User Favorites by BR0kEN, Firstvector.org */
function userFavorites($id, $options) {
        global $db, $config;

        $options = stripslashes(trim($options));

        $sql_select = "SELECT * FROM ". PREFIX ."_post p LEFT JOIN ". PREFIX ."_post_extras e ON (p.id=e.news_id) WHERE p.id IN ({$id})";

        if (preg_match('#template="(.+?)"#', $options, $value)) $custom_template = trim($value[1]);
        else $custom_template = 'shortstory';

        if (preg_match('#count="(.+?)"#', $options, $value)) $sql_select .= ' LIMIT 0,' . intval($value[1]);

        if (strstr($options, 'cache')) $config['allow_cache'] = 'yes';
        else $config['allow_cache'] = false;

        $cache_id = $sql_select . $custom_template;

        $tpl->result['content'] = dle_cache('favorites', $cache_id);

        if ($tpl->result['content'] !== false) return $tpl->result['content'];
        else {
                $tpl = new dle_template();
                $tpl->dir = TEMPLATE_DIR;

                include (ENGINE_DIR . '/modules/show.custom.php');

                if ($config['files_allow'] == 'yes' AND strpos($tpl->result['content'], '[attachment=') !== false) $tpl->result['content'] = show_attach($tpl->result['content'], $attachments);

                create_cache('favorites', $tpl->result['content'], $cache_id);

                return $tpl->result['content'];
        }
}
/* User Favorites by BR0kEN, Firstvector.org */

2. Открыть /engine/modules/profile.php и после строки:

while ( $row = $db->get_row( $sql_result ) ) { 

добавить:

       if ($row['favorites']) {

                $tpl->set('[favorites]', '');
                $tpl->set('[/favorites]', '');
                $tpl->set_block("'[not-favorites](.*?)[/not-favorites]'si", '');

                if (stripos($tpl->copy_template, '{favorites}') !== false) $tpl->copy_template = preg_replace("#{favorites}#e", "userFavorites('{$row['favorites']}')", $tpl->copy_template);
                elseif (stripos($tpl->copy_template, '{favorites') !== false) $tpl->copy_template = preg_replace("#{favorites(.+?)}#e", "userFavorites('{$row['favorites']}', '1')", $tpl->copy_template);

        } else {

                $tpl->set_block("'[favorites](.*?)[/favorites]'si", '');
                $tpl->set('[not-favorites]', '');
                $tpl->set('[/not-favorites]', '');

                $tpl->copy_template = preg_replace("#{favorites(.+?)}#e", '', $tpl->copy_template);

        }
        /* User Favorites by BR0kEN, Firstvector.org */

Примечание:Подключая модификацию можно использовать «голый» макрос {favorites} и тогда будут выбираться все посты, использоваться шаблон shortstory и опция кэширования будет неактивна. Также, можно поднять любой из параметров или указывать их в произвольном порядке.

Важный момент: если у пользователя нет закладок,

то макрос ничего не выведет и сам не отобразиться.Помимо этого есть возможность использования макросов

[favorites]Текст[/favorites]

и

[not-favorites]Текст[/not-favorites] 

«текст» промеж первых будет виден если у пользователя есть хотя бы один пост в избранном,

а меж вторыми — если постов в закладках нет.

Расставим точки над «i»

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

Автор: BR0kEN

Комментарии 0