-
Notifications
You must be signed in to change notification settings - Fork 32
Description
File: /www/core/components/tagger/src/Utils.php Line 17
I encountered a PHP Fatal error: Uncaught TypeError in the Tagger component when using TaggerGetResourcesWhere in MODX Revo. The issue arises specifically when passing the output of [[!queryString:urldecode]] as the &tags parameter. I have done it this way many times before and not had any issue.
Error Details:
[14-May-2024 16:43:36 Europe/London] PHP Fatal error: Uncaught TypeError: explode(): Argument #2 ($string) must be of type string, array given in /www/core/components/tagger/src/Utils.php:17
Stack trace:
#0 /www/core/components/tagger/src/Utils.php(17): explode()
#1 /www/core/components/tagger/src/Tagger.php(114): Tagger\Utils::explodeAndClean()
#2 /www/core/cache/includes/elements/modx/revolution/modsnippet/47.include.cache.php(208): Tagger\Tagger->getCurrentTags()
#3 /www/core/src/Revolution/modScript.php(88): include('...')
#4 /www/core/src/Revolution/modParser.php(508): MODX\Revolution\modScript->process()
#5 /www/core/components/pdotools/src/Parsing/Parser.php(276): MODX\Revolution\modParser->processTag()
#6 /www/core/src/Revolution/modParser.php(221): ModxPro\PdoTools\Parsing\Parser->processTag()
#7 /www/core/components/pdotools/src/Parsing/Parser.php(73): MODX\Revolution\modParser->processElementTags()
#8 /www/core/src/Revolution/modTemplate.php(147): ModxPro\PdoTools\Parsing\Parser->processElementTags()
#9 /www/core/src/Revolution/modResource.php(485): MODX\Revolution\modTemplate->process()
#10 /www/core/src/Revolution/modResource.php(465): MODX\Revolution\modResource->process()
#11 /www/core/src/Revolution/modResponse.php(72): MODX\Revolution\modResource->prepare()
#12 /www/core/src/Revolution/modRequest.php(154): MODX\Revolution\modResponse->outputContent()
#13 /www/core/src/Revolution/modRequest.php(138): MODX\Revolution\modRequest->prepareResponse()
#14 /www/core/src/Revolution/modX.php(1499): MODX\Revolution\modRequest->handleRequest()
#15 /www/index.php(63): MODX\Revolution\modX->handleRequest()
#16 {main}
thrown in /www/core/components/tagger/src/Utils.php on line 17
Steps to Reproduce:
Use TaggerGetResourcesWhere in a snippet call with [[!queryString:urldecode]] as the &tags parameter.
Example usage:
[[!pdoPage:default=`<div class="col-12"><p class="no-results text-center">No resources found</p></div>`?
&element=`pdoResources`
&where=`[[!TaggerGetResourcesWhere? &tags=`[[!queryString:urldecode]]`]]`
...
]]
When the [[!queryString:urldecode]] output is replaced directly with a string like tag1,tag2 it works as expected.
Relevant Code:
The QueryString snippet used for processing tags is as follows:
<?php
$result = '';
// Check if 'tag' exists
if (isset($_GET['tag'])) {
// Normalize 'tag' to an array if it's a string
$tags = is_array($_GET['tag']) ? $_GET['tag'] : explode(",", $_GET['tag']);
// Clean up the array by trimming whitespace and removing empty entries
$tags = array_filter(array_map('trim', $tags), function($value) {
return $value !== '';
});
// Implode the array into a comma-separated string if not empty
if (!empty($tags)) {
$result = implode(",", $tags);
}
}
echo $result; // This ensures we are returning a string
How I got it to work:
I adjusted the explodeAndClean function to handle array inputs by converting them to strings before processing. Here is the updated function:
public static function explodeAndClean($input, $delimiter = ',', $keepZero = false)
{
if (is_array($input)) {
$input = implode($delimiter, $input); // Ensure $input is a string
}
$array = explode($delimiter, $input); // Now explode it into parts
// Optionally clean the array
$array = array_filter($array, function ($item) use ($keepZero) {
return $keepZero ? $item !== '' : $item !== '' && $item !== '0';
});
return $array;
}
Additional Information:
MODX version: 3.0.4
Tagger version: 2.0.0
PHP version: 8.3