Current File : /home/pacjaorg/public_html/kmm/libraries/regularlabs/src/SystemPlugin.php
<?php
/**
 * @package         Regular Labs Library
 * @version         23.9.3039
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            https://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         GNU General Public License version 2 or later
 */

namespace RegularLabs\Library;

defined('_JEXEC') or die;

use Joomla\CMS\Application\CMSApplication as JCMSApplication;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Form\Form as JForm;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Plugin\CMSPlugin as JCMSPlugin;
use Joomla\CMS\Plugin\PluginHelper as JPluginHelper;
use Joomla\Database\DatabaseDriver as JDatabaseDriver;
use Joomla\Registry\Registry as JRegistry;

class SystemPlugin extends JCMSPlugin
{
    public    $_alias              = '';
    public    $_lang_prefix        = '';
    public    $_title              = '';
    protected $_can_disable_by_url = true;
    protected $_doc_ready          = false;
    protected $_enable_in_admin    = false;
    protected $_enable_in_indexer  = true;
    protected $_enable_in_frontend = true;
    protected $_id                 = 0;
    protected $_jversion           = 4;
    protected $_page_types         = ['html', 'feed', 'pdf', 'xml', 'ajax', 'json', 'raw'];
    protected $_pass;
    /**
     * @var    JCMSApplication
     */
    protected $app;
    protected $autoloadLanguage = true;
    /**
     * @var    JDatabaseDriver
     */
    protected $db;

    /**
     * @param object  &$subject    The object to observe
     * @param array    $config     An optional associative array of configuration settings.
     *                             Recognized key values include 'name', 'group', 'params', 'language'
     *                             (this list is not meant to be comprehensive).
     */
    public function __construct(&$subject, $config = [])
    {
        if (isset($config['id']))
        {
            $this->_id = $config['id'];
        }

        parent::__construct($subject, $config);

        $this->app = JFactory::getApplication();
        $this->db  = JFactory::getDbo();

        if (empty($this->_alias))
        {
            $this->_alias = $this->_name;
        }

        if (empty($this->_title))
        {
            $this->_title = strtoupper($this->_alias);
        }
    }

    /**
     * @param string $extension The extension for which a language file should be loaded
     * @param string $basePath  The basepath to use
     *
     * @return  bool  True, if the file has successfully loaded.
     */
    public function loadLanguage($extension = '', $basePath = JPATH_ADMINISTRATOR)
    {
        parent::loadLanguage('plg_system_regularlabs', JPATH_LIBRARIES . '/regularlabs');

        return parent::loadLanguage();
    }

    /**
     * @return  void
     */
    public function onAfterDispatch(): void
    {
        if ( ! $this->passChecks())
        {
            return;
        }

        $this->handleOnAfterDispatch();

        $buffer = Document::getComponentBuffer();

        $this->loadStylesAndScripts($buffer);

        if ( ! $buffer)
        {
            return;
        }

        $this->changeDocumentBuffer($buffer);

        Document::setComponentBuffer($buffer);
    }

    /**
     * @return  void
     */
    public function onAfterInitialise(): void
    {
        if ( ! $this->passChecks())
        {
            return;
        }

        $this->handleOnAfterInitialise();
    }

    /**
     * @return  void
     */
    public function onAfterRender(): void
    {
        if ( ! $this->passChecks())
        {
            return;
        }

        $this->handleOnAfterRender();

        $html = $this->app->getBody();

        if ($html == '')
        {
            return;
        }

        if ( ! $this->changeFinalHtmlOutput($html))
        {
            return;
        }

        $this->cleanFinalHtmlOutput($html);

        $this->app->setBody($html);
    }

    /**
     * @param object $module
     * @param array  $params
     *
     * @return  void
     */
    public function onAfterRenderModule(&$module, &$params): void
    {
        if ( ! $this->passChecks())
        {
            return;
        }

        $this->handleOnAfterRenderModule($module, $params);
    }

    /**
     * @param string $buffer
     * @param array  $params
     *
     * @return  void
     */
    public function onAfterRenderModules(&$buffer, &$params): void
    {
        if ( ! $this->passChecks())
        {
            return;
        }

        $this->handleOnAfterRenderModules($buffer, $params);

        if (empty($buffer))
        {
            return;
        }

        $this->changeModulePositionOutput($buffer, $params);
    }

    /**
     * @return  void
     */
    public function onAfterRoute(): void
    {
        $this->_doc_ready = true;

        if ( ! $this->passChecks())
        {
            return;
        }

        $this->handleOnAfterRoute();
    }

    /**
     * @return  void
     */
    public function onBeforeCompileHead(): void
    {
        if ( ! $this->passChecks())
        {
            return;
        }

        $this->handleOnBeforeCompileHead();
    }

    /**
     * @param string    $context The context of the content being passed to the plugin.
     * @param mixed    &$row     An object with a "text" property
     * @param mixed    &$params  Additional parameters. See {@see PlgContentContent()}.
     * @param integer   $page    Optional page number. Unused. Defaults to zero.
     *
     * @return  void
     */
    public function onContentPrepare($context, &$article, &$params, $page = 0): void
    {
        if ( ! $this->passChecks())
        {
            return;
        }

        $area    = isset($article->created_by) ? 'article' : 'other';
        $context = (($params instanceof JRegistry) && $params->get('rl_search')) ? 'com_search.' . $params->get('readmore_limit') : $context;

        if ( ! $this->handleOnContentPrepare($area, $context, $article, $params, $page))
        {
            return;
        }

        Article::process($article, $context, $this, 'processArticle', [$area, $context, $article, $page]);
    }

    /**
     * @param JForm    $form The form
     * @param stdClass $data The data
     *
     * @return  bool
     */
    public function onContentPrepareForm(JForm $form, $data): bool
    {
        if ( ! $this->passChecks())
        {
            return true;
        }

        return $this->handleOnContentPrepareForm($form, $data);
    }

    /**
     * @param string &$string
     * @param string  $area
     * @param string  $context The context of the content being passed to the plugin.
     * @param mixed   $article An object with a "text" property
     * @param int     $page    Optional page number. Unused. Defaults to zero.
     *
     * @return  void
     */
    public function processArticle(&$string, $area = 'article', $context = '', $article = null, $page = 0)
    {
    }

    /**
     * @param string $buffer
     *
     * @return  bool
     */
    protected function changeDocumentBuffer(&$buffer)
    {
        return false;
    }

    /**
     * @param string $html
     *
     * @return  bool
     */
    protected function changeFinalHtmlOutput(&$html)
    {
        return false;
    }

    /**
     * @param string $buffer
     * @param string $params
     *
     * @return  void
     */
    protected function changeModulePositionOutput(&$buffer, &$params)
    {
    }

    /**
     * @param string $html
     *
     * @return  void
     */
    protected function cleanFinalHtmlOutput(&$html)
    {
    }

    protected function extraChecks()
    {
        return true;
    }

    /**
     * @return  void
     */
    protected function handleFeedArticles()
    {
        if ( ! empty($this->_page_types)
            && ! in_array('feed', $this->_page_types, true)
        )
        {
            return;
        }

        if ( ! Document::isFeed()
            && JFactory::getApplication()->input->get('option', '') != 'com_acymailing'
        )
        {
            return;
        }

        if ( ! isset(Document::get()->items))
        {
            return;
        }

        $context = 'feed';
        $items   = Document::get()->items;
        $params  = null;

        foreach ($items as $item)
        {
            $this->handleOnContentPrepare('article', $context, $item, $params);
        }
    }

    /**
     * @return  void
     */
    protected function handleOnAfterDispatch()
    {
        $this->handleFeedArticles();
    }

    /**
     * @return  void
     */
    protected function handleOnAfterInitialise()
    {
    }

    /**
     * @return  void
     *
     * Consider using changeFinalHtmlOutput instead
     */
    protected function handleOnAfterRender()
    {
    }

    /**
     * @param object $module
     * @param array  $params
     *
     * @return  void
     */
    protected function handleOnAfterRenderModule(&$module, &$params)
    {
    }

    /**
     * @param string $buffer
     * @param array  $params
     *
     * @return  void
     */
    protected function handleOnAfterRenderModules(&$buffer, &$params)
    {
    }

    /**
     * @return  void
     */
    protected function handleOnAfterRoute()
    {
    }

    /**
     * @return  void
     */
    protected function handleOnBeforeCompileHead()
    {
    }

    /**
     * @param string    $area
     * @param string    $context The context of the content being passed to the plugin.
     * @param mixed     $article An object with a "text" property
     * @param mixed    &$params  Additional parameters. See {@see PlgContentContent()}.
     * @param int       $page    Optional page number. Unused. Defaults to zero.
     *
     * @return  bool
     */
    protected function handleOnContentPrepare($area, $context, &$article, &$params, $page = 0)
    {
        return true;
    }

    /**
     * @param JForm    $form The form
     * @param stdClass $data The data
     *
     * @return  bool
     */
    protected function handleOnContentPrepareForm(JForm $form, $data)
    {
        return true;
    }

    /**
     * @return  bool
     */
    protected function is3rdPartyEditPage()
    {
        $input = JFactory::getApplication()->input;

//        // Disable on Gridbox edit form: option=com_gridbox&view=gridbox
//        if ($input->get('option', '') == 'com_gridbox' && $input->get('view', '') == 'gridbox')
//        {
//            return false;
//        }

        // Disable on SP PageBuilder edit form: option=com_sppagebuilder&view=form
        if ($input->get('option', '') == 'com_sppagebuilder' && $input->get('view', '') == 'form')
        {
            return true;
        }

        return false;
    }

    /**
     * @param string $buffer
     *
     * @return  void
     */
    protected function loadStylesAndScripts(&$buffer)
    {
    }

    /**
     * @return  bool
     */
    protected function passChecks()
    {
        if ( ! is_null($this->_pass))
        {
            return $this->_pass;
        }

        $this->setPass(false);

        if ( ! $this->isFrameworkEnabled())
        {
            return false;
        }

        if ($this->is3rdPartyEditPage())
        {
            return false;
        }

        if ($this->_doc_ready && ! $this->passPageTypes())
        {
            return false;
        }

        if ( ! $this->_enable_in_frontend && $this->app->isClient('site'))
        {
            return false;
        }

        $is_indexer = $this->app->input->get('option') == 'com_finder'
            && $this->app->input->get('task') == 'batch';

        if ($this->app->input->get('option'))
        {
            $this->resetPass();
        }

        if ( ! $this->_enable_in_indexer && $is_indexer)
        {
            return false;
        }

        $is_admin = ! $this->app->isClient('site') && ! $is_indexer;

        if ( ! $this->_enable_in_admin && $is_admin)
        {
            return false;
        }

        // disabled by url?
        if (
            $this->_can_disable_by_url
            && Protect::isDisabledByUrl($this->_alias)
        )
        {
            return false;
        }

        if ( ! $this->extraChecks())
        {
            return false;
        }

        $this->setPass(true);

        return true;
    }

    protected function passPageTypes()
    {
        if (empty($this->_page_types))
        {
            return true;
        }

        if (in_array('*', $this->_page_types, true))
        {
            return true;
        }

        if (Document::isFeed())
        {
            return in_array('feed', $this->_page_types, true);
        }

        if (Document::isPDF())
        {
            return in_array('pdf', $this->_page_types, true);
        }

        $page_type = Document::get()->getType();

        return in_array($page_type, $this->_page_types, true);
    }

    /**
     * Place an error in the message queue
     */
    protected function throwError($error)
    {
        $user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();

        // Return if page is not an admin page or the admin login page
        if ( ! JFactory::getApplication()->isClient('administrator')
            || $user->get('guest')
        )
        {
            return;
        }

        // load the admin language file
        JFactory::getLanguage()->load('plg_' . $this->_type . '_' . $this->_name, JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name);

        $text = JText::sprintf($this->_lang_prefix . '_' . $error, JText::_($this->_title));
        $text = JText::_($text) . ' ' . JText::sprintf($this->_lang_prefix . '_EXTENSION_CAN_NOT_FUNCTION', JText::_($this->_title));

        // Check if message is not already in queue
        $messagequeue = JFactory::getApplication()->getMessageQueue();

        foreach ($messagequeue as $message)
        {
            if ($message['message'] == $text)
            {
                return;
            }
        }

        JFactory::getApplication()->enqueueMessage($text, 'error');
    }

    /**
     * Check if the Regular Labs Library is enabled
     *
     * @return bool
     */
    private function isFrameworkEnabled()
    {
        if ( ! defined('REGULAR_LABS_LIBRARY_ENABLED'))
        {
            $this->setIsFrameworkEnabled();
        }

        if ( ! REGULAR_LABS_LIBRARY_ENABLED)
        {
            $this->throwError('REGULAR_LABS_LIBRARY_NOT_ENABLED');
        }

        return REGULAR_LABS_LIBRARY_ENABLED;
    }

    /**
     * @return  void
     */
    private function resetPass()
    {
        $this->_pass = null;
    }

    /**
     * Set the define with whether the Regular Labs Library is enabled
     */
    private function setIsFrameworkEnabled()
    {
        if ( ! JPluginHelper::isEnabled('system', 'regularlabs'))
        {
            $this->throwError('REGULAR_LABS_LIBRARY_NOT_ENABLED');

            define('REGULAR_LABS_LIBRARY_ENABLED', false);

            return;
        }

        define('REGULAR_LABS_LIBRARY_ENABLED', true);
    }

    /**
     * @param bool $pass
     *
     * @return  void
     */
    private function setPass($pass)
    {
        if ( ! $this->_doc_ready)
        {
            return;
        }

        $this->_pass = (bool) $pass;
    }
}
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!