1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-10 16:54:44 +02:00

Add custom __debugInfo() methods to Pagefile, Pageimage, and Pagefiles per processwire/processwire-issues#575 plus some other minor updates to Pagefile/Pageimage

This commit is contained in:
Ryan Cramer
2018-04-27 09:55:31 -04:00
parent c2324f0a8a
commit 904db74f1a
3 changed files with 170 additions and 26 deletions

View File

@@ -28,10 +28,13 @@
* @property string $description Value of the files description field (string), if enabled. Note you can also set this property directly.
* @property string $tags Value of the files tags field (string), if enabled. #pw-group-tags
* @property string $ext Files extension (i.e. last 3 or so characters)
* @property int $filesize File size (number of bytes).
* @property-read int $filesize File size (number of bytes).
* @property int $modified Unix timestamp of when Pagefile (file, description or tags) was last modified. #pw-group-date-time
* @property int $mtime Unix timestamp of when file (only) was last modified. #pw-group-date-time
* @property-read string $modifiedStr Readable date/time string of when Pagefile was last modified. #pw-group-date-time
* @property-read int $mtime Unix timestamp of when file (only) was last modified. #pw-group-date-time
* @property-read string $mtimeStr Readable date/time string when file (only) was last modified. #pw-group-date-time
* @property int $created Unix timestamp of when file was created. #pw-group-date-time
* @property-read string $createdStr Readable date/time string of when Pagefile was created #pw-group-date-time
* @property string $filesizeStr File size as a formatted string, i.e. “123 Kb”.
* @property Pagefiles $pagefiles The Pagefiles WireArray that contains this file. #pw-group-other
* @property Page $page The Page object that this file is part of. #pw-group-other
@@ -522,12 +525,21 @@ class Pagefile extends WireData {
parent::set($key, $value);
}
break;
case 'modifiedStr':
case 'createdStr':
$value = parent::get(str_replace('Str', '', $key));
$value = wireDate($this->wire('config')->dateFormat, $value);
break;
case 'fileData':
case 'filedata':
$value = $this->filedata();
break;
case 'mtime':
case 'mtimeStr':
case 'filemtime':
case 'filemtimeStr':
$value = filemtime($this->filename());
if(strpos($key, 'Str')) $value = wireDate($this->wire('config')->dateFormat, $value);
break;
}
if(is_null($value)) return parent::get($key);
@@ -1026,5 +1038,29 @@ class Pagefile extends WireData {
public function isTemp($set = null) {
return $this->pagefiles->isTemp($this, $set);
}
/**
* Debug info
*
* @return array
*
*/
public function __debugInfo() {
$filedata = $this->filedata();
if(empty($filedata)) $filedata = null;
$info = array(
'url' => $this->url(),
'filename' => $this->filename(),
'filesize' => $this->filesize(),
'description' => $this->description,
'tags' => $this->tags,
'created' => $this->createdStr,
'modified' => $this->modifiedStr,
'filemtime' => $this->mtimeStr,
'filedata' => $filedata,
);
if(empty($info['filedata'])) unset($info['filedata']);
return $info;
}
}

View File

@@ -38,7 +38,7 @@
* Typically a Pagefiles object will be associated with a specific field attached to a Page.
* There may be multiple instances of Pagefiles attached to a given Page (depending on what fields are in it's fieldgroup).
*
* ProcessWire 3.x, Copyright 2016 by Ryan Cramer
* ProcessWire 3.x, Copyright 2018 by Ryan Cramer
* https://processwire.com
*
*
@@ -905,5 +905,29 @@ class Pagefiles extends WireArray implements PageFieldValueInterface {
return $this->formatted;
}
/**
* Debug info
*
* @return array
*
*/
public function __debugInfo() {
$info = array(
'count' => $this->count(),
'page' => $this->page ? $this->page->path() : '?',
'field' => $this->field ? $this->field->name : '?',
'url' => $this->url(),
'path' => $this->path(),
'items' => array(),
);
foreach($this as $key => $pagefile) {
/** @var Pagefile $pagefile */
$info['items'][$key] = $pagefile->__debugInfo();
}
return $info;
}
}

View File

@@ -37,9 +37,12 @@
* @property-read string $basename
* @property-read string $filename
* @property-read array $focus Focus array contains 'top' (float), 'left' (float), 'zoom' (int), and 'default' (bool) properties.
* @property-read string $focusStr Readable string containing focus information.
* @property-read bool $hasFocus Does this image have custom focus settings? (i.e. $focus['default'] == true)
* @property-read array $suffix Array containing file suffix(es).
* @property-read string $suffixStr String of file suffix(es) separated by comma.
*
* @method bool|array isVariation($basename, $allowSelf = false)
* @method bool|array isVariation($basename, $options = array())
* @method Pageimage crop($x, $y, $width, $height, $options = array())
* @method array rebuildVariations($mode = 0, array $suffix = array(), array $options = array())
* @method install($filename)
@@ -201,7 +204,8 @@ class Pageimage extends Pagefile {
* - SET: Specify both $top and $left arguments to set (values assumed to be percentages).
* - SET: Specify array containing "top" and "left" indexes to set (percentages).
* - SET: Specify array where index 0 is top and index 1 is left (percentages).
* - SET: Specify string in the format "top left", i.e. "25 70" (percentages).
* - SET: Specify string in the format "top left", i.e. "25 70" or "top left zoom", i.e. "25 70 30" (percentages).
* - SET: Specify CSV key=value string in the format "top=25%, left=70%, zoom=30%" in any order
* - UNSET: Specify boolean false to remove any focus values.
* @param null|float|int $left Set left value (when $top value is float|int)
* - This argument is only used when setting focus and should be omitted otherwise.
@@ -214,7 +218,19 @@ class Pageimage extends Pagefile {
*/
public function focus($top = null, $left = null, $zoom = null) {
if(is_string($top) && strpos($top, ' ') && $left === null) {
if(is_string($top) && $left === null) {
if(strpos($top, '=')) {
// SET string "top=25%, left=70%, zoom=0%"
$a = array('top' => 50, 'left' => 50, 'zoom' => 0);
$parts = explode(',', str_replace(array(' ', '%'), '', $top));
foreach($parts as $part) {
if(!strpos($part, '=')) continue;
list($name, $pct) = explode('=', $part);
$a[$name] = strpos($pct, '.') !== false ? (float) $pct : (int) $pct;
}
$top = $a; // for later setting by array
unset($a);
} else if(strpos($top, ' ')) {
// SET string like "25 70 0" (representing "top left zoom")
if(strpos($top, ' ') != strrpos($top, ' ')) {
// with zoom
@@ -225,6 +241,7 @@ class Pageimage extends Pagefile {
$zoom = 0;
}
}
}
if($top === null || $top === true || ($top === 1 && $left === null)) {
// GET
@@ -324,9 +341,19 @@ class Pageimage extends Pagefile {
case 'focus':
$value = $this->focus();
break;
case 'focusStr':
$focus = $this->focus();
$value = "top=$focus[top]%,left=$focus[left]%,zoom=$focus[zoom]%" . ($focus['default'] ? " (default)" : "");
break;
case 'hasFocus':
$value = $this->focus(true);
break;
case 'suffix':
$value = $this->suffix();
break;
case 'suffixStr':
$value = implode(',', $this->suffix());
break;
default:
$value = parent::get($key);
}
@@ -1012,7 +1039,10 @@ class Pageimage extends Pagefile {
* #pw-group-variations
*
* @param array $options Optional, one or more options in an associative array of the following:
* - `info` (bool): when true, method returns variation info arrays rather than Pageimage objects
* - `info` (bool): when true, method returns variation info arrays rather than Pageimage objects (default=false).
* - `verbose` (bool): Return verbose array of info. If false, returns only filenames (default=true).
* This option does nothing unless the `info` option is true. Also note that if verbose is false, then all options
* following this one no longer apply (since it is no longer returning width/height info).
* - `width` (int): only variations with given width will be returned
* - `height` (int): only variations with given height will be returned
* - `width>=` (int): only variations with width greater than or equal to given will be returned
@@ -1028,14 +1058,25 @@ class Pageimage extends Pagefile {
if(!is_null($this->variations)) return $this->variations;
$variations = $this->wire(new Pageimages($this->pagefiles->page));
$defaults = array(
'info' => false,
'verbose' => true,
);
$options = array_merge($defaults, $options);
if(!$options['verbose'] && !$options['info']) $options['verbose'] = true; // non-verbose only allowed if info==true
$variations = $options['info'] ? null : $this->wire(new Pageimages($this->pagefiles->page));
$dir = new \DirectoryIterator($this->pagefiles->path);
$infos = array();
foreach($dir as $file) {
if($file->isDir() || $file->isDot()) continue;
$info = $this->isVariation($file->getFilename());
$info = $this->isVariation($file->getFilename(), array('verbose' => $options['verbose']));
if(!$info) continue;
if($options['info'] && !$options['verbose']) {
$infos[] = $info;
continue;
}
$allow = true;
if(count($options)) foreach($options as $option => $value) {
switch($option) {
@@ -1238,11 +1279,21 @@ class Pageimage extends Pagefile {
* #pw-group-variations
*
* @param string $basename Filename to check (basename, which excludes path)
* @param bool $allowSelf When true, it will return variation info even if same as current Pageimage.
* @return bool|array Returns false if not a variation, or array of info if it is.
* @param array|bool $options Array of options to modify behavior, or boolean to only specify `allowSelf` option.
* - `allowSelf` (bool): When true, it will return variation info even if same as current Pageimage. (default=false)
* - `verbose` (bool): Return verbose array of info? If false, just returns basename (string) or false. (default=true)
* @return bool|string|array Returns false if not a variation, or array (verbose) or string (non-verbose) of info if it is.
*
*/
public function ___isVariation($basename, $allowSelf = false) {
public function ___isVariation($basename, $options = array()) {
$defaults = array(
'allowSelf' => false,
'verbose' => true,
);
if(!is_array($options)) $options = array('allowSelf' => (bool) $options);
$options = array_merge($defaults, $options);
static $level = 0;
$variationName = basename($basename);
@@ -1264,11 +1315,14 @@ class Pageimage extends Pagefile {
}
// if file is the same as the original, then it's not a variation
if(!$allowSelf && $variationName == $this->basename) return false;
if(!$options['allowSelf'] && $variationName == $this->basename) return false;
// if file doesn't start with the original name then it's not a variation
if(strpos($variationName, $originalName) !== 0) return false;
// if not in verbose mode, just return variation file name
if(!$options['verbose']) return $variationName;
// get down to the meat and the base
// meat is the part of the filename containing variation info like dimensions, crop, suffix, etc.
// base is the part before that, which may include parent meat
@@ -1353,8 +1407,8 @@ class Pageimage extends Pagefile {
$actualInfo = $this->getImageInfo($info['path']);
$info['actualWidth'] = $actualInfo['width'];
$info['actualHeight'] = $actualInfo['height'];
$info['hidpiWidth'] = $this->hidpiWidth(0, $info['width']);
$info['hidpiHeight'] = $this->hidpiWidth(0, $info['height']);
$info['hidpiWidth'] = $this->hidpiWidth(0, $info['actualWidth']);
$info['hidpiHeight'] = $this->hidpiWidth(0, $info['actualHeight']);
if(empty($info['crop'])) {
// attempt to extract crop info from suffix
@@ -1485,5 +1539,35 @@ class Pageimage extends Pagefile {
}
}
/**
* Debug info
*
* @return array
*
*/
public function __debugInfo() {
static $depth = 0;
$depth++;
$info = parent::__debugInfo();
$info['width'] = $this->width();
$info['height'] = $this->height();
$info['suffix'] = $this->suffixStr;
if($this->hasFocus) $info['focus'] = $this->focusStr;
if(isset($info['filedata']) && isset($info['filedata']['focus'])) unset($info['filedata']['focus']);
if(empty($info['filedata'])) unset($info['filedata']);
$original = $this->original;
if($original && $original !== $this) $info['original'] = $original->basename;
if($depth < 2) {
$info['variations'] = array();
$variations = $this->getVariations(array('info' => true, 'verbose' => false));
foreach($variations as $name) {
$info['variations'][] = $name;
}
if(empty($info['variations'])) unset($info['variations']);
}
$depth--;
return $info;
}
}