Commit c3afadfe authored by Carsten  Rose's avatar Carsten Rose
Browse files

Link.php, Report.php: New '_link' token 'x'. '_paged' and '_Paged' are...

Link.php, Report.php: New '_link' token 'x'. '_paged' and '_Paged' are rendered via Link() class, Link() class now supports delete links.
parent 2a530c90
...@@ -85,6 +85,7 @@ const NAME_ENCRYPTION = 'encryption'; ...@@ -85,6 +85,7 @@ const NAME_ENCRYPTION = 'encryption';
const NAME_SIP = 'sip'; const NAME_SIP = 'sip';
const NAME_URL_PARAM = 'param'; const NAME_URL_PARAM = 'param';
const NAME_RIGHT = 'picturePositionRight'; const NAME_RIGHT = 'picturePositionRight';
const NAME_ACTION_DELETE = 'actionDelete';
const FINAL_HREF = 'finalHref'; const FINAL_HREF = 'finalHref';
const FINAL_ANCHOR = 'finalAnchor'; const FINAL_ANCHOR = 'finalAnchor';
...@@ -118,6 +119,11 @@ const TOKEN_SIP = 's'; ...@@ -118,6 +119,11 @@ const TOKEN_SIP = 's';
const TOKEN_URL_PARAM = 'U'; const TOKEN_URL_PARAM = 'U';
const TOKEN_RIGHT = 'R'; const TOKEN_RIGHT = 'R';
const TOKEN_ACTION_DELETE = 'x';
const TOKEN_ACTION_DELETE_AJAX = 'a';
const TOKEN_ACTION_DELETE_REPORT = 'r';
const TOKEN_ACTION_DELETE_CLOSE = 'c';
const TOKEN_CLASS_NONE = 'n'; const TOKEN_CLASS_NONE = 'n';
const TOKEN_CLASS_INTERNAL = 'i'; const TOKEN_CLASS_INTERNAL = 'i';
const TOKEN_CLASS_EXTERNAL = 'e'; const TOKEN_CLASS_EXTERNAL = 'e';
...@@ -132,6 +138,7 @@ const DEFAULT_CHECK_COLOR = 'green'; ...@@ -132,6 +138,7 @@ const DEFAULT_CHECK_COLOR = 'green';
const DEFAULT_RENDER_MODE = '0'; const DEFAULT_RENDER_MODE = '0';
const DEFAULT_QUESTION_TEXT = 'Please confirm'; const DEFAULT_QUESTION_TEXT = 'Please confirm';
const DEFAULT_QUESTION_LEVEL = 'info'; const DEFAULT_QUESTION_LEVEL = 'info';
const DEFAULT_ACTION_DELETE = 'r';
const QUESTION_INDEX_TEXT = 0; const QUESTION_INDEX_TEXT = 0;
const QUESTION_INDEX_LEVEL = 1; const QUESTION_INDEX_LEVEL = 1;
...@@ -181,7 +188,8 @@ class Link { ...@@ -181,7 +188,8 @@ class Link {
TOKEN_PICTURE => 'buildPicture', TOKEN_PICTURE => 'buildPicture',
TOKEN_BULLET => 'buildBullet', TOKEN_BULLET => 'buildBullet',
TOKEN_CHECK => 'buildCheck', TOKEN_CHECK => 'buildCheck',
TOKEN_DELETE => 'buildDelete', TOKEN_DELETE => 'buildDeleteIcon',
TOKEN_ACTION_DELETE => 'buildActionDelete',
TOKEN_EDIT => 'buildEdit', TOKEN_EDIT => 'buildEdit',
TOKEN_HELP => 'buildHelp', TOKEN_HELP => 'buildHelp',
TOKEN_INFO => 'buildInfo', TOKEN_INFO => 'buildInfo',
...@@ -213,6 +221,7 @@ class Link { ...@@ -213,6 +221,7 @@ class Link {
TOKEN_SIP => NAME_SIP, TOKEN_SIP => NAME_SIP,
TOKEN_URL_PARAM => NAME_URL_PARAM, TOKEN_URL_PARAM => NAME_URL_PARAM,
TOKEN_RIGHT => NAME_RIGHT, TOKEN_RIGHT => NAME_RIGHT,
TOKEN_ACTION_DELETE => NAME_ACTION_DELETE,
]; ];
private $tokenMapping = [ private $tokenMapping = [
...@@ -238,6 +247,11 @@ class Link { ...@@ -238,6 +247,11 @@ class Link {
*/ */
public function __construct(Sip $sip, $phpUnit = false) { public function __construct(Sip $sip, $phpUnit = false) {
$this->phpUnit = $phpUnit; $this->phpUnit = $phpUnit;
if ($phpUnit) {
$_SERVER['REQUEST_URI'] = 'localhost';
}
$this->sip = $sip; $this->sip = $sip;
$this->store = Store::getInstance('', $phpUnit); $this->store = Store::getInstance('', $phpUnit);
$this->cssLinkClassInternal = $this->store->getVar(SYSTEM_CSS_LINK_CLASS_INTERNAL, STORE_SYSTEM); $this->cssLinkClassInternal = $this->store->getVar(SYSTEM_CSS_LINK_CLASS_INTERNAL, STORE_SYSTEM);
...@@ -471,6 +485,8 @@ class Link { ...@@ -471,6 +485,8 @@ class Link {
NAME_LINK_CLASS => '', // class name NAME_LINK_CLASS => '', // class name
NAME_LINK_CLASS_DEFAULT => '', // Depending of 'as page' or 'as url'. Only used if class is not explizit set. NAME_LINK_CLASS_DEFAULT => '', // Depending of 'as page' or 'as url'. Only used if class is not explizit set.
NAME_ACTION_DELETE => '',
FINAL_HREF => '', FINAL_HREF => '',
FINAL_CONTENT => '', FINAL_CONTENT => '',
FINAL_SYMBOL => '', FINAL_SYMBOL => '',
...@@ -482,6 +498,8 @@ class Link { ...@@ -482,6 +498,8 @@ class Link {
} }
/** /**
* Verify Empty values. If appropriate, set defaults, if not throw anexception.
*
* @param $key * @param $key
* @param $value * @param $value
* @return string * @return string
...@@ -513,6 +531,9 @@ class Link { ...@@ -513,6 +531,9 @@ class Link {
case TOKEN_RENDER: case TOKEN_RENDER:
$value = DEFAULT_RENDER_MODE; $value = DEFAULT_RENDER_MODE;
break; break;
case TOKEN_ACTION_DELETE:
$value = DEFAULT_ACTION_DELETE;
break;
default: default:
} }
...@@ -520,6 +541,8 @@ class Link { ...@@ -520,6 +541,8 @@ class Link {
} }
/** /**
* Validate value for token
*
* @param $key * @param $key
* @param $value * @param $value
* @return mixed * @return mixed
...@@ -533,6 +556,16 @@ class Link { ...@@ -533,6 +556,16 @@ class Link {
throw new UserReportException ("Invalid value for token '$key': '$value''", ERROR_INVALID_VALUE); throw new UserReportException ("Invalid value for token '$key': '$value''", ERROR_INVALID_VALUE);
} }
break; break;
case TOKEN_ACTION_DELETE:
switch ($value) {
case TOKEN_ACTION_DELETE_AJAX:
case TOKEN_ACTION_DELETE_REPORT:
case TOKEN_ACTION_DELETE_CLOSE:
break;
default:
throw new UserReportException ("Invalid value for token '$key': '$value''", ERROR_INVALID_VALUE);
}
break;
default: default:
} }
...@@ -607,6 +640,10 @@ class Link { ...@@ -607,6 +640,10 @@ class Link {
private function doHref(array &$vars) { private function doHref(array &$vars) {
$urlNParam = ''; $urlNParam = '';
if ($vars[NAME_ACTION_DELETE] !== '') {
$vars[NAME_URL_PARAM] = $this->adjustDeleteParameter($vars[NAME_ACTION_DELETE], $vars[NAME_URL_PARAM]);
}
if ($vars[NAME_MAIL] === '') { if ($vars[NAME_MAIL] === '') {
if (substr($vars[NAME_URL], 0, 1) === '?') { if (substr($vars[NAME_URL], 0, 1) === '?') {
...@@ -637,6 +674,41 @@ class Link { ...@@ -637,6 +674,41 @@ class Link {
return $urlNParam; return $urlNParam;
} }
/**
* @param $tokenActionDelete
* @param $nameUrlParam
* @return string
* @throws UserReportException
*/
private function adjustDeleteParameter($tokenActionDelete, $nameUrlParam) {
$kvp = new KeyValueStringParser();
// Split in: [p => 'r=100&table=note&..', 'D' => ''... ],
// $param = $kvp->parse($nameUrlParam, ':', '|');
// Support::setIfNotSet($param, TOKEN_URL_PARAM);
switch ($tokenActionDelete) {
case TOKEN_ACTION_DELETE_AJAX:
// TODO: Implement for AJAX (subrecord)
throw new UserReportException ("Not implemented!", ERROR_NOT_IMPLEMENTED);
break;
case TOKEN_ACTION_DELETE_REPORT:
$nameUrlParam .= '&' . SIP_MODE_ANSWER . '=' . MODE_HTML;
$nameUrlParam .= '&' . SIP_TARGET_URL . '=' . $_SERVER['REQUEST_URI'];
break;
case TOKEN_ACTION_DELETE_CLOSE:
// TODO: Implement for Form (primary Record wird geloescht)
throw new UserReportException ("Not implemented!", ERROR_NOT_IMPLEMENTED);
break;
default:
throw new UserReportException ("Invalid value for token '" . TOKEN_ACTION_DELETE . "': '$tokenActionDelete''", ERROR_INVALID_VALUE);
}
return $nameUrlParam;
}
/** /**
* Return $vars[NAME_TOOL_TIP]. If $vars[NAME_TOOL_TIP] is empty, set $vars[NAME_GLYPH_TITLE] as tooltip. * Return $vars[NAME_TOOL_TIP]. If $vars[NAME_TOOL_TIP] is empty, set $vars[NAME_GLYPH_TITLE] as tooltip.
* *
...@@ -1044,15 +1116,39 @@ EOF; ...@@ -1044,15 +1116,39 @@ EOF;
* @param $vars * @param $vars
* @return array * @return array
*/ */
private function buildDelete($vars) { private function buildDeleteIcon($vars) {
$vars[NAME_GLYPH] = GLYPH_ICON_DELETE; $vars[NAME_GLYPH] = GLYPH_ICON_DELETE;
$vars[NAME_GLYPH_TITLE] = "Delete"; $vars[NAME_GLYPH_TITLE] = "Delete";
$vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS;
return $vars;
}
/**
* Called by $this->callTable
*
* @param $vars
* @param $value
* @return array
* @throws UserReportException
*/
private function buildActionDelete($vars, $value) {
// Minimal check for required parameter. // Minimal check for required parameter.
$this->checkDeleteParam($vars[NAME_URL_PARAM]); $this->checkDeleteParam($vars[NAME_URL_PARAM]);
if ($vars[NAME_URL] == '') {
$vars[NAME_URL] = API_DIR . '/' . API_DELETE_PHP;
}
if (!isset($vars[NAME_LINK_CLASS])) {
// no_class: By default a button will be rendered. NAME_URL typically implies class external. That does not match.
$vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS;
}
$vars[NAME_SIP] = "1";
return $vars; return $vars;
} }
...@@ -1081,6 +1177,7 @@ EOF; ...@@ -1081,6 +1177,7 @@ EOF;
SIP_RECORD_ID . ", " . SIP_FORM . " or " . SIP_TABLE, ERROR_MISSING_REQUIRED_DELETE_QUALIFIER); SIP_RECORD_ID . ", " . SIP_FORM . " or " . SIP_TABLE, ERROR_MISSING_REQUIRED_DELETE_QUALIFIER);
} }
/** /**
* Called by $this->callTable * Called by $this->callTable
* *
......
...@@ -604,8 +604,9 @@ class Report { ...@@ -604,8 +604,9 @@ class Report {
break; break;
case "bullet": case "bullet":
if ($columnValue === '') if ($columnValue === '') {
break; break;
}
// r:3|B: // r:3|B:
$linkValue = TOKEN_RENDER . ":3|" . TOKEN_BULLET . ":" . $columnValue; $linkValue = TOKEN_RENDER . ":3|" . TOKEN_BULLET . ":" . $columnValue;
...@@ -613,8 +614,9 @@ class Report { ...@@ -613,8 +614,9 @@ class Report {
break; break;
case "check": case "check":
if ($columnValue === '') if ($columnValue === '') {
break; break;
}
// "r:3|C: // "r:3|C:
$linkValue = TOKEN_RENDER . ":3|" . TOKEN_CHECK . ":" . $columnValue; $linkValue = TOKEN_RENDER . ":3|" . TOKEN_CHECK . ":" . $columnValue;
...@@ -623,8 +625,9 @@ class Report { ...@@ -623,8 +625,9 @@ class Report {
case "img": case "img":
// "<path to image>|[alttext]|[text behind]" renders to: <img src="<path to image>" alt="[alttext]">[text behind] // "<path to image>|[alttext]|[text behind]" renders to: <img src="<path to image>" alt="[alttext]">[text behind]
if (empty($columnValue)) if (empty($columnValue)) {
break; break;
}
$mailarr = explode("|", $columnValue, 3); $mailarr = explode("|", $columnValue, 3);
...@@ -632,8 +635,9 @@ class Report { ...@@ -632,8 +635,9 @@ class Report {
$mailarr[] = ''; $mailarr[] = '';
$mailarr[] = ''; $mailarr[] = '';
if (empty($mailarr[0])) if (empty($mailarr[0])) {
break; break;
}
$attribute = Support::doAttribute('src', $mailarr[0]); $attribute = Support::doAttribute('src', $mailarr[0]);
$attribute .= Support::doAttribute('alt', $mailarr[1]); $attribute .= Support::doAttribute('alt', $mailarr[1]);
...@@ -643,8 +647,9 @@ class Report { ...@@ -643,8 +647,9 @@ class Report {
case "mailto": case "mailto":
// "<email address>|[Real Name]" renders to (encrypted via JS): <a href="mailto://<email address>"><email address></a> OR <a href="mailto://<email address>">[Real Name]</a> // "<email address>|[Real Name]" renders to (encrypted via JS): <a href="mailto://<email address>"><email address></a> OR <a href="mailto://<email address>">[Real Name]</a>
$mailarr = explode("|", $columnValue, 2); $mailarr = explode("|", $columnValue, 2);
if (empty($mailarr[0])) if (empty($mailarr[0])) {
break; break;
}
$t1 = explode("@", $mailarr[0], 2); $t1 = explode("@", $mailarr[0], 2);
$content .= "<script language=javascript><!--" . chr(10); $content .= "<script language=javascript><!--" . chr(10);
...@@ -667,23 +672,29 @@ class Report { ...@@ -667,23 +672,29 @@ class Report {
throw new SyntaxReportException ("Too few parameter for sendmail: $columnValue", ERROR_TOO_FEW_PARAMETER_FOR_SENDMAIL, null, __FILE__, __LINE__, $this->fr_error); throw new SyntaxReportException ("Too few parameter for sendmail: $columnValue", ERROR_TOO_FEW_PARAMETER_FOR_SENDMAIL, null, __FILE__, __LINE__, $this->fr_error);
} }
if (!isset($mailarr[SENDMAIL_IDX_REPLY_TO])) if (!isset($mailarr[SENDMAIL_IDX_REPLY_TO])) {
$mailarr[SENDMAIL_IDX_REPLY_TO] = ''; $mailarr[SENDMAIL_IDX_REPLY_TO] = '';
}
if (!isset($mailarr[SENDMAIL_IDX_FLAG_AUTO_SUBMIT])) if (!isset($mailarr[SENDMAIL_IDX_FLAG_AUTO_SUBMIT])) {
$mailarr[SENDMAIL_IDX_FLAG_AUTO_SUBMIT] = 'off'; $mailarr[SENDMAIL_IDX_FLAG_AUTO_SUBMIT] = 'off';
}
if (!isset($mailarr[SENDMAIL_IDX_GR_ID])) if (!isset($mailarr[SENDMAIL_IDX_GR_ID])) {
$mailarr[SENDMAIL_IDX_GR_ID] = '0'; $mailarr[SENDMAIL_IDX_GR_ID] = '0';
}
if (!isset($mailarr[SENDMAIL_IDX_X_ID])) if (!isset($mailarr[SENDMAIL_IDX_X_ID])) {
$mailarr[SENDMAIL_IDX_X_ID] = '0'; $mailarr[SENDMAIL_IDX_X_ID] = '0';
}
if (!isset($mailarr[SENDMAIL_IDX_RECEIVER_CC])) if (!isset($mailarr[SENDMAIL_IDX_RECEIVER_CC])) {
$mailarr[SENDMAIL_IDX_RECEIVER_CC] = ''; $mailarr[SENDMAIL_IDX_RECEIVER_CC] = '';
}
if (!isset($mailarr[SENDMAIL_IDX_RECEIVER_BCC])) if (!isset($mailarr[SENDMAIL_IDX_RECEIVER_BCC])) {
$mailarr[SENDMAIL_IDX_RECEIVER_BCC] = ''; $mailarr[SENDMAIL_IDX_RECEIVER_BCC] = '';
}
$mailarr[SENDMAIL_IDX_SRC] = "Report: T3 pageId=" . $this->store->getVar('pageId', STORE_TYPO3) . $mailarr[SENDMAIL_IDX_SRC] = "Report: T3 pageId=" . $this->store->getVar('pageId', STORE_TYPO3) .
", T3 ttcontentId=" . $this->store->getVar('ttcontentUid', STORE_TYPO3) . ", T3 ttcontentId=" . $this->store->getVar('ttcontentUid', STORE_TYPO3) .
...@@ -704,8 +715,9 @@ class Report { ...@@ -704,8 +715,9 @@ class Report {
$mailarr = "width:$width; "; $mailarr = "width:$width; ";
# height # height
if ($arr[3]) if ($arr[3]) {
$mailarr .= "height:" . $arr[3] . "; "; $mailarr .= "height:" . $arr[3] . "; ";
}
# tag # tag
if ($arr[4]) { if ($arr[4]) {
...@@ -885,12 +897,16 @@ class Report { ...@@ -885,12 +897,16 @@ class Report {
private function doPage($columnName, $columnValue) { private function doPage($columnName, $columnValue) {
$defaultQuestion = ''; $defaultQuestion = '';
$defaultActionDelete = '';
$param = explode('|', $columnValue); $param = explode('|', $columnValue);
# get all defaultvalues, depending on the columnname # get all defaultvalues, depending on the columnname
$defaultImage = isset($this->pageDefaults[DEFAULT_ICON][$columnName]) ? $this->pageDefaults[DEFAULT_ICON][$columnName] : ''; $defaultImage = isset($this->pageDefaults[DEFAULT_ICON][$columnName]) ? $this->pageDefaults[DEFAULT_ICON][$columnName] : '';
$defaultSip = 's'; $defaultSip = 's';
if ($columnName === COLUMN_PAGED) {
$defaultActionDelete = TOKEN_ACTION_DELETE . ':' . TOKEN_ACTION_DELETE_REPORT;
}
# define defaultquestion only, if pagetype needs a question # define defaultquestion only, if pagetype needs a question
if (!empty($this->pageDefaults[DEFAULT_QUESTION][$columnName])) { if (!empty($this->pageDefaults[DEFAULT_QUESTION][$columnName])) {
...@@ -916,6 +932,8 @@ class Report { ...@@ -916,6 +932,8 @@ class Report {
case TOKEN_QUESTION: case TOKEN_QUESTION:
$defaultQuestion = ''; // if a question is given: no default $defaultQuestion = ''; // if a question is given: no default
break; break;
case TOKEN_ACTION_DELETE:
$defaultActionDelete = '';
default: default:
break; break;
} }
...@@ -924,6 +942,10 @@ class Report { ...@@ -924,6 +942,10 @@ class Report {
$columnValue .= "|"; $columnValue .= "|";
// append defaults // append defaults
if ($defaultActionDelete !== '') {
$columnValue .= $defaultActionDelete . "|";
}
if ($defaultImage !== '') { if ($defaultImage !== '') {
$columnValue .= $defaultImage . "|"; $columnValue .= $defaultImage . "|";
} }
...@@ -936,41 +958,13 @@ class Report { ...@@ -936,41 +958,13 @@ class Report {
$columnValue .= $defaultQuestion . "|"; $columnValue .= $defaultQuestion . "|";
} }
if ($columnName === 'paged') { // if ($columnName === 'paged') {
$columnValue = $this->adjustDeleteParameter($columnValue); // $columnValue = $this->adjustDeleteParameter($columnValue);
} // }
return ($columnValue); return ($columnValue);
} }
/**
* @param $columnValue
* @return string
* @throws UserFormException
*/
private function adjustDeleteParameter($columnValue) {
$kvp = new KeyValueStringParser();
// Split in: [p => 'r=100&table=note&..', 'D' => ''... ],
$param = $kvp->parse($columnValue, ':', '|');
Support::setIfNotSet($param, TOKEN_URL_PARAM);
$param[TOKEN_URL_PARAM] .= '&' . SIP_MODE_ANSWER . '=' . MODE_HTML;
$param[TOKEN_URL_PARAM] .= '&' . SIP_TARGET_URL . '=' . $_SERVER['REQUEST_URI'];
if (!isset($param[TOKEN_URL])) {
$param[TOKEN_URL] = API_DIR . '/' . API_DELETE_PHP;
if(!isset($param[TOKEN_CLASS])) {
$param[TOKEN_CLASS] = TOKEN_CLASS_NONE; // no_class: By default a button will be rendered. TOKEN_URL typically implies class external. That does not match.
}
}
return $kvp->unparse($param, ':', '|');
}
/** /**
* Generate SortArgument * Generate SortArgument
* *
......
...@@ -11,6 +11,7 @@ namespace qfq; ...@@ -11,6 +11,7 @@ namespace qfq;
require_once(__DIR__ . '/../../qfq/report/Link.php'); require_once(__DIR__ . '/../../qfq/report/Link.php');
require_once(__DIR__ . '/../../qfq/store/Store.php'); require_once(__DIR__ . '/../../qfq/store/Store.php');
require_once(__DIR__ . '/../../qfq/store/Sip.php'); require_once(__DIR__ . '/../../qfq/store/Sip.php');
require_once(__DIR__ . '/../../qfq/store/Session.php');
class LinkTest extends \PHPUnit_Framework_TestCase { class LinkTest extends \PHPUnit_Framework_TestCase {
...@@ -554,9 +555,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase { ...@@ -554,9 +555,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
$result = $link->renderLink('u:http://example.com|N'); $result = $link->renderLink('u:http://example.com|N');
$this->assertEquals('<a href="http://example.com" class="btn btn-default" title="New" ><span class="glyphicon glyphicon-plus" ></span></a>', $result); $this->assertEquals('<a href="http://example.com" class="btn btn-default" title="New" ><span class="glyphicon glyphicon-plus" ></span></a>', $result);
// $result = $link->renderLink('u:http://example.com|D'); $result = $link->renderLink('u:http://example.com|D');
// $this->assertEquals('<a href="http://example.com" class="btn btn-default" title="Delete" ><span class="glyphicon glyphicon-trash" ></span></a>', $result); $this->assertEquals('<a href="http://example.com" class="btn btn-default" title="Delete" ><span class="glyphicon glyphicon-trash" ></span></a>', $result);
//
$result = $link->renderLink('u:http://example.com|H'); $result = $link->renderLink('u:http://example.com|H');
$this->assertEquals('<a href="http://example.com" class="btn btn-default" title="Help" ><span class="glyphicon glyphicon glyphicon-question-sign" ></span></a>', $result); $this->assertEquals('<a href="http://example.com" class="btn btn-default" title="Help" ><span class="glyphicon glyphicon glyphicon-question-sign" ></span></a>', $result);
...@@ -997,6 +998,57 @@ EOF; ...@@ -997,6 +998,57 @@ EOF;
} }
public function testDelete() {
$link = new Link($this->sip, true);
// Report Delete action, default: 'Report', no Icon
$result = $link->renderLink('U:form=Person&r=123|x');
$this->assertEquals('<a href="typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234" >typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234</a>', $result);
// Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set.
$result = \qfq\Session::get('badcaffee1234');
$this->assertEquals('_modeAnswer=html&_targetUrl=localhost&form=Person&r=123', $result);
// Report Delete action, explicit 'Report', no Icon
$result = $link->renderLink('U:form=PersonA&r=1234|x:r');
$this->assertEquals('<a href="typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234" >typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234</a>', $result);
// Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set.
$result = \qfq\Session::get('badcaffee1234');
$this->assertEquals('_modeAnswer=html&_targetUrl=localhost&form=PersonA&r=1234', $result);
// Report Delete action, explicit 'Report', Text
$result = $link->renderLink('U:form=PersonAa&r=2234|x:r|t:Delete Record');
$this->assertEquals('<a href="typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234" >Delete Record</a>', $result);
// Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set.
$result = \qfq\Session::get('badcaffee1234');
$this->assertEquals('_modeAnswer=html&_targetUrl=localhost&form=PersonAa&r=2234', $result);
// Report Delete action, with Icon
$result = $link->renderLink('U:form=PersonB&r=1235|x|D');
$this->assertEquals('<a href="typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234" class="btn btn-default" title="Delete" ><span class="glyphicon glyphicon-trash" ></span></a>', $result);
// Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set.
$result = \qfq\Session::get('badcaffee1234');
$this->assertEquals('_modeAnswer=html&_targetUrl=localhost&form=PersonB&r=1235', $result);
// Report Delete action: explicit php file, default: 'Report', no Icon
$result = $link->renderLink('u:mydelete.php|U:form=PersonC&r=1236|x');
$this->assertEquals('<a href="mydelete.php?s=badcaffee1234" class="external" >mydelete.php?s=badcaffee1234</a>', $result);
// Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set.
$result = \qfq\Session::get('badcaffee1234');
$this->assertEquals('_modeAnswer=html&_targetUrl=localhost&form=PersonC&r=1236', $result);
}