Commit 133990c0 authored by Rafael Ostertag's avatar Rafael Ostertag
Browse files

Merge remote-tracking branch 'origin/crose_work' into raos_work

parents 43b47b06 b5abdf72
......@@ -116,3 +116,14 @@ Page loaded: www.example.com?index.php&id=start&s=badcaffee1234&type=2&L=3, with
* $_SESSION[$urlparam] => <sip> >> $_SESSION['form=Person&r=1'] => 'badcaffee1234'
FormElement
===========
Checkbox
--------
<div class="checkbox">
<label>
<input type="checkbox">label 1
</label>
</div>
\ No newline at end of file
......@@ -2,7 +2,7 @@ PHPDOC ?= support/pear/phpdoc
JSDOC ?= jsdoc
PKG_VERSION = $(shell awk '/version/ { print $$3 }' extension/ext_emconf.php | sed "s/'//g")
NIGHTLY_DATE = $(shell date '+%Y%m%d')
EXTENSION_CONTENT = Classes Configuration qfq Resources ext_emconf.php ext_localconf.php ext_tables.php config.example.ini
EXTENSION_CONTENT = Classes Configuration Documentation qfq Resources ext_emconf.php ext_localconf.php ext_tables.php config.example.ini
all: archive t3sphinx
......@@ -46,13 +46,13 @@ phpdoc: .phpdocinstall
archive: clean qfq_$(PKG_VERSION).zip
qfq_$(PKG_VERSION).zip:
cd extension; zip -r ../$@ $(EXTENSION_CONTENT)
cd extension; zip -r ../$@ $(EXTENSION_CONTENT) -x config.ini
clean:
rm -f qfq_$(PKG_VERSION).zip
nightly:
rm -f qfq_????????.zip
cd extension; zip -r ../qfq_$(NIGHTLY_DATE) $(EXTENSION_CONTENT)
cd extension; zip -r ../qfq_$(NIGHTLY_DATE) $(EXTENSION_CONTENT) -x config.ini
.PHONY: nightly
......@@ -32,7 +32,7 @@ page.includeCSS {
file2 = typo3conf/ext/qfq/Resources/Public/Css/bootstrap-theme.min.css
file3 = typo3conf/ext/qfq/Resources/Public/Css/jqx.base.css
file4 = typo3conf/ext/qfq/Resources/Public/Css/jqx.darkblue.css
file5 = typo3conf/ext/qfq/Resources/Public/Css/qfq-jqw.css
file5 = typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css
}
page.includeJS {
......@@ -40,11 +40,11 @@ page.includeJS {
file1 = typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.min.js
file2 = typo3conf/ext/qfq/Resources/Public/JavaScript/bootstrap.min.js
file3 = typo3conf/ext/qfq/Resources/Public/JavaScript/jqx-all.js
file4 = typo3conf/ext/qfq/Resources/Public/JavaScript/qfq-jqw.debug.js
file4 = typo3conf/ext/qfq/Resources/Public/JavaScript/qfq-min.js
}
Usage
-----
* https://wikiit.math.uzh.ch/it/projekt/qfq/qfq-jqwidgets
* typo3conf/ext/qfq/documentation/_make/build/html/index.html
.. ==================================================
.. FOR YOUR INFORMATION
.. --------------------------------------------------
.. -*- coding: utf-8 -*- with BOM.
.. include:: ../Includes.txt
.. _admin-manual:
Administrator Manual
====================
Setup
-----
* Install the extension via the Extensionmanager.
* Rename the file *<ext_dir>/config.example.ini* to *<ext_dir>/config.ini* and configure the necessary values: `<ext_dir>/config.ini`_
* Play the SQL File *<ext_dir>/qfq/sql/formEditor.sql* to fill the database with the *FormEditor* records.
* Configure Typoscript to include Bootstrap, jQuery and QFQ javascript and CSS files.
::
page.includeCSS {
file1 = typo3conf/ext/qfq/Resources/Public/Css/bootstrap.min.css
file2 = typo3conf/ext/qfq/Resources/Public/Css/bootstrap-theme.min.css
file3 = typo3conf/ext/qfq/Resources/Public/Css/jqx.base.css
file4 = typo3conf/ext/qfq/Resources/Public/Css/jqx.darkblue.css
file5 = typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css
}
page.includeJS {
file1 = typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.min.js
file2 = typo3conf/ext/qfq/Resources/Public/JavaScript/bootstrap.min.js
file3 = typo3conf/ext/qfq/Resources/Public/JavaScript/jqx-all.js
file4 = typo3conf/ext/qfq/Resources/Public/JavaScript/qfq-min.js
}
FormEditor
----------
Setup a *report* to manage all *forms*: Create a Typo3 page and insert a content record of type *qfq*. In the bodytext insert the following code:
::
form = {{form}}
10.sql = SELECT CONCAT('{{pageId}}&form=Form&r=', f.id) as Pagee, f.id, f.name, f.title, f.tableName FROM FormEditor As f ORDER BY f.name
10.head = <br><table class="table">
10.tail = </table>
10.rbeg = <tr class="table-hover">
10.rend = </tr>
10.fbeg = <td>
10.fend = </td>
<ext_dir>/config.ini
--------------------
+------------------------+--------------+----------------------------------------------------------------------------+
| Keyword | Example | Description |
+========================+==============+============================================================================+
| DBUSER | qfqUser | Credentials configured in MySQL |
+------------------------+--------------+----------------------------------------------------------------------------+
| DBPW | 12345678 | Credentials configured in MySQL |
+------------------------+--------------+----------------------------------------------------------------------------+
| DBSERVER | localhost | Hostname of MySQL Server |
+------------------------+--------------+----------------------------------------------------------------------------+
| DB | qfq_db | Database name |
+------------------------+--------------+----------------------------------------------------------------------------+
| TESTDB | qfq_db_test | Used during development of QFQ |
+------------------------+--------------+----------------------------------------------------------------------------+
| SESSIONNAME | qfq | By default 'qfq' |
+------------------------+--------------+----------------------------------------------------------------------------+
| SQLLOG | sql.log | filename to log all SQL commands |
+------------------------+--------------+----------------------------------------------------------------------------+
| SHOW_DEBUG_INFO | auto | Possible values: auto|yes|no. For 'auto': If a BE User is logged in, |
| | | debug information will be shown on the fronend. |
+------------------------+--------------+----------------------------------------------------------------------------+
| CSS_LINK_CLASS_INTERNAL| internal | CSS class name of links which points to internal tagets |
+------------------------+--------------+----------------------------------------------------------------------------+
| CSS_LINK_CLASS_EXTERNAL| external | CSS class name of links which points to internal tagets |
+------------------------+--------------+----------------------------------------------------------------------------+
Example: *<ext_dir>/config.ini*
::
DBUSER = qfqUser
DBSERVER = localhost
DBPW = 12345678
DB = qfq_db
TESTDB = qfq_db_test
SESSIONNAME = qfq
SQLLOG = sql.log
SHOW_DEBUG_INFO = auto
CSS_LINK_CLASS_INTERNAL = internal
CSS_LINK_CLASS_EXT = external
\ No newline at end of file
.. ==================================================
.. FOR YOUR INFORMATION
.. --------------------------------------------------
.. -*- coding: utf-8 -*- with BOM.
.. include:: ../Includes.txt
.. _admin-manual:
Administrator Manual
====================
Describes how to manage the extension from an administrator’s point of
view. That relates to Page/User TSconfig, permissions, configuration
etc., which administrator level users have access to.
Language should be non/semi-technical, explaining, using small
examples.
Target group: **Administrators**
Installation
------------
How should the extension be set up? E.g. is there a static template to include?
.. figure:: ../Images/AdministratorManual/ExtensionManager.png
:width: 500px
:alt: Extension Manager
Extension Manager (caption of the image)
List of extensions within the Extension Manager also shortend as "EM" (legend of the image)
FAQ
^^^
Possible subsection: FAQ
......@@ -57,5 +57,6 @@ QFQ Extension
:maxdepth: 4
Introduction/Index
AdministratorManual/Index
UsersManual/Index
Links
; comment
DBUSER = <DBUSER>
DBSERVER = <DBSERVER>
DBPW = <DBPW>
DB = <DB>
DB_USER = <DBUSER>
DB_SERVER = <DBSERVER>
DB_PASSWORD = <DBPW>
DB_NAME = <DB>
TESTDB = <TESTDB>
DB_NAME_TEST = <TESTDB>
SESSIONNAME = qfq
SESSION_NAME = qfq
SQLLOG = sql.log
SQL_LOG = sql.log
; all, modify
SQL_LOG_MODE = modify
; auto|yes|no. 'auto': if BE User is loggend in 'true', else 'false'
SHOW_DEBUG_INFO = auto
CSS_LINK_CLASS_INTERNAL = internal
CSS_LINK_CLASS_EXTERNAL = external
\ No newline at end of file
CSS_LINK_CLASS_EXTERNAL = external
......@@ -52,7 +52,7 @@ $answer[API_STATUS] = API_ANSWER_STATUS_ERROR;
try {
$qfq = new \qfq\QuickFormQuery(['bodytext' => "debugShowStack=1"]);
$qfq = new \qfq\QuickFormQuery(['bodytext' => ""]);
$qfq->delete();
......
......@@ -22,8 +22,10 @@ require_once(__DIR__ . '/../qfq/Constants.php');
* message: <message>
* redirect: client|url|no
* redirect-url: <url>
* field-name:<field name>
* field-name: <field name>
* field-message: <message>
* form-data: [ fieldname1 => value1, fieldname2 => value2, ... ]
* form-control: [ fieldname1 => status1, fieldname2 => status2, ... ] status: show|hide, enabled|disabled, readonly|readwrite
*
* Description:
*
......@@ -54,7 +56,7 @@ $answer[API_STATUS] = API_ANSWER_STATUS_ERROR;
$answer[API_MESSAGE] = '';
try {
$qfq = new \qfq\QuickFormQuery(['bodytext' => "debugShowStack=1"]);
$qfq = new \qfq\QuickFormQuery(['bodytext' => ""]);
$qfq->saveForm();
......
This diff is collapsed.
......@@ -181,37 +181,59 @@ class BuildFormBootstrap extends AbstractBuildForm {
* @return string
*/
private function buildButtons() {
$toolTipNew = 'New';
$toolTipDelete = 'Delete';
$buttonDelete = '';
$buttonNew = '';
$sipParamString = OnArray::toString($this->store->getStore(STORE_SIP), ':', ', ', "'");
if ($this->store->getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM) === 'yes') {
$toolTipNew .= PHP_EOL . "form = '" . $this->formSpec['name'] . "'" . PHP_EOL . "r = 0";
$toolTipDelete .= PHP_EOL . "table = '" . $this->formSpec['tableName'] . "'" . PHP_EOL . "r = '" . $this->store->getVar(SIP_RECORD_ID, STORE_SIP) . "'";
}
$sipParamString = OnArray::toString($this->store->getStore(STORE_SIP), ' = ', PHP_EOL, "'");
$formEditUrl = $this->createFormEditUrl();
$debugButtons = <<<BUTTONS
$buttonDebug = <<<BUTTON
<div class="btn-group" role="group">
<button id="debug-button" type="button" class="btn btn-default navbar-btn" title="not used at the moment"><span class="glyphicon glyphicon-eye-open"></span></button>
<button id="debug-button" type="button" class="btn btn-default navbar-btn" title="$sipParamString"><span class="glyphicon glyphicon-eye-open"></span></button>
<a href="$formEditUrl" id="form-edit-button" class="btn btn-default navbar-btn" title="Edit form"><span class="glyphicon glyphicon-wrench"></span></a>
</div>
BUTTONS;
BUTTON;
if (Support::findInSet(FORM_BUTTON_DELETE, $this->formSpec['showButton'])) {
$buttonDelete = <<<BUTTON
<div class="btn-group" role="group">
<button id="delete-button" type="button" class="btn btn-default navbar-btn" title="$toolTipDelete"><span class="glyphicon glyphicon-trash"></span></button>
</div>
BUTTON;
}
$formEditButton = ($this->store->getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM) === 'yes') ? $debugButtons : '';
if (Support::findInSet(FORM_BUTTON_NEW, $this->formSpec['showButton'])) {
$buttonNew = <<<BUTTON
<div class="btn-group" role="group">
<button id="delete-button" type="button" class="btn btn-default navbar-btn" title="$toolTipNew"><span class="glyphicon glyphicon-plus"></span></button>
</div>
BUTTON;
}
$buttonFormEdit = ($this->store->getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM) === 'yes') ? $buttonDebug : '';
$html = <<<BUTTONS
$html = <<<BUTTON
<div class="col-md-3 ">
<div class="btn-toolbar pull-right" role="toolbar">
$formEditButton
$buttonFormEdit
<div class="btn-group" role="group">
<button id="save-button" type="button" class="btn btn-default navbar-btn" title="Save"><span class="glyphicon glyphicon-ok"></span></button>
<button id="close-button" type="button" class="btn btn-default navbar-btn" title="Close"><span class="glyphicon glyphicon-remove"></span></button>
</div>
<div class="btn-group" role="group">
<button id="delete-button" type="button" class="btn btn-default navbar-btn" title="Delete"><span class="glyphicon glyphicon-trash"></span></button>
</div>
<div class="btn-group" role="group">
<button id="new-button" type="button" class="btn btn-default navbar-btn" title="New"><span class="glyphicon glyphicon-plus"></span></button>
</div>
$buttonDelete
$buttonNew
</div>
</div>
BUTTONS;
BUTTON;
return $html;
}
......@@ -332,6 +354,4 @@ EOF;
return $html;
}
}
\ No newline at end of file
......@@ -6,10 +6,11 @@
* Time: 8:35 PM
*/
const EXT_KEY = 'qfq';
const CONFIG_INI = "config.ini"; // QFQ configuration file: db access
const GFX_INFO = 'typo3conf/ext/qfq/Resources/Public/icons/note.gif';
const API_DIR = 'typo3conf/ext/qfq/qfq/api/';
const API_DIR = 'typo3conf/ext/qfq/qfq/api';
const QFQ_LOG = 'qfq.log';
......@@ -22,6 +23,8 @@ const FORM_PERMISSION_LOGGED_IN = 'logged_id';
const FORM_PERMISSION_LOGGED_OUT = 'logged_out';
const FORM_PERMISSION_ALWAYS = 'always';
const FORM_PERMISSION_NEVER = 'never';
const FORM_BUTTON_NEW = 'new';
const FORM_BUTTON_DELETE = 'delete';
const FORM_FORWARD_MODE_NO = 'no';
const FORM_FORWARD_MODE_AUTO = 'auto';
......@@ -65,12 +68,6 @@ const ROW_KEYS = "keys";
const KVP_IF_VALUE_EMPTY_COPY_KEY = 'if_value_empty_copy_key';
const KVP_VALUE_GIVEN = 'value_given';
// BuildForm
const SUBRECORD_COLUMN_WIDTH = 20;
const FORM_ELEMENTS_NATIVE = 'native';
const FORM_ELEMENTS_SUBRECORD = 'subrecord';
const FORM_ELEMENTS_NATIVE_SUBRECORD = 'native_subrecord';
// QFQ Error Codes
const ERROR_UNKNOW_SANITIZE_CLASS = 1001;
......@@ -116,6 +113,7 @@ const ERROR_GET_STORE_ZERO = 1047;
const ERROR_SET_STORE_ZERO = 1048;
const ERROR_MISSING_FORMELEMENT = 1049;
const ERROR_INVALID_OR_MISSING_PARAMETER = 1050;
const ERROR_UNKNOWN_SQL_LOG_MODE = 1051;
// Store
const ERROR_STORE_VALUE_ALREADY_CODPIED = 1100;
......@@ -195,7 +193,6 @@ const CLIENT_PHP_SELF = 'PHP_SELF';
const TYPO3_FORM = CLIENT_FORM;
const TYPO3_DEBUG_LOAD = 'debugLoad';
const TYPO3_DEBUG_SAVE = 'debugSave';
const TYPO3_DEBUG_SHOW_STACK = 'debugShowStack';
const TYPO3_FE_USER = 'feUser';
const TYPO3_FE_USER_UID = 'feUserUid';
const TYPO3_FE_USER_GROUP = 'feUserGroup';
......@@ -203,18 +200,22 @@ const TYPO3_TT_CONTENT_UID = 'ttcontentUid';
const TYPO3_PAGE_ID = 'typo3PageId';
// System
const SYSTEM_DBUSER = 'DBUSER';
const SYSTEM_DBSERVER = 'DBSERVER';
const SYSTEM_DBPW = 'DBPW';
const SYSTEM_DB = 'DB';
const SYSTEM_TESTDB = 'TESTDB';
const SYSTEM_SESSIONNAME = 'SESSIONNAME';
const SYSTEM_SQL_LOG = 'SQLLOG'; // Logging to file
const SYSTEM_DB_USER = 'DB_USER';
const SYSTEM_DB_SERVER = 'DB_SERVER';
const SYSTEM_DB_PASSWORD = 'DB_PASSWORD';
const SYSTEM_DB_NAME = 'DB_NAME';
const SYSTEM_DB_NAME_TEST = 'DB_NAME_TEST';
const SYSTEM_SESSION_NAME = 'SESSION_NAME';
const SYSTEM_SQL_LOG = 'SQL_LOG'; // Logging to file
const SYSTEM_SQL_LOG_MODE = 'SQL_LOG_MODE'; // Mode, which statements to log.
const SYSTEM_SHOW_DEBUG_INFO = 'SHOW_DEBUG_INFO';
const SYSTEM_CSS_LINK_CLASS_INTERNAL = 'CSS_LINK_CLASS_INTERNAL';
const SYSTEM_CSS_LINK_CLASS_EXTERNAL = 'CSS_LINK_CLASS_EXTERNAL';
// computed automatically during runtime
const SYSTEM_PATH_EXT = 'EXT_PATH';
// Information for: Log / Debug / Exception
const SYSTEM_SQL_RAW = 'sqlRaw'; // Type: SANITIZE_ALL / String. SQL Query (before substitute). Useful for error reporting.
const SYSTEM_SQL_FINAL = 'sqlFinal'; // Type: SANITIZE_ALL / String. SQL Query (after substitute). Useful for error reporting.
......@@ -243,6 +244,10 @@ const SIP_URLPARAM = 'urlparam';
// FORMELEMENT - copy of all formElements of processed form
//const DEF_FORM_ELEMENT_ID = 'id';
// SQL logging Modes
const SQL_LOG_MODE_ALL = 'all';
const SQL_LOG_MODE_MODIFY = 'modify';
// api/save.php, api/delete.php
const API_STATUS = 'status';
const API_MESSAGE = 'message';
......@@ -257,6 +262,24 @@ const API_ANSWER_REDIRECT_CLIENT = 'client';
const API_ANSWER_REDIRECT_NO = 'no';
const API_ANSWER_REDIRECT_URL = 'url';
// BuildForm
const SYMBOL_NEW = 'new';
const SYMBOL_EDIT = 'edit';
const SYMBOL_DELETE = 'delete';
//CHECKBOX
const CHECKBOX_VALUE_CHECKED = 'checked';
const CHECKBOX_VALUE_UNCHECKED = 'unchecked';
const CHECKBOX_ORIENTATION = 'orientation';
// Subrecord
const SUBRECORD_COLUMN_WIDTH = 20;
const FORM_ELEMENTS_NATIVE = 'native';
const FORM_ELEMENTS_SUBRECORD = 'subrecord';
const FORM_ELEMENTS_NATIVE_SUBRECORD = 'native_subrecord';
const SUBRECORD_NEW = SYMBOL_NEW;
const SUBRECORD_EDIT = SYMBOL_EDIT;
const SUBRECORD_DELETE = SYMBOL_DELETE;
const SUBRECORD_PARAMETER_FORM = CLIENT_FORM;
const SUBRECORD_PARAMETER_PAGE = 'page';
const SUBRECORD_PARAMETER_DETAIL = 'detail';
\ No newline at end of file
......@@ -9,12 +9,11 @@
namespace qfq;
use qfq;
use qfq\DbException;
use qfq\Store;
use qfq\CodeException;
use qfq\DbException;
use qfq\UserException;
use qfq\Support;
use qfq\Store;
require_once(__DIR__ . '/exceptions/UserException.php');
require_once(__DIR__ . '/exceptions/CodeException.php');
......@@ -54,7 +53,7 @@ class Database {
/**
* @var string
*/
private $sqlLog = '';
private $sqlLog = '';
/**
* Returns current data base handle from Store[System][SYSTEM_DBH].
......@@ -82,10 +81,10 @@ class Database {
private function dbConnect() {
$mysqli = null;
$dbuser = $this->store->getVar(SYSTEM_DBUSER, STORE_SYSTEM);
$dbserver = $this->store->getVar(SYSTEM_DBSERVER, STORE_SYSTEM);
$dbpw = $this->store->getVar(SYSTEM_DBPW, STORE_SYSTEM);
$db = $this->store->getVar(SYSTEM_DB, STORE_SYSTEM);
$dbuser = $this->store->getVar(SYSTEM_DB_USER, STORE_SYSTEM);
$dbserver = $this->store->getVar(SYSTEM_DB_SERVER, STORE_SYSTEM);
$dbpw = $this->store->getVar(SYSTEM_DB_PASSWORD, STORE_SYSTEM);
$db = $this->store->getVar(SYSTEM_DB_NAME, STORE_SYSTEM);
$mysqli = new \mysqli($dbserver, $dbuser, $dbpw, $db);
......@@ -188,7 +187,8 @@ class Database {
/**
* Fires query $sql and fetches result als assoc array (all modes but ROW_KEYS) or as num array (mode: ROW_EKYS). Throws exception.
* $mode
*
* $mode
* ROW_REGULAR: Return 2-dimensional assoc array. Every query row is one array row.
* ROW_IMPLODE_ALL: Return string. All cells of all rows imploded to one string.
* ROW_EXPECT_0: Return empty string if there is now record row, Else an exception.
......@@ -201,7 +201,7 @@ class Database {
* @param string $mode
* @param array $parameterArray
* @param string $specificMessage
* @return mixed|null
* @return mixed|null If no record found, empty string ( ROW_EXPECT_0_1, ROW_EXPECT_1) or empty array (all other modes)
* @throws \qfq\CodeException
* @throws \qfq\DbException
*/
......@@ -334,7 +334,7 @@ class Database {
}
$this->mysqli_result = $result;
$count = $this->mysqli_result->num_rows;
$msg = 'Get rows: ' . $count;
$msg = 'Read rows: ' . $count;
break;
case 'INSERT':
$count = $this->mysqli->insert_id;
......@@ -359,12 +359,31 @@ class Database {
}
/**
* Decide if the SQL statement has to be logged.If yes, create a timestamp and do the log.
*
* @param $sql
* @param $parameterArray
* @throws \qfq\CodeException
* @param array $parameterArray
* @return string
* @throws \qfq\UserException
*/
private function dbLog($sql, $parameterArray = array()) {
$msg = '[' . date('r') . '][';
$mode = $this->store->getVar(SYSTEM_SQL_LOG_MODE, STORE_SYSTEM);
switch ($mode) {
case SQL_LOG_MODE_ALL:
break;
case SQL_LOG_MODE_MODIFY:
if ($this->isSqlModify($sql)) {
break;
}
// nothing to log.
return;
default:
throw new UserException("Unknown SQL_LOG_MODE: $mode", ERROR_UNKNOWN_SQL_LOG_MODE);
}
$msg = '[' . date('Y.m.d H:i:s O') . '][';
if (count($parameterArray) === 0) {
$msg .= $sql;
......@@ -374,6 +393,10 @@ class Database {
$ii = 0;
foreach ($parameterArray as $value) {
if (isset($sqlArray[$ii])) {
if (is_array($value)) {
$value = OnArray::toString($value);
}
$msg .= $sqlArray[$ii++] . "'" . $value . "'";
} else {
$msg = '?';
......@@ -388,6 +411,24 @@ class Database {
Logger::logMessage($msg, $this->sqlLog);
}
/**
* Check if the given SQL Statement might modify data.
*
* @param $sql
* @return bool true is the statement might modify data, else: false
*/
private function isSqlModify($sql) {
$command = explode(' ', $sql, 2);
switch (strtoupper($command[0])) {
case 'INSERT':
case 'UPDATE':
case 'DELETE':
case 'REPLACE':
return true;
}
return false;
}
/**
* @param $arr
*/
......
......@@ -60,7 +60,7 @@ class Evaluate {
}
/**
* Recursive evaluation of 'line'.
* Recursive evaluation of 'line'. Constant string, Variables or SQL Query or all of them.
*
* Token to replace have to be enclosed by '{{' and '}}'
*
......@@ -69,7 +69,7 @@ class Evaluate {
* @return array|mixed|null|string
* @throws UserException
*/
public function parse($line, $recursion = 0, &$debugStack = array()) {
public function parse($line, $recursion = 0, &$debugStack = array(), &$foundInStore = '') {
$flagTokenReplaced = false;
if ($recursion > 4) {
......@@ -95,7 +95,7 @@ class Evaluate {
$post = substr($result, $posFirstClose +