XF 2.2 Помощь в доработки плагина

Версия XenForo
2.2.4

Skaiman

Проверенные
Сообщения
18,244
Решения
227
Реакции
33,766
Баллы
21,375
Хочу добавить функции в плагин [SVG] Forum Statistics Below Nodes, конкретно, блок статистики всех ресурсов форума, всех медиа галереи и всех статей AMS. Так то вывести, вывел:
PHP:
<?php

namespace SVG\ForumStatisticsBelowNodes\Widget;

use XF\Widget\AbstractWidget;

class Forumstatistics extends AbstractWidget
{
    public function render()
    {
        $db = \XF::db();
        $resourcesStatistics = $db->fetchOne("
        SELECT COUNT(resource_id)
        FROM xf_rm_resource
        ");       
        $viewParams = [
            'forumStatistics' => $this->app->forumStatistics,
            'articleStatistics' => $this->app->simpleCache()['XenAddons/AMS']['statisticsCache'],
            'resourcesStatistics' => $resourcesStatistics,
            'galleryStatistics' => $this->app->simpleCache()->XFMG->statisticsCache
        ];     
        return $this->renderer('svg_fsbn', $viewParams);
    }

    public function getOptionsTemplate()
    {
        return null;
    }
}
Но в этом случае, если не установлен какой то из плагинов, Article Management System, XenForo Media Gallery или XenForo Resource Manager, будет ошибка.
Есть настройка включения блоков (svg_fsbn_block_enable), чекбоксы, с помощью шаблона:
Код:
<xf:checkboxrow rowclass="{$rowClass}"
    label="{$titleHtml}"
    hint="{$hintHtml}"
    explain="{$property.description}">

    <xf:option name="{$formBaseKey}[threads]" selected="{$property.property_value.threads}">
        {{ phrase('threads') }}
    </xf:option>
    <xf:option name="{$formBaseKey}[messages]" selected="{$property.property_value.messages}">
        {{ phrase('messages') }}
    </xf:option>
    <xf:option name="{$formBaseKey}[articles]" selected="{$property.property_value.articles}">
        {{ phrase('xa_ams_articles') }}
    </xf:option>
    <xf:option name="{$formBaseKey}[resources]" selected="{$property.property_value.resources}">
        {{ phrase('xfrm_resources') }}
    </xf:option>
    <xf:option name="{$formBaseKey}[media]" selected="{$property.property_value.media}">
        {{ phrase('xfmg_media') }}
    </xf:option>
    <xf:option name="{$formBaseKey}[members]" selected="{$property.property_value.members}">
        {{ phrase('members') }}
    </xf:option>
    <xf:option name="{$formBaseKey}[latest_member]" selected="{$property.property_value.latest_member}">
        {{ phrase('latest_member') }}
    </xf:option>
</xf:checkboxrow>
Прошу помочь привязать настройку к php файлу виджета, что бы если выключен блок, то и обращение из файла не будет.
 
Решение
PHP:
<?php

namespace SVG\ForumStatisticsBelowNodes\Widget;

use XF;
use XF\Widget\AbstractWidget;

class Forumstatistics extends AbstractWidget
{
    public function render()
    {
        $enabledBlocks = XF::options()->svg_fsbn_block_enable;

        if (
                $enabledBlocks['threads'] && $enabledBlocks['messages']
                && $enabledBlocks['members'] && $enabledBlocks['latest_member']
        )
        {
            $viewParams['forumStatistics'] = $this->app->forumStatistics;
        }
        if (XF::isAddOnActive('XFRM') && $enabledBlocks['resources'])
        {
            $viewParams['resourceCount'] = $this->app->simpleCache()['SVG/ForumStatisticsBelowNodes']->statisticsCache;
        }
        if...
Прошу помочь привязать настройку к php файлу виджета, что бы если выключен блок, то и обращение из файла не будет.
Так он и не будет обращаться, просто оно пытается достучатся к инфе плуга, который тупо не установлен на форуме.

Как вариант можно проверить существует ли плагин с помощью \XF::isAddOnActive. Он возвращает false, в случае если аддон не установлен.
Пока бродил по движку, увидел, что у темплейтера есть уже метод который вызывает этот класс:
Screenshot_36.png
 
Последнее редактирование:
Как объединить? :)
Наверно как-то так, не обещаю что будет работать:
PHP:
if (\XF::isAddOnActive('id xfrm', 'versiya', '=>'))
{
    $db = \XF::db();
    $resourcesStatistics = $db->fetchOne("
        SELECT COUNT(resource_id)
        FROM xf_rm_resource
        ");
}
else
{
    return false;
}

$viewParams = [
    'forumStatistics' => $this->app->forumStatistics,
    'articleStatistics' => \XF::isAddOnActive('addonid', 'versiya', '>=') ? действие : false,
    'resourcesStatistics' => $resourcesStatistics,
    'galleryStatistics' => \XF::isAddOnActive('addonid', 'versiya', '>=') ? действие : false
];

Потом условиями шаблона проверяешь существуют ли переменные, а, ну и впиши версии и айди-аддонов.
 
Последнее редактирование:
Если это делаю
Код:
if (\XF::isAddOnActive('id xfrm', 'versiya', '=>'))
{
    $db = \XF::db();
    $resourcesStatistics = $db->fetchOne("
        SELECT COUNT(resource_id)
        FROM xf_rm_resource
        ");
}
else
{
    return false;
}
вообще пропадает виджет, и ошибки темлейтера те же идут
 
Если это делаю
Код:
if (\XF::isAddOnActive('id xfrm', 'versiya', '=>'))
{
    $db = \XF::db();
    $resourcesStatistics = $db->fetchOne("
        SELECT COUNT(resource_id)
        FROM xf_rm_resource
        ");
}
else
{
    return false;
}
вообще пропадает виджет, и ошибки темлейтера те же идут
А ты айдишник и версию поменял на свою?
 
Skaiman, Изменяй функцию getForumStatisticsCacheData, чтобы результаты кэшировались.
Там же проверяй наличие Репозитория нужного плагина и используй Finder вместо запросов к базе данных
PHP:
<?php

namespace XF\Repository;

use XF\Mvc\Entity\Repository;

class Counters extends Repository
{
    public function getForumStatisticsCacheData()
    {
        $cache = [];

        /** @var \XF\Repository\Forum $forumRepo */
        $forumRepo = $this->repository('XF:Forum');
        $cache += $forumRepo->getForumCounterTotals();

        /** @var \XF\Repository\User $userRepo */
        $userRepo = $this->repository('XF:User');

        $cache['users'] = $userRepo->findValidUsers()->total();

        $latestUser = $userRepo->getLatestValidUser();
        $cache['latestUser'] = $latestUser ? $latestUser->toArray() : null;

        return $cache;
    }

    public function rebuildForumStatisticsCache()
    {
        $cache = $this->getForumStatisticsCacheData();
        \XF::registry()->set('forumStatistics', $cache);
        return $cache;
    }
}
 
ага, если б я еще шарил в php :)
PHP:
        $articleStatistics = null;
        if (\XF::isAddOnActive('XenAddons\AMS'))
        {
            $articleStatistics = $this->app->simpleCache()['XenAddons/AMS']->statisticsCache
        }

        $resourcesStatistics = null;
        if (\XF::isAddOnActive('XFRM'))
        {
            $resourceFinder = $this->finder('XFRM:ResourceItem');
            $resourcesStatistics = $resourceFinder
                ->where('resource_state', '=', 'visible')
                ->total();
        }

        $galleryStatistics = null;
        if (\XF::isAddOnActive('XFMG'))
        {
            $galleryFinder = $this->finder('XFMG:MediaItem');
            $galleryStatistics = $galleryFinder
                ->where('media_state', '=', 'visible')
                ->total();
        }
    
        $viewParams = [
            'forumStatistics' => $this->app->forumStatistics,
            'articleStatistics' => $articleStatistics,
            'resourceStatistics' => $resourcesStatistics,
            'galleryStatistics' => $galleryStatistics
        ];   
        return $this->renderer('svg_fsbn', $viewParams);

Только что проверил у себя на локалке в таком варианте, все работает. Если плагин не установлен/отключен переменные возвращают null.
 
Последнее редактирование:
PHP:
<?php

namespace SVG\ForumStatisticsBelowNodes\Widget;

use XF;
use XF\Widget\AbstractWidget;

class Forumstatistics extends AbstractWidget
{
    public function render()
    {
        $enabledBlocks = XF::options()->svg_fsbn_block_enable;

        if (
                $enabledBlocks['threads'] && $enabledBlocks['messages']
                && $enabledBlocks['members'] && $enabledBlocks['latest_member']
        )
        {
            $viewParams['forumStatistics'] = $this->app->forumStatistics;
        }
        if (XF::isAddOnActive('XFRM') && $enabledBlocks['resources'])
        {
            $viewParams['resourceCount'] = $this->app->simpleCache()['SVG/ForumStatisticsBelowNodes']->statisticsCache;
        }
        if (XF::isAddOnActive('XFMG') && $enabledBlocks['media'])
        {
            $viewParams['resourceCount'] = $this->app->simpleCache()->XFMG->statisticsCache
        }
        if (XF::isAddOnActive('XenAddons/AMS') && $enabledBlocks['articles'])
        {
            $viewParams['resourceCount'] = $this->app->simpleCache()['XenAddons/AMS']->statisticsCache;
        }
      
        return $this->renderer('svg_fsbn', $viewParams);
    }
}

SVG/ForumStatisticsBelowNodes/Cron/Statistics.php:
PHP:
<?php

namespace SVG\ForumStatisticsBelowNodes\Cron;

use XF;

class Statistics
{
    public static function cacheResourceStatistics()
    {
        $cache = XF::app()->simpleCache()['SVG/ForumStatisticsBelowNodes'];
        $db = XF::db();

        $categoryCount = $db->fetchOne('
            SELECT COUNT(*)
            FROM xf_rm_resource
        ');

        $cache->statisticsCache = [
            'resource_count' => $resourceCount
        ];
    }
}
В админке добавить cron-задачу, которая будет выполняться каждый час. Callback: SVG\ForumStatisticsBelowNodes\Cron\Statistics :: cacheResourceStatistics

Как-то так ?
 
Последнее редактирование:
Skaiman, То пусто то густо ))))
Держи на всякий ещё один вариант
PHP:
<?php

namespace DCom\Stata\XF\Repository;

use XF\Mvc\Entity\Repository;

class Counters extends XFCP_Counters
{
    public function getForumStatisticsCacheData()
    {
        $cache = parent::getForumStatisticsCacheData();

        if (\XF::isAddOnActive('XFRM'))
        {
            $finder = \XF::finder('XFRM:Category');
            $cache['totalResource'] = $finder->pluckFrom('resource_count')->total();
        }

        return $cache;
    }
}

В шаблоне виджета проверку на $forumStatistics.totalResource
Ну и сам класс расширить.
 
В первом посте, то что и надо было, только надо было отключать в настройках плагина не установленные плагины, решение от Atikin, ближе к тому что я задумал, я его использовал, немного поправил под свои переменные и запрос в базу, но на данный момент выводит нули :)
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу