core
core copied to clipboard
eig. SQL: default-Parameter mit MySQL-Funktion oder Contao-Inserttag
Hallo,
MM wirft einen Fehler, wenn man für einen default-Parameter eine MySQL-Funktion einsetzt (a) oder einen Contao-Inserttag (b) a:
SELECT id FROM mm_monate
WHERE FROM_UNIXTIME(von_datum) <= {{param::get?name=von_datum&default=CURDATE()}}
ORDER BY von_datum DESC
LIMIT 1
b:
SELECT id FROM mm_monate
WHERE FROM_UNIXTIME(von_datum) <= {{param::get?name=von_datum&default={{date::Y-m-d}}}}
ORDER BY von_datum DESC
LIMIT 1
Workaround:
SELECT id FROM mm_monate
WHERE FROM_UNIXTIME(von_datum) <= IF({{param::get?name=von_datum}},{{param::get?name=von_datum}}, CURDATE())
ORDER BY von_datum DESC
LIMIT 1
Problem is at https://github.com/MetaModels/core/blob/cf03fb96331f4e2a65f626c0f5dfad8035a7ea80/src/MetaModels/Filter/Setting/CustomSql.php#L152 Please try if the following works.
/**
* Add a parameter to the list.
*
* @param string $parameter The parameter to add.
*
* @return void
*/
private function addParameter($parameter)
{
if (empty($parameter)) {
return;
}
- $this->queryParameter[] = $parameter;
+ $this->queryParameter[] = $this->parseInsertTagsInternal($parameter);
}
Die Änderung allein reicht nicht - die Funktion parseRequestVars() muss/müsste geändert werden (die Funktion parseSecureInsertTags() analog)
https://github.com/MetaModels/core/blob/cf03fb96331f4e2a65f626c0f5dfad8035a7ea80/src/MetaModels/Filter/Setting/CustomSql.php#L327
Ich gehe mal davon aus, dass ein Contao-Inserttag nur einmal in dem MM-Inserttag vorkommen kann - dann müsste die Funktion addParameter prüfen, ob ein Tag in dem String enthalten ist und diesen durch die Contao-Core-Funktion (replaceInsertTags) ersetzen lassen... die ggf. vorhandene Rekursion innerhalb des "Contao-Insert-Tags" übernimmt der Core selbst mit seiner Funktion...
das Ganze könnte dann für parseRequestVars() ggf. in die Richtung gehen
$strParam= '';
$strPattern = '/\{\{(([^\{\}]*|(?R))*)\}\}/';
$arrTags = preg_split($strPattern, $this->queryString, -1, PREG_SPLIT_DELIM_CAPTURE);
$strParam= $arrTags[1];
if (strpos($strTag, '{{') !== false)
{
$strParam = preg_replace_callback(
'replaceInsertTags',
$strParam
);
}
$this->queryString = convertParameter($strParam);
Fixed MM 2.2
But the workaround no longer works
... WHERE FROM_UNIXTIME(von_datum) <= IF({{param::get?name=von_datum}},{{param::get?name=von_datum}}, CURDATE()) ...
Reopening due to bug report by @Ainschy