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

Feature 5333 / Thumbnail: implemented for links.

parent 287859d8
......@@ -4886,6 +4886,10 @@ Column: _link
+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
| |x |Check |C:[<color>] |C:green |Show checked with '<color>'. Colors: blue, gray, green, pink, red, yellow. Default Color: green. |
+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
| |x |Thumbnail |T:<pathFilename> |T:fileadmin/file.pdf |Creates a thumbnail on the fly. Size is specified via 'W'. See `column-thumbnail`_ |
+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
| | |Dimension |W:[width]x[height] |W:50x , W:x60 , W:50x60 |Defines the pixel size of thumbnail. See `column-thumbnail`_ |
+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
| | |URL Params |U:<key1>=<value1>[&<keyN>=<valueN>]|U:a=value1&b=value2&c=... |Any number of additional Params. Links to forms: U:form=Person&r=1234. Used to create 'record delete'-links. |
+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
| | |Tooltip |o:<text> |o:More information here |Tooltip text |
......@@ -5854,14 +5858,14 @@ or if the thumbnail dimension changes.
The thumbnail pathFilename is a MD5 hash of the pathFilename plus the dimension.
From multi page files like PDFs, the first page is used
as source. All file formats, which GraphicsMagick 'convert' (http://www.graphicsmagick.org/formats.html) supports, can be
From multi page files like PDFs, the first page is used.
All file formats, which GraphicsMagick 'convert' (http://www.graphicsmagick.org/formats.html) supports, can be
used. Office file formats are not supported. Due to speed and quality reasons, SVG files will be converted by inkscape.
If a file format is not known, QFQ tries to show a corresponding file type image provided by Typo3 - such an image ist not
scaled.
In `config.qfq.ini`_ the exact location of `convert` and `inkscape` can be configured (optional) as well as the directory
names for the thumbnails.
names for the cached thumbnails.
Dimension
'''''''''
......@@ -5871,8 +5875,8 @@ GraphicsMagick support various settings to force the thumbnail size. See http://
Cleaning
''''''''
By default, the thumbnail directories are never cleaned. It's a good idea to install a cronjob which purges all files older than 1
year: ::
By default, the thumbnail directories are never cleaned. It's a good idea to install a cronjob which purges all files
older than 1 year: ::
find /path/to/files -type f -mtime +365 -delete
......@@ -5888,7 +5892,7 @@ Thumbnail: secure
Mode 'secure' is activated via enabling SIP (`s:1`, default). The thumbnail is saved under the path `thumbnailDirSecure`
as configured in `config.qfq.ini`_.
The secure path needs to be protected against direct file access by the webmaster / webserver configuration.
The secure path needs to be protected against direct file access by the webmaster / webserver configuration too.
QFQ returns a HTML 'img'-tag: ::
......
......@@ -95,6 +95,8 @@ const NAME_RIGHT = 'picturePositionRight';
const NAME_ACTION_DELETE = 'actionDelete';
const NAME_EXTRA_CONTENT_WRAP = 'extraContentWrap';
const NAME_FILE = 'file';
const NAME_THUMBNAIL = 'thumbnail';
const NAME_THUMBNAIL_DIMENSION = 'thumbnailDimension';
const FINAL_HREF = 'finalHref';
const FINAL_ANCHOR = 'finalAnchor';
......@@ -103,6 +105,7 @@ const FINAL_SYMBOL = 'finalSymbol';
const FINAL_TOOL_TIP = 'finalToolTip';
const FINAL_CLASS = 'finalClass';
const FINAL_QUESTION = 'finalQuestion';
const FINAL_THUMBNAIL = 'finalThumbnail';
const LINK_ANCHOR = 'linkAnchor';
const LINK_PICTURE = 'linkPicture';
......@@ -139,6 +142,11 @@ class Link {
*/
private $store = null;
/**
* @var Thumbnail
*/
private $thumbnail = null;
private $phpUnit;
private $renderControl = array();
// private $linkClassSelector = array(TOKEN_CLASS_INTERNAL => "internal ", TOKEN_CLASS_EXTERNAL => "external ");
......@@ -199,6 +207,8 @@ class Link {
TOKEN_ACTION_DELETE => NAME_ACTION_DELETE,
TOKEN_FILE => NAME_FILE,
TOKEN_FILE_DEPRECATED => NAME_FILE,
TOKEN_THUMBNAIL => NAME_THUMBNAIL,
TOKEN_THUMBNAIL_DIMENSION => NAME_THUMBNAIL_DIMENSION,
];
// Used to find double definitions.
......@@ -552,57 +562,6 @@ class Link {
return $vars;
}
/**
* Verify Empty values. If appropriate, set defaults, if not throw an exception.
*
* @param string $key
* @param string $value
*
* @return string
* @throws UserReportException
*/
private function checkForEmptyValue($key, $value) {
if ($value !== '') {
return $value;
}
$value = '';
switch ($key) {
case TOKEN_URL:
case TOKEN_MAIL:
case TOKEN_GLYPH:
throw new UserReportException ("Missing value for token '$key'", ERROR_MISSING_VALUE);
break;
case TOKEN_PAGE:
$value = $this->store->getVar(TYPO3_PAGE_ID, STORE_TYPO3); // If no pageid|pagealias is defined, take current page
break;
case TOKEN_RIGHT:
$value = 'r';
break;
case TOKEN_ENCRYPTION:
$value = '1';
break;
case TOKEN_SIP:
$value = '1';
break;
case TOKEN_BOOTSTRAP_BUTTON:
$value = '1';
break;
case TOKEN_QUESTION:
$value = DEFAULT_QUESTION_TEXT;
break;
case TOKEN_RENDER:
$value = DEFAULT_RENDER_MODE;
break;
case TOKEN_ACTION_DELETE:
$value = DEFAULT_ACTION_DELETE;
break;
default:
}
return $value;
}
/**
* Cleans and make existing the standard vars used every time to render a link.
*
......@@ -648,6 +607,7 @@ class Link {
FINAL_TOOL_TIP => '',
FINAL_CLASS => '',
FINAL_QUESTION => '',
FINAL_THUMBNAIL => '',
];
}
......@@ -748,6 +708,7 @@ class Link {
$vars[FINAL_TOOL_TIP] = $this->doToolTip($vars);
$vars[FINAL_CLASS] = $this->doCssClass($vars);
$vars[FINAL_SYMBOL] = $this->doSymbol($vars);
$vars[FINAL_THUMBNAIL] = $this->doThumbnail($vars);
$vars[FINAL_CONTENT] = $this->doContent($vars); // must be called after doSymbol()
$vars[FINAL_QUESTION] = $this->doQuestion($vars);
$vars[FINAL_ANCHOR] = $this->doAnchor($vars);
......@@ -974,29 +935,42 @@ class Link {
}
/**
* Concat Text and/or Image and or Glyph. $vars[NAME_RIGHT_PICTURE_POSITION]
* Concat Text and/or Image and or Glyph. Depending of $vars[NAME_RIGHT_PICTURE_POSITION], swapp the position,
* Concat Text, Image, Glyph and/or Thumbnail.
* Depending of $vars[NAME_RIGHT_PICTURE_POSITION], swap the position,
*
* @param array $vars
*
* @return string
*/
private function doContent(array $vars) {
$arr = array();
$htmlImage = $vars[FINAL_SYMBOL];
// Compose Image & Text
if ($htmlImage === '') {
$content = $vars[NAME_TEXT];
} elseif ($vars[NAME_TEXT] === '') {
$content = $htmlImage;
} else {
if ($vars[NAME_RIGHT] === "l") {
$content = implode(' ', [$htmlImage, $vars[NAME_TEXT]]);
} else {
$content = implode(' ', [$vars[NAME_TEXT], $htmlImage]);
$order = ($vars[NAME_RIGHT] === "l") ? [FINAL_SYMBOL, FINAL_THUMBNAIL, NAME_TEXT] : [NAME_TEXT, FINAL_THUMBNAIL, FINAL_SYMBOL];
foreach ($order as $key) {
if (!empty($vars[$key])) {
$arr[] = $vars[$key];
}
}
$content = implode(' ', $arr);
// Compose Image & Text
// if ($htmlImage === '') {
// $content = $vars[NAME_TEXT];
// } elseif ($vars[NAME_TEXT] === '') {
// $content = $htmlImage;
// } else {
// if ($vars[NAME_RIGHT] === "l") {
// $content = implode(' ', [$htmlImage, $vars[NAME_TEXT]]);
// } else {
// $content = implode(' ', [$vars[NAME_TEXT], $htmlImage]);
// }
// }
// if ($vars[NAME_RIGHT] === "l") {
// $content = implode(' ', [$htmlImage, $vars[NAME_TEXT]]);
// } else {
// $content = implode(' ', [$vars[NAME_TEXT], $htmlImage]);
// }
if ($vars[NAME_EXTRA_CONTENT_WRAP] != '') {
$content = Support::wrapTag($vars[NAME_EXTRA_CONTENT_WRAP], $content);
......@@ -1078,6 +1052,34 @@ EOF;
return $anchor;
}
/**
*
*
* @param array $vars
*
* @return string
* @throws UserReportException
*/
private function doThumbnail(array $vars) {
if (empty($vars[NAME_THUMBNAIL])) {
return '';
}
$arr = array();
$arr[] = TOKEN_THUMBNAIL . ':' . $vars[NAME_THUMBNAIL];
$arr[] = TOKEN_THUMBNAIL_DIMENSION . ':' . $vars[NAME_THUMBNAIL_DIMENSION];
$arr[] = TOKEN_SIP . ':' . $vars[NAME_SIP];
$str = implode('|', $arr);
if ($this->thumbnail === null) {
$this->thumbnail = new Thumbnail();
}
return $this->thumbnail->getImageTag($str);
}
/**
* Get mode from table $this->renderControl, depending on $modeRender, $modeUrl, $modeText
*
......
......@@ -4,6 +4,8 @@
* User: crose
* Date: 2/10/18
* Time: 3:14 PM
*
* See: doc/THUMBNAIL.md
*/
namespace qfq;
......@@ -39,6 +41,13 @@ class Thumbnail {
}
/**
* Renders a thumbnail based on $str.
* $str: "T:<pathfilename source>|W:<dimension>|s:<0|1>"
*
* Argument 'T' is mandatory.
* Argument 'W' is optional. Defaults to 'W:150x'.
* Argument 's' is optional. Defaults to 's:1'
*
* @param string $str
* @return string
*
......
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