core icon indicating copy to clipboard operation
core copied to clipboard

eig. SQL: default-Parameter mit MySQL-Funktion oder Contao-Inserttag

Open zonky2 opened this issue 10 years ago • 5 comments

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

zonky2 avatar Aug 30 '15 17:08 zonky2

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);
     }

discordier avatar Sep 01 '15 07:09 discordier

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);

zonky2 avatar Sep 01 '15 09:09 zonky2

Fixed MM 2.2

zonky2 avatar Aug 18 '22 20:08 zonky2

But the workaround no longer works

... WHERE FROM_UNIXTIME(von_datum) <= IF({{param::get?name=von_datum}},{{param::get?name=von_datum}}, CURDATE()) ...

Ainschy avatar Sep 26 '22 12:09 Ainschy

Reopening due to bug report by @Ainschy

discordier avatar Sep 27 '22 12:09 discordier