Your IP : 216.73.216.240


Current Path : /home/juvelize/saulnois/tmp/install_695d2cf0b4957/src/
Upload File :
Current File : /home/juvelize/saulnois/tmp/install_695d2cf0b4957/src/TArticle.php

<?php
/*
* @package		Tech Fry Library
* @license		https://www.gnu.org/licenses/gpl-3.0.en.html
*/

namespace TechFry\Library;

use Joomla\CMS\Factory;
use Joomla\CMS\Table\Content;
use Joomla\CMS\Helper\TagsHelper;
use Joomla\Component\Content\Site\Helper\RouteHelper;
use Joomla\CMS\Router\Route;

// Script for Working with Joomla Articles
class TArticle
{
    /*
    find_article, create_article, update_article, filter_articles, get_tags, get_article, get_articles
        get_articles_by_category, get_articles_by_tag, get_last_id, get_fields, render_fields, get_article_link
    */

    public $article_id;

    // 01. Returns article id from alias
    public function find_article($alias, $catid = null)
    {
        $db = Factory::getDbo();
        $query = $db->getQuery(true);
        
        $query->select($db->quoteName('id'))
            ->from($db->quoteName('#__content'))
            ->where($db->quoteName('alias') . ' = '. $db->quote($alias));
            
        if ($catid != null)
        {
            $query->andWhere($db->quoteName('catid') . ' = '. $db->quote($catid));
        }
            
        $db->setQuery($query);
        
        $article_id = $db->loadResult();
        
        return $article_id ? $article_id : false;
    }
            
    // 02. Create new joomla article from $data array
    public function create_article($data)
    {
        // $data array - title, catid required
        
        $app = Factory::getApplication();
        $mvcFactory = $app->bootComponent('com_content')->getMVCFactory();
        $articleModel = $mvcFactory->createModel('Article', 'Administrator', array('ignore_request' => true));

        $data['introtext'] = $data['introtext'] ?? '';
        
        if (!isset($data['language']))
        {
            $data['language'] = '*';
        }
        
        $data['id'] = 0;
        
        $data['created'] = Factory::getDate()->toSql();
        $data['modified'] = Factory::getDate()->toSql();
        
        if (!$articleModel->save($data))
        {
            $app->enqueueMessage($articleModel->getError(), 'error');

            return false;
        }
        
        $article_id = $this->get_last_id();
        
        return $article_id;
    }
            
    // 03. Update existing joomla article
    public function update_article($data)
    {
        $app = Factory::getApplication();

        if (!$data['id'])
        {
            $app->enqueueMessage('Article ID is not set.', 'error');
            
            return false;
        }
        
        $mvcFactory = $app->bootComponent('com_content')->getMVCFactory();
        $articleModel = $mvcFactory->createModel('Article', 'Administrator', array('ignore_request' => true));
        
        if (!isset($data['tags']))
        {
            $th = new TagsHelper();
            $currentTags = $th->getTagIds($data['id'], 'com_content.article');
            $data['tags'] = explode(',', $currentTags);
        }
        
        $data['modified'] = Factory::getDate()->toSql();
        
        if (!$articleModel->save($data))
        {
            $app->enqueueMessage($articleModel->getError(), 'error');
            
            return false;
        }

        return true;
    }
    
    // 04. Filter articles
    public function filter_articles($filters, $articlefilters)
    {
        $db = Factory::getDbo();
        $query = $db->getQuery(true);
        
        $query
            ->select($db->quoteName(array('a.id')))
            ->from($db->quoteName('#__content', 'a'))
            ->where($db->quoteName('a.id') . ' > ' . $db->quote(0))
            ->order('a.id ASC');
        
        // Joomla Content Table
        if (is_string($filters))
        {
            $filters = json_decode($filters);
        }
        $filters_arr = (array) $filters;
            
        if (!empty($filters_arr))
        {
            foreach ($filters_arr as $filter_obj)
            {
                $filter = (array) $filter_obj;
                
                // Case 1: Filter value is given
                if (($filter['where_field'] != '') && ($filter['where_value'] != ''))
                {
                    if ($filter['field_type'] == 'date')
                    {
                        $date = Factory::getDate('now -' . $filter['where_value'] . ' day');
                        $filter['where_value'] = $date->toSQL();
                    }
                    
                    $query->andWhere($db->quoteName('a.' . $filter['where_field']) . ' ' . $filter['where_operator'] . ' ' . $db->quote($filter['where_value']));
                }
                // Case 2: Filter value is not given (Example: IS NULL)
                elseif (!empty($filter['where_field']) && empty($filter['where_value']))
                {
                    $query->andWhere($db->quoteName('a.' . $filter['where_field']) . ' ' . $filter['where_operator']);
                }
            }
        }
        
        // Content Custom Fields
        if (is_array(json_decode($articlefilters, true)) && (json_last_error() == JSON_ERROR_NONE))
        {
            $articlefilters = json_decode($articlefilters);
        }
        $articlefilters_arr = (array) $articlefilters;
        
        if (!empty($articlefilters_arr))
        {
            foreach ($articlefilters_arr as $filter_obj)
            {
                $filter = (array) $filter_obj;
                
                if (is_numeric($filter['where_field']))
                {
                    $query->join('INNER', $db->quoteName('#__fields_values', 'c') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('c.item_id') . ')')
                        ->andWhere($db->quoteName('c.field_id') . ' = ' . $db->quote($filter['where_field']))
                        ->andWhere($db->quoteName('c.value') . ' ' . $filter['where_operator'] . ' ' . $db->quote($filter['where_value']));
                }
            }
        }
    
        $db->setQuery($query);
        
        $articles = $db->loadColumn();
        
        return $articles;
    }
    
    // 05. Returns array of tag names associated with article
    public function get_tags($article_id)
    {
        $th = new TagsHelper();
        $currentTags = $th->getTagIds($article_id, 'com_content.article');
        
        $currentTagnames = $th->getTagNames(explode(',', $currentTags));
        
        return $currentTagnames;
    }

    // 06. Get article by ID
    public function get_article($article_id)
    {
        // Joomla Article + image, image_intro, image_fulltext, url
        
        $ex = new TExtension('com_content');
        $articleModel = $ex->get_model('Article');

	  	$article = $articleModel->getItem($article_id);

        $article->image = $article->images['image_intro'];
        $article->image_intro = $article->images['image_intro'];
        $article->image_fulltext = $article->images['image_fulltext'];

        $slug = $article->id . ':' . $article->alias;
        $article->url = Route::link('site', RouteHelper::getArticleRoute($slug, $article->catid, $article->language));
	    
	    return $article;
    }

    // 07. Get Joomla Articles
    public function get_articles($config = array())
    {
        $conditions = array();

        // Published
        $published = $config['published'] ?? $config['state'] ?? 1;
        $conditions[] = array('state', '=', $published);

        // Categories
        $categories = $config['category'] ?? $config['catid'] ?? 0;
        if ($categories)
        {
            $categories = (array) $categories;
            $conditions[] = array('catid', 'IN', implode(',', $categories));
        }

        if (\is_array($config['filter']))
        {
            $conditions = array_merge($conditions, $config['filter']);
        }

        $limit = isset($config['limit']) && $config['limit'] ? $config['limit'] : '';

        $order_col = isset($config['order']) && $config['order']? $config['order'] : 'id';
        $order_dirn = $config['order_dirn'] ?? 'DESC';

        $order = $order_col . ' ' . $order_dirn;

        $db = new TDb('content');
        $articles = $db->get_items(array('conditions' => $conditions, 'order' => $order, 'limit' => $limit));

        foreach ($articles as $article)
        {
            $images = json_decode($article->images, true);

            if (isset($images['image_intro']))
            {
                $article->image = $images['image_intro'];
                $article->image_intro = $images['image_intro'];
            }
            if (isset($images['image_fulltext']))
            {
                $article->image_fulltext = $images['image_fulltext'];
            }

            $slug = $article->id . ':' . $article->alias;
            $article->url = Route::link('site', RouteHelper::getArticleRoute($slug, $article->catid, $article->language));
        }

        return $articles;
    }
    
    // 08. Get articles by category
    public function get_articles_by_category($category_id, $order = 'id DESC', $limit = 12)
    {
        $today = Factory::getDate();
        
        $db = Factory::getDbo();
		$query = $db->getQuery(true);
		
		$query->select($db->quoteName(array('id', 'title', 'alias', 'introtext', 'fulltext', 'state', 'access', 'images', 'catid', 'language', 'publish_up')))
		    ->from($db->quoteName('#__content'))
		    ->where($db->quoteName('catid') . ' = ' . $category_id)
		    ->andWhere($db->quoteName('state') . ' = '. $db->quote('1'))
		    ->andWhere($db->quoteName('publish_up') . ' < ' . $db->quote($today))
		    ->order($order)
		    ->setLimit($limit);

	    $db->setQuery($query);
	    
        $articles = $db->loadObjectList();
        
        return $articles;
    }
    
    // 09. Get articles by tag
    public function get_articles_by_tag($tag_id, $order = 'id DESC', $limit = 12)
    {
        $typesr = null;
        $includeChildren = false;
        $orderByOption = 'c.core_title';
        $orderDir = 'ASC';
        $anyOrAll = true;
        $languageFilter = 'all';
        $stateFilter = '0,1';
        
        $th = new TagsHelper();
        
        $query = $th->getTagItemsQuery($tag_id, $typesr, $includeChildren, $orderByOption, $orderDir, $anyOrAll, $languageFilter, $stateFilter);
        
        $db = Factory::getDbo();
        
        $db->setQuery($query);
        
        $articles = $db->loadObjectList();
        
        return $articles;
    }

    // 10. Get ID of last article
    public function get_last_id()
    {
        $db = Factory::getDbo();
        $query = $db->getQuery(true);
        
        $query->select('id')
            ->from($db->quoteName('#__content'))
            ->order('id DESC')
            ->setLimit('1');
        
        $db->setQuery($query);

		$result = $db->loadResult();
        
        return $result;
    }

    // 11. Get fields
    public function get_fields($article_id = null)
    {
        if ($article_id == null)
        {
            $fields = FieldsHelper::getFields('com_content.article');
        }
        else
        {
            $item = $this->get_article($article_id);
            $fields = FieldsHelper::getFields('com_content.article', $item);
        }
        
        return $fields;
    }
    
    // 12. Render fields
    public function render_fields($article_id)
    {
        $output = '';
        
        $item = $this->get_article($article_id);
        $fields = FieldsHelper::getFields('com_content.article', $item);
        foreach ($fields as $field)
        {
            $output .= FieldsHelper::render('com_content.article', 'field.render', array('field' => $field));
        }
        
        return $output;
    }

    // 13.
    public function get_article_link($article_id)
    {
        $article = $this->get_article($article_id);
        
        $slug = $article->id . ':' . $article->alias;
        
        $link = Route::link('site', RouteHelper::getArticleRoute($slug, $article->catid, $article->language));

        return $link;
    }
}