-
-
Notifications
You must be signed in to change notification settings - Fork 737
Closed
rectorphp/rector-src
#2913Labels
Description
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,
]);
};