Новости от админа на главной странице

Всех с прошедшим праздником и с наступающим. Давным давно реализовал для своего сайта плагин (очень простой) выводящий стену админа на главную страницу в виде ленты новостей, а сегодня ко мне обратились с просьбой поделиться наработкой. Ну что же пожалуйста. Хотя нет, немного пожадничаю, плагин не дам, а вот как его быстро собрать самому расскажу, благо время на это есть.

Первое
Создаем основу плагина:
В каталоге «plugins» необходимо создать структуру каталогов, похужую на картинку выше. Здесь все очевидно: файл класса блока «BlockNews.class.php» будет формировать необходимые данные для вывода шаблона. Хук будет добавлять блок для вывода, а шаблон – содержать оформление блока.
Перейдем теперь к содержанию:

Второе
Содержание файлов:
1. plugin.xml. Здесь все как и в других плагинах.
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
    <name>
        <lang name="default">News</lang>
        <lang name="russian">Новости</lang>
    </name>
    <author>
        <lang name="default">andreyv</lang>
    </author>
    <homepage>http://gladcode.ru</homepage>
    <version>1.0.0</version>
    <requires>
        <livestreet>1.x</livestreet>
        <plugins>
        </plugins>
    </requires>
    <description>
        <lang name="default">News from admin</lang>
        <lang name="russian">Новости от админа</lang>
    </description>
</plugin>


2. PluginNews.class.php. Две строчки кода. Я не реализую ни какие методы плагина — они не нужны.
<?php
if (!class_exists('Plugin')) die('You are bad hacker, try again, baby!');
class PluginNews extends Plugin { }


3. BlockNews.class.php. Основная задача, реализованная здесь — получение массива последних записей со стены пользователя с идентификатором 1. Если админ у Вас имеет друго ид, его необходимо явно указать здесь.
<?php
class PluginNews_BlockNews extends Block {
    public function Exec() {
        /** Получаем записи стены */
        $aWall = $this->Wall_GetWall(
            // Так будет выводиться вся стена
            //array('wall_user_id' => 1, 'pid' => null),
            // А так, только записи админа ('user_id' => 1)
            array('wall_user_id' => 1, 'pid' => null, 'user_id' => 1),
            array('id' => 'desc'),
            1,   // Ид. пользователя со стены которого получаем записи 
            5);  // 5-количество получаемых и выводимых записей

        $this->Viewer_Assign('aWall', $aWall['collection']);
    }
}


4. HookNews.class.php. Хук, добавляющий блок новостей в общий массив выводимых блоков.
<?php
class PluginNews_HookNews extends Hook {
    public function RegisterHook() {
        if ((Router::GetAction() == "index") || (Router::GetAction() == "topic") || (Router::GetAction() == "blogs")) {
            $this->Viewer_AddBlocks('right', array(
                array(
                    'block'    => 'News',
                    'params'   => array('plugin' => 'news'),
                    'priority' => 100,
                )
            ));
        }
    }
}


5. block.News.tpl. Шаблон блока новостей. Здесь доступна переменная $aWall, установленная в классе блока.
<section class="block block-type-tags">
    <header class="block-header">
        <h3>Наши новости</h3>
    </header>
    {foreach from=$aWall item=oWall}
        <div id="wall-item-{$oWall->getId()}">
            <div class="comment">
                <time datetime="{date_format date=$oWall->getDateAdd() format='c'}" class="comment-date">
                    {date_format date=$oWall->getDateAdd() hours_back="12" minutes_back="60" now="60" day="day H:i" format="j F Y, H:i"}
                </time>

                <div class="comment-content text" style="width: 100%; margin-left: 10px;">
                    {$oWall->getText()}
                </div>
            </div>
        </div>
    {/foreach}
</section>


Вот и все! Осталось лишь его раскрасить с помощью CSS и готово. Как это выглядит можно посмотреть у меня на главной странице справа в блоке «Наши новости».
Еще раз с праздником!

26 комментариев

avatar
Спасибо!)
avatar
получение массива последних записей со стены пользователя с идентификатором 1

лучше вынести в конфиг
avatar
Согласен, но не стал этого делать специально, поскольку это очень простой плагин). А в конфиг здесь можно вынести еще и порядок блока новостей, заголовок блока, количество подгружаемых новостей и т.д. Я не стал усложнять.
avatar
Это очень простой плагин, но он же — первый плагин, который я повторил :) Поэтому нужна помощь. Сделал по схеме, плагин активировался, на главной — вот:

Fatal error: Uncaught exception 'Exception' with message 'Can not find the block`s template: News' in /var/www/....../data/www/сайт.ru/engine/modules/viewer/Viewer.class.php:586 Stack trace: #0 /var/www/....../data/www/сайт.ru/plugins/aceadminpanel/classes/modules/viewer/Viewer.class.php(484): ModuleViewer->DefineTypeBlock('News', NULL) #1 /var/www/......./data/www/сайт.ru/engine/modules/viewer/Viewer.class.php(487): PluginAceadminpanel_ModuleViewer->DefineTypeBlock('News', NULL) #2 /var/www/...../data/www/сайт.ru/plugins/aceadminpanel/classes/modules/viewer/Viewer.class.php(463): ModuleViewer->AddBlock('right', 'News', Array, 100) #3 /var/www/......./data/www/сайт.ru/engine/modules/viewer/Viewer.class.php(529): PluginAceadminpanel_ModuleViewer->AddBlock('right', 'News', Array, 100) #4 [internal function]: ModuleViewer->AddBlocks('right', Array) #5 /var/www/....../data/www/сайт.ru/engine/classes/Engine.class.php(551): call_user_func_array(Array, Array) #6 /var/www/....../data/www/сайт.ru/ in /var/www/...../data/www/сайт.ru/engine/modules/viewer/Viewer.class.php on line 586


Конфликт с админкой? Или другое?

И еще хотелось бы подробностей про раскраску — где, чего и как :)
  • tor
  • 0
avatar
походу и конфликт и плохо пропысан плагин, буковки может где не совпадают, я все только что сделал все рабочие.
avatar
Буковки проверю, конечно, но жаль с админкой расставаться. А как у вас на сайте реализован слайдер? Это что-то готовое или самописное?
avatar
Моя ошибка, виноват. Букву пропустил, конфликта нет вроде бы.
avatar
слайдер есть в модулях на сайте, поищите.
avatar
Слайдер — это карусель от бутстрап вставленная в шаблон nav.tpl.
avatar
админка не видит плагин((( где копать? (подскажите)
avatar
Всё работает! Спасибо)

Побольше бы таких топиков!
avatar
Существует одна небольшая проблема. Если другой юзер оставит на стене Администратора (ID) сообщение. То «новость» появится в блоке. Хотелось бы чтобы появлялись только его его сообщения.
avatar
Добавьте еще одно условие в метод получения записей, проверяющее авторство ('user_id' => 1) так:
$aWall = $this->Wall_GetWall(
            array('wall_user_id' => 1, 'pid' => null, 'user_id' => 1),
            array('id' => 'desc'),
            1,
            Config::Get('plugin.areas.news_count'));
avatar
Спасибо за замечание, статью подправил.
avatar
Вам спасибо.
avatar

А установить фон для последних новостей?
avatar
css
avatar
Да, с помощью CSS.
Для блока добавьте уникальный класс, например news-block. Затем можно обращаться к частям блока новостей, например к первой по списку новости:
<style type="text/css">
    .news-block div[id^="wall-item-"]:nth-child(2) .comment{
        background:  red;
    }
</style>

Здесь указан селектор для элемента класса .comment, находящемся во втором диве с идентификатором, начинающимся с wall-item- в блоке новостей.
avatar
Ща попробую
avatar
Чет у меня ниче не выводит.
Может скинет кто плагин у кого работает?
avatar
Спасибо! Скинули уже!
avatar
Щас у меня просят плагин, поэтому я его все-таки выложу
github.com/andrey-v/livestreet_plugin_news
avatar
плагин (очень простой) выводящий стену админа на главную страницу в виде ленты новостей

Если поставить к этому плагину плагин стена, то получится новости и стена вместе. Как сделать из этого плагина самостоятельные новости?
  • tor
  • 0
avatar
А что бы не в сайтбаре выводился а в теле сайта, что переделать нужно?
avatar
Ну как список публикаций пользователя или вернее как топики 1 блога… )

avatar
Для этого нужно:
1. Зарегистрировать хук шаблона, куда Вы хотите вывести список со стены, в классе HookNews, например «template_content_begin» — хук на начало контента.
/**
     * Регистрация хуков
     */
    public function RegisterHook() {
        $this->AddHook('template_content_begin', 'ShowNews');
    }


2. Реализовать метод, который будет получать данные стены, как-то так:
public function ShowNews(){
        $aWall = $this->Wall_GetWall(
        // Так будет выводиться вся стена
        //array('wall_user_id' => 1, 'pid' => null),
        // А так, только записи админа ('user_id' => 1)
            array('wall_user_id' => 1, 'pid' => null, 'user_id' => 1),
            array('id' => 'desc'),
            1,   // Ид. пользователя со стены которого получаем записи 
            5);  // 5-количество получаемых и выводимых записей
        $oLocalViewer = $this->Viewer_GetLocalViewer();
        $oLocalViewer->Assign('aWall', $aWall['collection']);

        return $oLocalViewer->Fetch(Plugin::GetTemplatePath(__CLASS__) . 'admin_wall_list.tpl');
    }


3. Создать шаблон admin_wall_list.tpl для вывода списка также как и для блока.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.