Skip to content

System error: "Argument 1 passed to ConstantIntegerType::__construct() must be of the type int, string given" #7454

@regularlabs

Description

@regularlabs

Bug Report

Subject Details
Rector version Rector 0.14.2

Minimal PHP Code Causing Issue

7.4

When trying to test this on https://getrector.org/demo/ I get:

Oops! An Error Occurred
The server returned a "500 Internal Server Error".

But it is throwing this error:

Show error
 [ERROR] Could not process "/.../helper.php" file, due to:
         "System error: "Argument 1 passed to PHPStan\Type\Constant\ConstantIntegerType::__construct() must be of the type int,
         string given, called in
         phar://vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar/src/Reflection/InitializerExprTypeResolver.php:106"

         Stack trace:
         #0 phar://vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar/src/Reflection/InitializerExprTypeResolver.php(106):
         PHPStan\Type\Constant\ConstantIntegerType->__construct('100_000_000')
         #1 phar://vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(911):
         PHPStan\Reflection\InitializerExprTypeResolver->getType(Object(PhpParser\Node\Scalar\LNumber),
         Object(PHPStan\Reflection\InitializerExprContext))
         #2 phar://vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(558):
         PHPStan\Analyser\MutatingScope->resolveType(Object(PhpParser\Node\Scalar\LNumber))
         #3 phar://vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(1391):
         PHPStan\Analyser\MutatingScope->getType(Object(PhpParser\Node\Scalar\LNumber))
         #4 phar://vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(528):
         PHPStan\Analyser\NodeScopeResolver->findEarlyTerminatingExpr(Object(PhpParser\Node\Scalar\LNumber),
         Object(PHPStan\Analyser\MutatingScope))
         #5 phar://vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(304):
         PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Expression),
         Object(PHPStan\Analyser\MutatingScope), Object(Closure))
         #6 vendor/rector/rector/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php(298):
         PHPStan\Analyser\NodeScopeResolver->processNodes(Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure))
         #7 vendor/rector/rector/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php(212):
         Rector\NodeTypeResolver\PHPStan\Scope\PHPStanNodeScopeResolver->processNodesWithDependentFiles('/Users/peter/Wo...',
         Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure))
         #8 vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php(96):
         Rector\NodeTypeResolver\PHPStan\Scope\PHPStanNodeScopeResolver->processNodes(Array, '/Users/peter/Wo...',
         Object(PHPStan\Analyser\MutatingScope))
         #9 vendor/rector/rector/src/Rector/AbstractRector.php(243):
         Rector\Core\Application\ChangedNodeScopeRefresher->refresh(Object(PhpParser\Node\Scalar\LNumber),
         Object(PHPStan\Analyser\MutatingScope), '/Users/peter/Wo...')
         #10 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(113):
         Rector\Core\Rector\AbstractRector->enterNode(Object(PhpParser\Node\Scalar\LNumber))
         #11 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(133):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Expr\BinaryOp\Plus))
         #12 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Return_))
         #13 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):
         PhpParser\NodeTraverser->traverseArray(Array)
         #14 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Case_))
         #15 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):
         PhpParser\NodeTraverser->traverseArray(Array)
         #16 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Switch_))
         #17 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):
         PhpParser\NodeTraverser->traverseArray(Array)
         #18 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\ClassMethod))
         #19 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):
         PhpParser\NodeTraverser->traverseArray(Array)
         #20 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))
         #21 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):
         PhpParser\NodeTraverser->traverseArray(Array)
         #22 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace))
         #23 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(85):
         PhpParser\NodeTraverser->traverseArray(Array)
         #24 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(42):
         PhpParser\NodeTraverser->traverse(Array)
         #25 vendor/rector/rector/src/Application/FileProcessor.php(60):
         Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser->traverse(Array)
         #26 vendor/rector/rector/src/Application/FileProcessor/PhpFileProcessor.php(133):
         Rector\Core\Application\FileProcessor->refactor(Object(Rector\Core\ValueObject\Application\File),
         Object(Rector\Core\ValueObject\Configuration))
         #27 vendor/rector/rector/src/Application/FileProcessor/PhpFileProcessor.php(100):
         Rector\Core\Application\FileProcessor\PhpFileProcessor->refactorNodesWithRectors(Object(Rector\Core\ValueObject\Applica
         tion\File), Object(Rector\Core\ValueObject\Configuration))
         #28 vendor/rector/rector/packages/Parallel/WorkerRunner.php(98):
         Rector\Core\Application\FileProcessor\PhpFileProcessor->process(Object(Rector\Core\ValueObject\Application\File),
         Object(Rector\Core\ValueObject\Configuration))
         #29 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):
         Rector\Parallel\WorkerRunner->Rector\Parallel\{closure}(Array)
         #30 vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php(110):
         RectorPrefix202209\Evenement\EventEmitter->emit('data', Array)
         #31 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):
         RectorPrefix202209\Clue\React\NDJson\Decoder->handleData(Array)
         #32 vendor/rector/rector/vendor/react/stream/src/Util.php(62): RectorPrefix202209\Evenement\EventEmitter->emit('data',
         Array)
         #33 vendor/rector/rector/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):
         RectorPrefix202209\React\Stream\Util::RectorPrefix202209\React\Stream\{closure}('{"action":"main...')
         #34 vendor/rector/rector/vendor/react/stream/src/DuplexResourceStream.php(154):
         RectorPrefix202209\Evenement\EventEmitter->emit('data', Array)
         #35 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(201):
         RectorPrefix202209\React\Stream\DuplexResourceStream->handleData(Resource id #2614)
         #36 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(173):
         RectorPrefix202209\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
         #37 vendor/rector/rector/src/Console/Command/WorkerCommand.php(63):
         RectorPrefix202209\React\EventLoop\StreamSelectLoop->run()
         #38 vendor/rector/rector/vendor/symfony/console/Command/Command.php(307):
         Rector\Core\Console\Command\WorkerCommand->execute(Object(RectorPrefix202209\Symfony\Component\Console\Input\ArgvInput)
         , Object(RectorPrefix202209\Symfony\Component\Console\Output\ConsoleOutput))
         #39 vendor/rector/rector/vendor/symfony/console/Application.php(894):
         RectorPrefix202209\Symfony\Component\Console\Command\Command->run(Object(RectorPrefix202209\Symfony\Component\Console\I
         nput\ArgvInput), Object(RectorPrefix202209\Symfony\Component\Console\Output\ConsoleOutput))
         #40 vendor/rector/rector/vendor/symfony/console/Application.php(310):
         RectorPrefix202209\Symfony\Component\Console\Application->doRunCommand(Object(Rector\Core\Console\Command\WorkerCommand
         ), Object(RectorPrefix202209\Symfony\Component\Console\Input\ArgvInput),
         Object(RectorPrefix202209\Symfony\Component\Console\Output\ConsoleOutput))
         #41 vendor/rector/rector/src/Console/ConsoleApplication.php(49):
         RectorPrefix202209\Symfony\Component\Console\Application->doRun(Object(RectorPrefix202209\Symfony\Component\Console\Inp
         ut\ArgvInput), Object(RectorPrefix202209\Symfony\Component\Console\Output\ConsoleOutput))
         #42 vendor/rector/rector/vendor/symfony/console/Application.php(208):
         Rector\Core\Console\ConsoleApplication->doRun(Object(RectorPrefix202209\Symfony\Component\Console\Input\ArgvInput),
         Object(RectorPrefix202209\Symfony\Component\Console\Output\ConsoleOutput))
         #43 vendor/rector/rector/bin/rector.php(128): RectorPrefix202209\Symfony\Component\Console\Application->run()
         #44 vendor/rector/rector/bin/rector(4): require_once('/Users/peter/Wo...')
         #45 vendor/bin/rector(112): include('/Users/peter/Wo...')
         #46 {main}". On line: 27

This is the file contents:

Show file code
<?php
/**
 * [Copyright Regular Labs]
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Plugin\PluginHelper as JPluginHelper;
use Joomla\CMS\Router\Route as JRoute;
use RegularLabs\Library\ArrayHelper as RL_Array;
use RegularLabs\Library\Article as RL_Article;
use RegularLabs\Library\DB as RL_DB;
use RegularLabs\Library\ParametersNew as RL_Parameters;
use RegularLabs\Library\RegEx as RL_RegEx;
use RegularLabs\Plugin\System\ArticlesAnywhere\Replace as AA_Replace;

if (is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php'))
{
    require_once JPATH_LIBRARIES . '/regularlabs/autoload.php';
}

class PlgFieldsArticlesHelper
{
    public static function getFullOrdering(
        $primary_ordering, $primary_direction,
        $secondary_ordering, $secondary_direction,
        $prefix_articles = 'a',
        $prefix_categories = 'c'
    )
    {
        $db = JFactory::getDbo();

        self::prepareOrdering($primary_ordering, $primary_direction);
        self::prepareOrdering($secondary_ordering, $secondary_direction);

        self::prefixOrdering($primary_ordering, $prefix_articles, $prefix_categories);
        self::prefixOrdering($secondary_ordering, $prefix_articles, $prefix_categories);

        return $db->quoteName($primary_ordering) . ' ' . $primary_direction . ','
            . $db->quoteName($secondary_ordering) . ' ' . $secondary_direction;
    }

    public static function getLinkedArticleIds($field_ids, $article_id, $field)
    {
        /* >>> [PRO] >>> */
        $article_ids = [];

        foreach ($field_ids as $field_id)
        {
            $field_article_ids = self::getLinkedArticleIdsByFieldId($field_id, $article_id, $field);

            $article_ids = array_merge($article_ids, $field_article_ids);
        }

        if (empty($field_ids))
        {
            $article_ids = self::getLinkedArticleIdsByFieldId(0, $article_id, $field);
        }

        $primary_ordering    = $field->fieldparams->get('linked_articles_ordering', 'title');
        $primary_direction   = $field->fieldparams->get('linked_articles_ordering_direction', 'ASC');
        $secondary_ordering  = $field->fieldparams->get('linked_articles_ordering_2', 'created');
        $secondary_direction = $field->fieldparams->get('linked_articles_ordering_direction_2', 'DESC');

        $ordering = self::getFullOrdering($primary_ordering, $primary_direction, $secondary_ordering, $secondary_direction);

        $db = JFactory::getDbo();

        $nullDate = $db->quote($db->getNullDate());
        $nowDate  = $db->quote(JFactory::getDate()->toSql());

        $query = $db->getQuery(true)
            ->select('a.id')
            ->from($db->quoteName('#__content', 'a'))
            ->join('LEFT', $db->quoteName('#__categories', 'c') . ' ON c.id = a.catid')
            ->where('a.id' . RL_DB::in($article_ids))
            ->where('a.state = 1')
            ->where('(a.publish_up IS NULL OR a.publish_up = ' . $nullDate . ' OR a.publish_up <= ' . $nowDate . ')')
            ->where('(a.publish_down IS NULL OR a.publish_down = ' . $nullDate . ' OR a.publish_down >= ' . $nowDate . ')')
            ->order($ordering);

        $db->setQuery($query);

        return $db->loadColumn() ?: [];
        /* <<< [PRO] <<< */
    }

    public static function prepareCustomField($context, $item, &$field)
    {
        JPluginHelper::importPlugin('fields');

        $dispatcher = JEventDispatcher::getInstance();

        // Event allow plugins to modify the output of the field before it is prepared
        $dispatcher->trigger('onCustomFieldsBeforePrepareField', [$context, $item, &$field]);

        // Gathering the value for the field
        $value = $dispatcher->trigger('onCustomFieldsPrepareField', [$context, $item, &$field]);

        if (is_array($value))
        {
            $value = implode(' ', $value);
        }

        // Event allow plugins to modify the output of the prepared field
        $dispatcher->trigger('onCustomFieldsAfterPrepareField', [$context, $item, $field, &$value]);

        // Assign the value
        $field->value = $value;
    }

    public static function renderLayout($ids, $layout, $field, $layout_type = 'title', $apply_ordering = true)
    {
        if (count($ids) === 1)
        {
            $ids = RL_Array::toArray($ids[0]);
        }

        $settings = (object) [];
        switch ($layout_type)
        {
            /* >>> [PRO] >>> */
            case 'custom_html':
                $settings->custom_html = $field->fieldparams->get('custom_html', '');
                break;
            /* <<< [PRO] <<< */
            case 'title_custom':
                $settings->custom_field = $field->fieldparams->get('custom_field', '');
                $settings->link_title   = $field->fieldparams->get('link_title', 1);
                break;
            case 'title':
            default:
                $settings->link_title = $field->fieldparams->get('link_title', 1);
                break;
        }

        $outputs   = self::getOutputs($ids, $layout, $field, $settings, $apply_ordering);
        $separator = $field->fieldparams->get('use_separator') ? $field->fieldparams->get('separator', ', ') : '';

        return implode($separator, $outputs);
    }

    public static function replaceDataTags($string, &$article)
    {
        /* >>> [PRO] >>> */
        $tags = self::getDataTags($string);

        foreach ($tags as $tag)
        {
            $result = self::getDataTagValue($article, $tag);

            if ($result === false || ! is_string($result))
            {
                continue;
            }

            $string = str_replace($tag[0], $result, $string);
        }

        return $string;
        /* <<< [PRO] <<< */
    }

    public static function runThroughArticlesAnywhere($string)
    {
        /* >>> [PRO] >>> */
        $articlesanywhere_params = RL_Parameters::getPlugin('articlesanywhere');

        if (empty($articlesanywhere_params) || ! isset($articlesanywhere_params->article_tag) || ! isset($articlesanywhere_params->articles_tag))
        {
            return $string;
        }

        AA_Replace::replaceTags($string);

        return $string;
        /* <<< [PRO] <<< */
    }

    private static function addFilters(&$query, $field)
    {
        /* >>> [PRO] >>> */
        require_once 'filters.php';
        $filters = new PlgFieldsArticlesFilters($field->fieldparams);

        $filters->addToQuery($query);
        /* <<< [PRO] <<< */
    }

    private static function getArticleFieldIds()
    {
        /* >>> [PRO] >>> */
        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('a.id')
            ->from($db->quoteName('#__fields', 'a'))
            ->where('a.type = ' . $db->quote('articles'));

        $db->setQuery($query);

        return $db->loadColumn();
        /* <<< [PRO] <<< */
    }

    private static function getArticleOrderId($article, $ordering)
    {
        if ( ! isset($article->{$ordering}))
        {
            return 0;
        }

        switch ($ordering)
        {
            case 'ordering':
            case 'hits':
                return ($article->{$ordering} + 100000000);

            case 'created_time':
            case 'modified_time':
            case 'publish_up':
            case 'alias':
            case 'title':
            default:
                return strtolower($article->{$ordering});
        }
    }

    private static function getArticlesByIds($ids)
    {
        $articles = [];

        foreach ($ids as $id)
        {
            if ( ! $id)
            {
                continue;
            }

            $article = RL_Article::get($id);

            if (empty($article->id))
            {
                continue;
            }

            if ( ! in_array($article->access, JFactory::getUser()->getAuthorisedViewLevels()))
            {
                continue;
            }

            $articles[] = $article;
        }

        return $articles;
    }

    private static function getCategoriesByFieldId($field_id)
    {
        /* >>> [PRO] >>> */
        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('a.category_id')
            ->from($db->quoteName('#__fields_categories', 'a'))
            ->where('a.field_id = ' . (int) $field_id);

        $db->setQuery($query);

        $categories       = $db->loadColumn();
        $child_categories = self::getChildCategories($categories);

        return array_merge($categories, $child_categories);
        /* <<< [PRO] <<< */
    }

    private static function getChildCategories($categories)
    {
        /* >>> [PRO] >>> */
        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('a.id')
            ->from($db->quoteName('#__categories', 'a'))
            ->where('a.parent_id' . RL_DB::in($categories));

        $db->setQuery($query);

        $child_categories = $db->loadColumn();

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

        $sub_child_categories = self::getChildCategories($child_categories);

        return array_merge($child_categories, $sub_child_categories);
        /* <<< [PRO] <<< */
    }

    private static function getDataTagValue(&$article, $tag)
    {
        /* >>> [PRO] >>> */
        if (isset($article->{$tag['key']}) && is_string($article->{$tag['key']}))
        {
            return $article->{$tag['key']};
        }

        if (isset($article->articlesfield_params->{$tag['key']}))
        {
            return $article->articlesfield_params->{$tag['key']};
        }

        if ($tag['key'] == 'url')
        {
            $slug = $article->alias ? ($article->id . ':' . $article->alias) : $article->id;

            if ( ! class_exists('ContentHelperRoute'))
            {
                require_once JPATH_SITE . '/components/com_content/helpers/route.php';
            }

            return JRoute::_(ContentHelperRoute::getArticleRoute($slug, $article->catid, $article->language));
        }

        $article->urls = is_object($article->urls) ? $article->urls : json_decode($article->urls);
        if (isset($article->urls->{$tag['key']}))
        {
            return $article->urls->{$tag['key']};
        }

        $article->images = is_object($article->images) ? $article->images : json_decode($article->images);
        if (isset($article->images->{$tag['key']}))
        {
            return $article->images->{$tag['key']};
        }

        return self::getDataTagValueCustomField($article, $tag['key']);
        /* <<< [PRO] <<< */
    }

    private static function getDataTagValueCustomField(&$article, $key)
    {
        /* >>> [PRO] >>> */
        if ( ! isset($article->fields))
        {
            $article->fields = FieldsHelper::getFields('com_content.article', $article);
        }

        foreach ($article->fields as $field)
        {
            if ($field->name != $key)
            {
                continue;
            }

            // Field has no value
            if (empty($field->value))
            {
                return '';
            }

            // Prepare the value
            if ($field->value == $field->rawvalue)
            {
                self::prepareCustomField('com_content.article', $article, $field);
            }

            return $field->value;
        }

        return false;
        /* <<< [PRO] <<< */
    }

    private static function getDataTags($html)
    {
        /* >>> [PRO] >>> */
        RL_RegEx::matchAll('\[(?<key>[^ ]+?)\]', $html, $matches);

        return $matches;
        /* <<< [PRO] <<< */
    }

    private static function getLinkedArticleIdsByFieldId($field_id, $article_id, $field)
    {
        /* >>> [PRO] >>> */
        $db = JFactory::getDbo();

        $field_ids = RL_Array::toArray($field_id);

        if (empty($field_ids))
        {
            $field_ids = self::getArticleFieldIds();
        }

        $nullDate = $db->quote($db->getNullDate());
        $nowDate  = $db->quote(JFactory::getDate()->toSql());

        $query = $db->getQuery(true)
            ->select('a.item_id')
            ->from($db->quoteName('#__fields_values', 'a'))
            ->where('a.value  = ' . (int) $article_id)
            ->where('a.field_id' . RL_DB::in($field_ids));

        $db->setQuery($query);

        $article_ids = $db->loadColumn();

        $categories = self::getCategoriesByFieldId($field_id);

        $query = $db->getQuery(true)
            ->select('a.id')
            ->from($db->quoteName('#__content', 'a'))
            ->where('a.id' . RL_DB::in($article_ids))
            ->where('a.state = 1')
            ->where('(a.publish_up IS NULL OR a.publish_up = ' . $nullDate . ' OR a.publish_up <= ' . $nowDate . ')')
            ->where('(a.publish_down IS NULL OR a.publish_down = ' . $nullDate . ' OR a.publish_down >= ' . $nowDate . ')');

        if ( ! empty($categories))
        {
            $query->where('a.catid' . RL_DB::in($categories));
        }

        self::addFilters($query, $field);

        $db->setQuery($query);

        return $db->loadColumn();
        /* <<< [PRO] <<< */
    }

    private static function getOutputs($ids, $layout, $field, $settings, $apply_ordering = true)
    {
        $ids = array_unique($ids);

        $articles = self::getArticlesByIds($ids);

        if ($apply_ordering)
        {
            $primary_ordering    = $field->fieldparams->get('articles_ordering', 'title');
            $primary_direction   = $field->fieldparams->get('articles_ordering_direction', 'ASC');
            $secondary_ordering  = $field->fieldparams->get('articles_ordering_2', 'created');
            $secondary_direction = $field->fieldparams->get('articles_ordering_direction_2', 'DESC');

            self::orderArticles($articles, $primary_ordering, $primary_direction, $secondary_ordering, $secondary_direction);
        }

        return self::getOutputsByArticles($articles, $layout, $settings);
    }

    private static function getOutputsByArticles($articles, $layout, $settings)
    {
        $outputs     = [];
        $total_count = count($articles);

        foreach ($articles as $i => $article)
        {
            /* >>> [PRO] >>> */
            $article->articlesfield_params = (object) [
                'count' => $i + 1,
                'total' => $total_count,
            ];
            /* <<< [PRO] <<< */

            $output = $layout->render(compact('article', 'settings'));

            if (empty($output))
            {
                continue;
            }

            $outputs[] = $output;
        }

        return $outputs;
    }

    private static function orderArticles(&$articles, $primary_ordering, $primary_direction = 'ASC', $secondary_ordering = '', $secondary_direction = 'ASC')
    {
        $ordered = self::orderArticlesSet($articles, $primary_ordering, $primary_direction);

        if ( ! $secondary_ordering)
        {
            $articles = RL_Array::flatten($ordered);

            return;
        }

        foreach ($ordered as &$ordered_set)
        {
            $ordered_set = self::orderArticlesSet($ordered_set, $secondary_ordering, $secondary_direction);
        }

        $articles = RL_Array::flatten($ordered);
    }

    private static function orderArticlesSet($articles, $ordering, $direction = 'ASC')
    {
        if ( ! is_array($articles) || count($articles) < 2)
        {
            return $articles;
        }

        self::prepareOrdering($ordering, $direction);

        $ordered = [];

        // Handle 1st ordering
        foreach ($articles as $article)
        {
            $order_id = self::getArticleOrderId($article, $ordering);

            if ( ! isset($ordered[$order_id]))
            {
                $ordered[$order_id] = [];
            }

            $ordered[$order_id][] = $article;
        }

        switch ($direction)
        {
            case 'DESC':
                krsort($ordered);
                break;
            case 'ASC':
            default:
                ksort($ordered);
                break;
        }

        return array_values($ordered);
    }

    private static function prefixOrdering(&$ordering, $prefix_articles = 'a', $prefix_categories = 'c')
    {
        if (strpos($ordering, 'category_') === 0)
        {
            $ordering = $prefix_categories . '.' . substr($ordering, strlen('category_'));

            return;
        }

        $ordering = $prefix_articles . '.' . $ordering;
    }

    private static function prepareOrdering(&$ordering, &$direction)
    {
        if ($ordering == 'featured')
        {
            $direction = $direction == 'DESC' ? 'ASC' : 'DESC';
        }
    }
}

This is my rector config;

<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\SetList;

return static function (RectorConfig $rectorConfig): void {
    $rectorConfig->paths([
        [path to folder]
    ]);
    $rectorConfig->sets([
        SetList::PHP_74,
    ]);
};

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions