diff --git a/extension/Classes/Core/Evaluate.php b/extension/Classes/Core/Evaluate.php index 86349f265260281b635a2099d024a121c94a30b4..ad9026d9419e17bc7acedc26d87566c0011d3929 100644 --- a/extension/Classes/Core/Evaluate.php +++ b/extension/Classes/Core/Evaluate.php @@ -146,7 +146,7 @@ class Evaluate { * @throws \UserFormException * @throws \UserReportException */ - public function parse($line, $sqlMode = ROW_IMPLODE_ALL, $recursion = 0, &$debugStack = array(), &$foundInStore = '') { + public function parse($line, $sqlMode = ROW_IMPLODE_ALL, $recursion = 0, &$debugStack = array(), &$foundInStore = '', $frCmd = '') { if ($line === '') { return ''; @@ -185,7 +185,7 @@ class Evaluate { $match = substr($result, $posMatchOpen + $this->startDelimiterLength, $posFirstClose - $posMatchOpen - $this->startDelimiterLength); $tmpSqlMode = ($posFirstClose == $posLastClose) ? $sqlMode : ROW_IMPLODE_ALL; - $evaluated = $this->substitute($match, $foundInStore, $tmpSqlMode); + $evaluated = $this->substitute($match, $foundInStore, $tmpSqlMode, $frCmd); // newline $debugLocal[] = ''; @@ -215,7 +215,7 @@ class Evaluate { $evaluated = Support::encryptDoubleCurlyBraces($evaluated); } else { if (strpos($evaluated, $this->endDelimiter) !== false) { - $evaluated = $this->parse($evaluated, ROW_IMPLODE_ALL, $recursion + 1, $debugLocal, $foundInStore); + $evaluated = $this->parse($evaluated, ROW_IMPLODE_ALL, $recursion + 1, $debugLocal, $foundInStore, $tokenName); } } } @@ -315,7 +315,7 @@ class Evaluate { * @throws \UserFormException * @throws \UserReportException */ - public function substitute($token, &$foundInStore = '', $sqlMode = ROW_IMPLODE_ALL) { + public function substitute($token, &$foundInStore = '', $sqlMode = ROW_IMPLODE_ALL, $frCmd = '') { $token = trim($token); $dbIndex = $this->dbIndex; @@ -392,7 +392,7 @@ class Evaluate { } // create baseUrl attribute for tablesorter api $baseUrlAttribute = DATA_TABLESORTER_BASE_URL . "='" . $this->store->getVar(SYSTEM_BASE_URL, STORE_SYSTEM) . "'"; - return ($this->tablesorter->inlineTablesorterView($arrToken[VAR_INDEX_VALUE], $foundInStore)) . $baseUrlAttribute; + return ($this->tablesorter->inlineTablesorterView($arrToken[VAR_INDEX_VALUE], $foundInStore, $frCmd)) . $baseUrlAttribute; break; default: break; diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index 371be74b879afaa1d19747e44b962776dcd7da85..ac0bfbba5c6e73626e4347de69c699bdbd54006e 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -595,7 +595,7 @@ class Report { $this->doQfqFunction($this->frArray[$fullLevel . "." . TOKEN_FUNCTION]); } - $sql = $this->variables->doVariables($this->frArray[$fullLevel . "." . TOKEN_SQL]); + $sql = $this->variables->doVariables($this->frArray[$fullLevel . "." . TOKEN_SQL], TOKEN_SQL); $this->store->setVar(SYSTEM_SQL_FINAL, $sql, STORE_SYSTEM); diff --git a/extension/Classes/Core/Report/Tablesorter.php b/extension/Classes/Core/Report/Tablesorter.php index 5bcb051746f75ab37c64f38346da3464f049ef41..52a499cf675794c55832393f432bf58a2037962d 100644 --- a/extension/Classes/Core/Report/Tablesorter.php +++ b/extension/Classes/Core/Report/Tablesorter.php @@ -56,7 +56,7 @@ class Tablesorter { * @throws \UserFormException * @throws \UserReportException */ - public function inlineTablesorterView($token, &$foundInStore) { + public function inlineTablesorterView($token, &$foundInStore, $frCmd = '') { $token = OnString::trimQuote($token); if (empty($token)) { @@ -74,6 +74,11 @@ class Tablesorter { $s = $this->link->renderLink('U:' . SETTING_TABLESORTER_TABLE_ID . '=' . $token . '&' . SETTING_TABLESORTER_FE_USER . '=' . $feUser . '|s|r:8'); $view = $this->getTableViewAsJson($token, $feUser); + // Improve twig compatibility with escaped double quotes + if ($frCmd === TOKEN_SQL) { + $view = addslashes($view); + } + // data-tablesorter-sip='badcaffee1234' data-tablesorter-view='....' return "data-tablesorter-id='" . $token . "' " . DATA_TABLESORTER_SIP . "='" . $s . "' " . DATA_TABLESORTER_VIEW . "='" . $view . "' "; } diff --git a/extension/Classes/Core/Report/Variables.php b/extension/Classes/Core/Report/Variables.php index 79caaadba731280e45c825feb392f60a341d869d..834614f3fc08d8e3a8ed1fd575ac74a18bbb2b36 100644 --- a/extension/Classes/Core/Report/Variables.php +++ b/extension/Classes/Core/Report/Variables.php @@ -68,7 +68,7 @@ class Variables { * @throws \UserFormException * @throws \UserReportException */ - public function doVariables($text) { + public function doVariables($text, $frCmd = '') { if ($text == '') { return ''; @@ -81,7 +81,7 @@ class Variables { $str = preg_replace_callback('/{{\s*(([0-9]+.)+[a-zA-Z0-9_.]+)(:[a-zA-Z-]*)*\s*}}/', 'self::replaceVariables', $text); // Try the Stores - return $this->eval->parse($str); + return $this->eval->parse($str, null, null, $dummyStack, $dummyStore, $frCmd); } /**