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';
const NAME_SIP = 'sip';
const NAME_URL_PARAM = 'param';
const NAME_RIGHT = 'picturePositionRight';
const NAME_ACTION_DELETE = 'actionDelete';
const FINAL_HREF = 'finalHref';
const FINAL_ANCHOR = 'finalAnchor';
......@@ -118,6 +119,11 @@ const TOKEN_SIP = 's';
const TOKEN_URL_PARAM = 'U';
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_INTERNAL = 'i';
const TOKEN_CLASS_EXTERNAL = 'e';
......@@ -132,6 +138,7 @@ const DEFAULT_CHECK_COLOR = 'green';
const DEFAULT_RENDER_MODE = '0';
const DEFAULT_QUESTION_TEXT = 'Please confirm';
const DEFAULT_QUESTION_LEVEL = 'info';
const DEFAULT_ACTION_DELETE = 'r';
const QUESTION_INDEX_TEXT = 0;
const QUESTION_INDEX_LEVEL = 1;
......@@ -181,7 +188,8 @@ class Link {
TOKEN_PICTURE => 'buildPicture',
TOKEN_BULLET => 'buildBullet',
TOKEN_CHECK => 'buildCheck',
TOKEN_DELETE => 'buildDelete',
TOKEN_DELETE => 'buildDeleteIcon',
TOKEN_ACTION_DELETE => 'buildActionDelete',
TOKEN_EDIT => 'buildEdit',
TOKEN_HELP => 'buildHelp',
TOKEN_INFO => 'buildInfo',
......@@ -213,6 +221,7 @@ class Link {
TOKEN_SIP => NAME_SIP,
TOKEN_URL_PARAM => NAME_URL_PARAM,
TOKEN_RIGHT => NAME_RIGHT,
TOKEN_ACTION_DELETE => NAME_ACTION_DELETE,
];
private $tokenMapping = [
......@@ -238,6 +247,11 @@ class Link {
*/
public function __construct(Sip $sip, $phpUnit = false) {
$this->phpUnit = $phpUnit;
if ($phpUnit) {
$_SERVER['REQUEST_URI'] = 'localhost';
}
$this->sip = $sip;
$this->store = Store::getInstance('', $phpUnit);
$this->cssLinkClassInternal = $this->store->getVar(SYSTEM_CSS_LINK_CLASS_INTERNAL, STORE_SYSTEM);
......@@ -471,6 +485,8 @@ class Link {
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_ACTION_DELETE => '',
FINAL_HREF => '',
FINAL_CONTENT => '',
FINAL_SYMBOL => '',
......@@ -482,6 +498,8 @@ class Link {
}
/**
* Verify Empty values. If appropriate, set defaults, if not throw anexception.
*
* @param $key
* @param $value
* @return string
......@@ -513,6 +531,9 @@ class Link {
case TOKEN_RENDER:
$value = DEFAULT_RENDER_MODE;
break;
case TOKEN_ACTION_DELETE:
$value = DEFAULT_ACTION_DELETE;
break;
default:
}
......@@ -520,6 +541,8 @@ class Link {
}
/**
* Validate value for token
*
* @param $key
* @param $value
* @return mixed
......@@ -533,6 +556,16 @@ class Link {
throw new UserReportException ("Invalid value for token '$key': '$value''", ERROR_INVALID_VALUE);
}
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:
}
......@@ -607,6 +640,10 @@ class Link {
private function doHref(array &$vars) {
$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 (substr($vars[NAME_URL], 0, 1) === '?') {
......@@ -637,6 +674,41 @@ class Link {
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.
*
......@@ -1044,15 +1116,39 @@ EOF;
* @param $vars
* @return array
*/
private function buildDelete($vars) {
private function buildDeleteIcon($vars) {
$vars[NAME_GLYPH] = GLYPH_ICON_DELETE;
$vars[NAME_GLYPH_TITLE] = "Delete";
$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.
$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;
}
......@@ -1081,6 +1177,7 @@ EOF;
SIP_RECORD_ID . ", " . SIP_FORM . " or " . SIP_TABLE, ERROR_MISSING_REQUIRED_DELETE_QUALIFIER);
}
/**
* Called by $this->callTable
*
......
......@@ -604,8 +604,9 @@ class Report {
break;
case "bullet":
if ($columnValue === '')
if ($columnValue === '') {
break;
}
// r:3|B:
$linkValue = TOKEN_RENDER . ":3|" . TOKEN_BULLET . ":" . $columnValue;
......@@ -613,8 +614,9 @@ class Report {
break;
case "check":
if ($columnValue === '')
if ($columnValue === '') {
break;
}
// "r:3|C:
$linkValue = TOKEN_RENDER . ":3|" . TOKEN_CHECK . ":" . $columnValue;
......@@ -623,8 +625,9 @@ class Report {
case "img":
// "<path to image>|[alttext]|[text behind]" renders to: <img src="<path to image>" alt="[alttext]">[text behind]
if (empty($columnValue))
if (empty($columnValue)) {
break;
}
$mailarr = explode("|", $columnValue, 3);
......@@ -632,8 +635,9 @@ class Report {
$mailarr[] = '';
$mailarr[] = '';
if (empty($mailarr[0]))
if (empty($mailarr[0])) {
break;
}
$attribute = Support::doAttribute('src', $mailarr[0]);
$attribute .= Support::doAttribute('alt', $mailarr[1]);
......@@ -643,8 +647,9 @@ class Report {
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>
$mailarr = explode("|", $columnValue, 2);
if (empty($mailarr[0]))
if (empty($mailarr[0])) {
break;
}
$t1 = explode("@", $mailarr[0], 2);
$content .= "<script language=javascript><!--" . chr(10);
......@@ -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);
}
if (!isset($mailarr[SENDMAIL_IDX_REPLY_TO]))
if (!isset($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';
}
if (!isset($mailarr[SENDMAIL_IDX_GR_ID]))
if (!isset($mailarr[SENDMAIL_IDX_GR_ID])) {
$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';
}
if (!isset($mailarr[SENDMAIL_IDX_RECEIVER_CC]))
if (!isset($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_SRC] = "Report: T3 pageId=" . $this->store->getVar('pageId', STORE_TYPO3) .
", T3 ttcontentId=" . $this->store->getVar('ttcontentUid', STORE_TYPO3) .
......@@ -704,8 +715,9 @@ class Report {
$mailarr = "width:$width; ";
# height
if ($arr[3])
if ($arr[3]) {
$mailarr .= "height:" . $arr[3] . "; ";
}
# tag
if ($arr[4]) {
......@@ -885,12 +897,16 @@ class Report {
private function doPage($columnName, $columnValue) {
$defaultQuestion = '';
$defaultActionDelete = '';
$param = explode('|', $columnValue);
# get all defaultvalues, depending on the columnname
$defaultImage = isset($this->pageDefaults[DEFAULT_ICON][$columnName]) ? $this->pageDefaults[DEFAULT_ICON][$columnName] : '';
$defaultSip = 's';
if ($columnName === COLUMN_PAGED) {
$defaultActionDelete = TOKEN_ACTION_DELETE . ':' . TOKEN_ACTION_DELETE_REPORT;
}
# define defaultquestion only, if pagetype needs a question
if (!empty($this->pageDefaults[DEFAULT_QUESTION][$columnName])) {
......@@ -916,6 +932,8 @@ class Report {
case TOKEN_QUESTION:
$defaultQuestion = ''; // if a question is given: no default
break;
case TOKEN_ACTION_DELETE:
$defaultActionDelete = '';
default:
break;
}
......@@ -924,6 +942,10 @@ class Report {
$columnValue .= "|";
// append defaults
if ($defaultActionDelete !== '') {
$columnValue .= $defaultActionDelete . "|";
}
if ($defaultImage !== '') {
$columnValue .= $defaultImage . "|";
}
......@@ -936,41 +958,13 @@ class Report {
$columnValue .= $defaultQuestion . "|";
}
if ($columnName === 'paged') {
$columnValue = $this->adjustDeleteParameter($columnValue);
}
// if ($columnName === 'paged') {
// $columnValue = $this->adjustDeleteParameter($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
*
......
......@@ -11,6 +11,7 @@ namespace qfq;
require_once(__DIR__ . '/../../qfq/report/Link.php');
require_once(__DIR__ . '/../../qfq/store/Store.php');
require_once(__DIR__ . '/../../qfq/store/Sip.php');
require_once(__DIR__ . '/../../qfq/store/Session.php');
class LinkTest extends \PHPUnit_Framework_TestCase {
......@@ -554,9 +555,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
$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);
// $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);
//
$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);
$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);
......@@ -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);
}
/**
* @expectedException \qfq\UserReportException
*/
public function testDeleteException1() {
$link = new Link($this->sip, true);
// Missing recordId
$link->renderLink('U:form=Person&r=|x');
}
/**
*
*/
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment