Your IP : 216.73.217.142


Current Path : /var/www/consult-e-syn/public_html/plugins/system/betterpreview/src/
Upload File :
Current File : /var/www/consult-e-syn/public_html/plugins/system/betterpreview/src/GenerateSefs.php

<?php
/**
 * @package         Better Preview
 * @version         6.9.0
 * 
 * @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\Plugin\System\BetterPreview;

defined('_JEXEC') or die;

use Exception;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Router\Route as JRoute;
use RegularLabs\Library\Document as RL_Document;

if (RL_Document::isClient('administrator'))
{
    die;
}

// need to set the user agent, to prevent breaking when debugging is switched on
$_SERVER['HTTP_USER_AGENT'] = '';

$helper = new GenerateSefs;
$helper->render();

class GenerateSefs
{
    var $params = null;

    public function render()
    {
        $user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();

        // log into frontend
        if ( ! $user->id)
        {
            $this->logIn();
        }

        // Get a minimum of 50 urls to update
        $urls = $this->getUrlsToUpdate(50);

        if (empty($urls))
        {
            die('no sefs to update');
        }

        $this->insertSefRecords($urls);

        die('sefs updated');
    }

    private function deleteSefRecords($urls)
    {
        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->delete('#__betterpreview_sefs')
            ->where($db->quoteName('url') . ' IN (\'' . implode('\',\'', $urls) . '\')');
        $db->setQuery($query);
        $db->execute();
    }

    private function getOldUrls($max, $min_age = '1 day')
    {
        $date = JFactory::getDate('now - ' . $min_age);

        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('a.url')
            ->from('#__betterpreview_sefs as a')
            ->where('a.created < ' . $db->quote($date->toSql()))
            ->order('a.created ASC')
            ->setLimit($max);
        $db->setQuery($query);
        $urls = $db->loadColumn();

        if ( ! $urls)
        {
            $urls = [];
        }

        return $urls;
    }

    private function getRandomMenuUrls($max)
    {
        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('CONCAT(a.link, \'&Itemid=\', a.id)')
            ->from('#__menu as a')
            ->where('a.client_id = 0')
            ->where('a.type != ' . $db->quote('alias'))
            ->where('a.type != ' . $db->quote('url'))
            ->where('a.link != ' . $db->quote(''))
            ->order('RAND()')
            ->setLimit($max);
        $db->setQuery($query);
        $menuitems = $db->loadColumn();

        if (empty($menuitems))
        {
            return [];
        }

        $query = $db->getQuery(true)
            ->select('a.url')
            ->from('#__betterpreview_sefs as a')
            ->where('a.url IN (\'' . implode('\',\'', $menuitems) . '\')');
        $db->setQuery($query);
        $sefs = $db->loadColumn();

        if ( ! empty($sefs))
        {
            return $menuitems;
        }

        return array_diff($menuitems, $sefs);
    }

    private function getSefUrl($url)
    {
        if ( ! $url)
        {
            return false;
        }

        if (substr($url, 0, 4) == 'http')
        {
            return $url;
        }

        $sef = JRoute::_($url);

        if ($sef == $url || $sef == '/' . $url)
        {
            return false;
        }

        return $sef;
    }

    private function getSefUrls($urls)
    {
        $sefs = [];

        foreach ($urls as $url)
        {
            if ( ! $sef = $this->getSefUrl($url))
            {
                continue;
            }

            $sefs[$url] = $sef;
        }

        return $sefs;
    }

    private function getUrlsToUpdate($min = 50)
    {
        $params = Params::get();

        // get all outdated urls (older than timeout setting, maximum 500)
        $urls = $this->getOldUrls(500, $params->index_timeout . ' hours');

        if (count($urls) >= $min)
        {
            return $urls;
        }

        // Less than minimum number of urls found, so let's get more (older than an hour, maximum 50)
        $urls = $this->getOldUrls($min, '1 hour');

        if (count($urls) >= $min)
        {
            return $urls;
        }

        // still not much to do? lets also add/update some random menu urls
        $menuitems = $this->getRandomMenuUrls(($min - count($urls)));
        $urls      = array_merge($urls, $menuitems);

        return $urls;
    }

    private function insertSefRecords($urls)
    {
        // Delete urls from sef database so they will get renewed
        $this->deleteSefRecords($urls);

        $sefs = $this->getSefUrls($urls);

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

        $date = JFactory::getDate();

        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->insert('#__betterpreview_sefs')
            ->columns([$db->quoteName('url'), $db->quoteName('sef'), $db->quoteName('created')]);

        foreach ($sefs as $url => $sef)
        {
            $query->values($db->quote($url) . ',' . $db->quote($sef) . ',' . $db->quote($date->toSql()));
        }

        $db->setQuery($query);
        $db->execute();
    }

    private function logIn()
    {
        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('userid')
            ->from('#__session')
            ->where('session_id = ' . $db->quote(JFactory::getApplication()->input->get('session')))
            ->where('client_id = 1')
            ->where('guest = 0');
        $db->setQuery($query);
        $userid = $db->loadResult();

        $user = JFactory::getUser($userid);

        if ($user instanceof Exception)
        {
            return;
        }

        $session = JFactory::getSession();
        $session->set('user', $user);
        JFactory::getApplication()->checkSession();
    }
}