= rex_i18n::msg('focuspoint_detail_header') ?>
mediatypes ) && is_array( $this->mediatypes ) )
-{
- $mediatypes = $this->mediatypes;
- array_walk( $mediatypes, function(&$t, $k) { $t = '
'.$t['label'].''; });
- $mediatypes = implode('',$mediatypes);
+if (isset($this->mediatypes) && \is_array($this->mediatypes)) {
+ $mediatypeList = $this->mediatypes;
+ array_walk($mediatypeList, static function (&$t, $k) {
+ $t = '
' . $t['label'] . '';
+ });
+ $mediatypes = implode('', $mediatypeList);
}
-if( isset( $this->fieldselect ) && is_array( $this->fieldselect ) )
-{
+if (isset($this->fieldselect) && \is_array($this->fieldselect)) {
$fieldselect = $this->fieldselect;
- array_walk( $fieldselect, function(&$v,$k) { $v = "
"; });
- $fieldselect = implode('',$fieldselect);
+ array_walk($fieldselect, static function (&$v, $k) {
+ $v = "
";
+ });
+ $fieldselect = implode('', $fieldselect);
?>
@@ -71,7 +82,7 @@
diff --git a/install.php b/install.php
index 3d494f1..6ba5c0b 100644
--- a/install.php
+++ b/install.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -19,12 +19,24 @@
*
* As well we have to cover that a field "med_focuspoint" might already exists from other sources
* with a different meta-type.
- *
- * @var rex_addon $this
*/
+namespace FriendsOfRedaxo\Focuspoint;
+
+use rex;
+use rex_addon;
+use rex_effect_abstract_focuspoint;
+use rex_i18n;
+use rex_metainfo_table_manager;
+use rex_sql;
+
+use function count;
+use function in_array;
+
+/** @var rex_addon $this */
+
// make addon-parameters available
-include_once ( 'lib/effect_focuspoint.php' );
+include_once 'lib/effect_focuspoint.php';
$successMsg = [];
$message = '';
@@ -52,51 +64,62 @@
// --- Metainfos analysieren -----------------------------------------------------------------------
-$qry = 'SELECT a.id,a.type_id,b.id AS tid,b.label AS tlabel FROM '.$db_metafield.' AS a LEFT JOIN '.$db_metatype.' AS b ON a.type_id=b.id WHERE a.name=:name';
-$meta_field = $sql->getArray( $qry, [':name' => rex_effect_abstract_focuspoint::MED_DEFAULT]);
-$meta_field_id = $meta_field ? $meta_field[0]['id'] : null;
-$meta_field_type = $meta_field ? $meta_field[0]['type_id'] : null;
-$meta_field_tid = $meta_field ? $meta_field[0]['tid'] : null;
-$meta_field_tlabel = $meta_field ? $meta_field[0]['tlabel'] : null;
+$qry = 'SELECT a.id,a.type_id,b.id AS tid,b.label AS tlabel FROM ' . $db_metafield . ' AS a LEFT JOIN ' . $db_metatype . ' AS b ON a.type_id=b.id WHERE a.name=:name';
+$meta_field = $sql->getArray($qry, [':name' => rex_effect_abstract_focuspoint::MED_DEFAULT]);
+if (0 < count($meta_field)) {
+ $meta_field_id = $meta_field[0]['id'];
+ $meta_field_type = $meta_field[0]['type_id'];
+ $meta_field_tid = $meta_field[0]['tid'];
+ $meta_field_tlabel = $meta_field[0]['tlabel'];
+} else {
+ $meta_field_id = null;
+ $meta_field_type = null;
+ $meta_field_tid = null;
+ $meta_field_tlabel = null;
+}
$qry = 'SELECT id FROM ' . $db_metatype . ' WHERE label=:label LIMIT 1';
-$meta_type = $sql->getArray( $qry, [':label' => rex_effect_abstract_focuspoint::META_FIELD_TYPE] );
-$meta_type_id = $meta_type ? $meta_type[0]['id'] : null;
+$meta_type = $sql->getArray($qry, [':label' => rex_effect_abstract_focuspoint::META_FIELD_TYPE]);
+if (0 < count($meta_type)) {
+ $meta_type_id = $meta_type[0]['id'];
+} else {
+ $meta_type_id = null;
+}
// Typ und Feld existieren. Die Typ-ID im Feld entspricht der Metatyp-Id
-if ( $meta_field_id && $meta_type_id && $meta_field_type === $meta_type_id ) {
+if (null !== $meta_field_id && null !== $meta_type_id && $meta_field_type === $meta_type_id) {
// ok, alles passt zusammen
}
// Typ und Feld existieren. Die Typ-ID im Feld verweist auf einen anderen Typ
-elseif ( $meta_field_id && $meta_type_id && $meta_field_type === $meta_field_tid ) {
+elseif (null !== $meta_field_id && null !== $meta_type_id && $meta_field_type === $meta_field_tid) {
// Das Metafeld hat den falschen Typ. Abbruch und Aufforderung zum Aufräumen
// Abbruch
- $message = '1 '.rex_i18n::msg( 'focuspoint_install_field_exists', rex_effect_abstract_focuspoint::MED_DEFAULT,rex_effect_abstract_focuspoint::META_FIELD_TYPE );
+ $message = '1 ' . rex_i18n::msg('focuspoint_install_field_exists', rex_effect_abstract_focuspoint::MED_DEFAULT, rex_effect_abstract_focuspoint::META_FIELD_TYPE);
}
// Typ und Feld existieren. Die Typ-ID im Feld verweist auf einen nicht existenten Typ
-elseif ( $meta_field_id && $meta_type_id && !$meta_field_tid ) {
+elseif (null !== $meta_field_id && null !== $meta_type_id && null === $meta_field_tid) {
// Feld ändern auf meta_type_id
$meta_action_connect = true;
}
// nur Typ existiert
-elseif ( $meta_type_id && !$meta_field_tid ) {
+elseif (null !== $meta_type_id && null === $meta_field_tid) {
// Feld auf den Typ anlegen
$meta_action_field = true;
$meta_action_connect = true;
}
// nur Feld existiert und verweist auf einen existenten Typ
-elseif ( $meta_field_id && $meta_field_tid ) {
+elseif (null !== $meta_field_id && null !== $meta_field_tid) {
// Das Metafeld hat den falschen Typ. Abbruch und Aufforderung zum Aufräumen
// Abbruch
- $message = '2 '.rex_i18n::msg( 'focuspoint_install_field_exists', rex_effect_abstract_focuspoint::MED_DEFAULT,rex_effect_abstract_focuspoint::META_FIELD_TYPE );
+ $message = '2 ' . rex_i18n::msg('focuspoint_install_field_exists', rex_effect_abstract_focuspoint::MED_DEFAULT, rex_effect_abstract_focuspoint::META_FIELD_TYPE);
}
// nur Feld existiert und verweist auf einen nicht existenten Typ
-elseif ( $meta_field_id ) {
+elseif (null !== $meta_field_id) {
// Typ anlegen und mit dem Feld verbinden
$meta_action_type = true;
$meta_action_connect = true;
@@ -110,104 +133,127 @@
}
// Für das Metafeld besteht die Abhängigkeit zur zugehörigen Spalte in rex_media
-$sql->setQuery('SELECT * FROM '.$db_media.' LIMIT 1');
-$media_feld = in_array(rex_effect_abstract_focuspoint::MED_DEFAULT, $sql->getFieldnames());
+$sql->setQuery('SELECT * FROM ' . $db_media . ' LIMIT 1');
+$media_feld = in_array(rex_effect_abstract_focuspoint::MED_DEFAULT, $sql->getFieldnames(), true);
// Metafeld existiert in rex_metainfo_field, aber die Spalte in rex_media fehlt
-if ( !$meta_action_field && !$media_feld ) {
+if (!$meta_action_field && !$media_feld) {
$meta_action_media = true;
}
// Metafeld existiert nicht in rex_metainfo_field, aber die Spalte in rex_media ist existent
-elseif ( $meta_action_field && $media_feld ){
+elseif ($meta_action_field && $media_feld) {
// Da die Spalte wichtige Informationen enthalten könnte: Meldung und Abbruch
- $message = rex_i18n::msg( 'focuspoint_install_media_exists', rex_effect_abstract_focuspoint::MED_DEFAULT,$db_media );
+ $message = rex_i18n::msg('focuspoint_install_media_exists', rex_effect_abstract_focuspoint::MED_DEFAULT, $db_media);
}
-
// --- Media-Manager-Einträge analysieren ----------------------------------------------------------
-$qry = 'SELECT a.id,b.type_id from '.$db_mmtype.' AS a LEFT JOIN '.$db_mmeffect.' AS b ON a.id = b.type_id WHERE a.name=:name LIMIT 1';
-$mm_type = $sql->getArray( $qry, [':name' => rex_effect_abstract_focuspoint::MM_TYPE]);
+$qry = 'SELECT a.id,b.type_id from ' . $db_mmtype . ' AS a LEFT JOIN ' . $db_mmeffect . ' AS b ON a.id = b.type_id WHERE a.name=:name LIMIT 1';
+$mm_type = $sql->getArray($qry, [':name' => rex_effect_abstract_focuspoint::MM_TYPE]);
$mm_action_type = null === ($mm_type[0]['id'] ?? null);
$mm_action_effect = null === ($mm_type[0]['type_id'] ?? null);
-
// --- Metainfos anlegen ---------------------------------------------------------------------------
// Die fehlenden Elemente sind vorab ermittelt. Fehler z.B. durch doppelte Kennungen sollten also
// nicht auftreten. Das Restrisiko einer unvollständigen Installation mit Restanten ist minimal.
// Fehlende Elemente werden ergänzt
-if( $meta_action_type && !$message ) {
+if ('' < $meta_action_type && '' === $message) {
$result = rex_metainfo_add_field_type(rex_effect_abstract_focuspoint::META_FIELD_TYPE, 'varchar', 20);
- if( is_numeric($result) ) {
- $meta_type_id = $result;
+ if (is_numeric($result)) {
+ $meta_type_id = (int) $result;
$meta_action_connect = true;
- $successMsg[] = rex_i18n::msg( 'focuspoint_install_type_ok', rex_effect_abstract_focuspoint::META_FIELD_TYPE );
+ $successMsg[] = rex_i18n::msg('focuspoint_install_type_ok', rex_effect_abstract_focuspoint::META_FIELD_TYPE);
} else {
- $message = rex_i18n::rawMsg( 'focuspoint_install_type_error', rex_effect_abstract_focuspoint::META_FIELD_TYPE, "$$result" );
+ $message = rex_i18n::rawMsg('focuspoint_install_type_error', rex_effect_abstract_focuspoint::META_FIELD_TYPE, "$$result");
}
}
-if( $meta_action_field && !$message ) {
+if ($meta_action_field && '' === $message) {
$result = rex_metainfo_add_field('translate:focuspoint_field_label', rex_effect_abstract_focuspoint::MED_DEFAULT, 0, '', $meta_type_id, '', '', '', '');
- if( true === $result ) {
- $successMsg[] = rex_i18n::msg( 'focuspoint_install_field_ok', rex_effect_abstract_focuspoint::MED_DEFAULT );
+ if (true === $result) {
+ $successMsg[] = rex_i18n::msg('focuspoint_install_field_ok', rex_effect_abstract_focuspoint::MED_DEFAULT);
$meta_action_connect = false; // impliziet beim Anlegen durchgeführt
$meta_action_media = false; // impliziet beim Anlegen durchgeführt
} else {
- $message = rex_i18n::rawMsg( 'focuspoint_install_field_error', rex_effect_abstract_focuspoint::MED_DEFAULT, "$result" );
+ $message = rex_i18n::rawMsg('focuspoint_install_field_error', rex_effect_abstract_focuspoint::MED_DEFAULT, "$result");
}
}
-if( $meta_action_media && !$message ) {
+if ($meta_action_media && '' === $message) {
$tableManager = new rex_metainfo_table_manager('rex_media');
- if ( $tableManager->addColumn(rex_effect_abstract_focuspoint::MED_DEFAULT, 'varchar', 20, '') ) {
- $successMsg[] = rex_i18n::msg( 'focuspoint_install_media_ok', rex_effect_abstract_focuspoint::MED_DEFAULT, $db_media );
+ if ($tableManager->addColumn(rex_effect_abstract_focuspoint::MED_DEFAULT, 'varchar', 20, '')) {
+ $successMsg[] = rex_i18n::msg('focuspoint_install_media_ok', rex_effect_abstract_focuspoint::MED_DEFAULT, $db_media);
} else {
- $message = rex_i18n::rawMsg( 'focuspoint_install_media_error', rex_effect_abstract_focuspoint::MED_DEFAULT, $db_media );
+ $message = rex_i18n::rawMsg('focuspoint_install_media_error', rex_effect_abstract_focuspoint::MED_DEFAULT, $db_media);
}
}
-if( $meta_action_connect && !$message ) {
- $sql->setTable( $db_metafield );
- $sql->setValue( 'type_id', $meta_type_id );
- $sql->setWhere( 'name=:name', [':name'=>rex_effect_abstract_focuspoint::MED_DEFAULT] );
+if ($meta_action_connect && '' === $message) {
+ $sql->setTable($db_metafield);
+ /**
+ * STAN: Value 'type_id' does not exist in table selected via setTable().
+ * Falsch. rex_metainfo_field.type_id ist ein Standardfeld.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('type_id', $meta_type_id);
+ $sql->setWhere('name=:name', [':name' => rex_effect_abstract_focuspoint::MED_DEFAULT]);
$sql->update();
- $successMsg[] = rex_i18n::msg( 'focuspoint_install_link_ok', rex_effect_abstract_focuspoint::META_FIELD_TYPE, rex_effect_abstract_focuspoint::MED_DEFAULT );
+ $successMsg[] = rex_i18n::msg('focuspoint_install_link_ok', rex_effect_abstract_focuspoint::META_FIELD_TYPE, rex_effect_abstract_focuspoint::MED_DEFAULT);
}
// --- Media-Manager-Einträge anlegen --------------------------------------------------------------
-if ( $mm_action_type && !$message ) {
- $sql->setTable( $db_mmtype );
- $sql->setValue( 'name', rex_effect_abstract_focuspoint::MM_TYPE );
+if ($mm_action_type && '' === $message) {
+ $sql->setTable($db_mmtype);
+ /**
+ * STAN: Value 'name' does not exist in table selected via setTable().
+ * Falsch. media_manager_type.name ist ein Standardfeld.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('name', rex_effect_abstract_focuspoint::MM_TYPE);
$sql->addGlobalCreateFields();
$sql->addGlobalUpdateFields();
$sql->insert();
$mm_type_id = $sql->getLastId();
$mm_action_effect = true;
- $successMsg[] = rex_i18n::msg( 'focuspoint_install_mmtype_ok', rex_effect_abstract_focuspoint::MM_TYPE );
+ $successMsg[] = rex_i18n::msg('focuspoint_install_mmtype_ok', rex_effect_abstract_focuspoint::MM_TYPE);
}
-if ( $mm_action_effect && !$message ) {
- $sql->setTable( $db_mmeffect );
- // Auch wenn rexstan hier meckert, ist es passed so.
- // @phpstan-ignore-next-line
- $sql->setValue( 'type_id', $mm_type_id );
- $sql->setValue( 'effect', 'resize' );
- $sql->setValue( 'parameters', '{"rex_effect_resize":{"rex_effect_resize_width":"1024","rex_effect_resize_height":"1024","rex_effect_resize_style":"maximum","rex_effect_resize_allow_enlarge":"enlarge"}}' );
+if ($mm_action_effect && '' === $message) {
+ $sql->setTable($db_mmeffect);
+ /**
+ * STAN: Variable $mm_type_id might not be defined.
+ * Auch wenn rexstan hier meckert, ich halte es für passend.
+ * STAN: Value 'type_id' does not exist in table selected via setTable().
+ * Falsch. media_manager_type_effect.type_id ist ein Standardfeld.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('type_id', $mm_type_id);
+ /**
+ * STAN: Value 'effect' does not exist in table selected via setTable().
+ * Falsch. media_manager_type_effect.effect ist ein Standardfeld.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('effect', 'resize');
+ /**
+ * STAN: Value 'parameters' does not exist in table selected via setTable().
+ * Falsch. media_manager_type_effect.parameters ist ein Standardfeld.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('parameters', '{"rex_effect_resize":{"rex_effect_resize_width":"1024","rex_effect_resize_height":"1024","rex_effect_resize_style":"maximum","rex_effect_resize_allow_enlarge":"enlarge"}}');
$sql->addGlobalUpdateFields();
$sql->addGlobalCreateFields();
$sql->insert();
- $successMsg[] = rex_i18n::msg( 'focuspoint_install_mmeffect_ok', rex_effect_abstract_focuspoint::MM_TYPE );
+ $successMsg[] = rex_i18n::msg('focuspoint_install_mmeffect_ok', rex_effect_abstract_focuspoint::MM_TYPE);
}
// Fehlermeldung übertragen; Abbruch
-if( $message ) {
- $this->setProperty('installmsg', $message );
+if ('' < $message) {
+ $this->setProperty('installmsg', $message);
return;
}
-if( $successMsg ) {
- $this->setProperty('successmsg', '- '.implode('
- ',$successMsg).'
' );
+if (0 < count($successMsg)) {
+ $this->setProperty('successmsg', '- ' . implode('
- ', $successMsg) . '
');
}
diff --git a/lib/effect_focuspoint.php b/lib/effect_focuspoint.php
index 9ed5114..4981812 100644
--- a/lib/effect_focuspoint.php
+++ b/lib/effect_focuspoint.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -18,24 +18,26 @@
*
* Eigene Fokuspunkt-Effekte sollten unbedingt hiervon abgeleitet werden, nie direkt von
* "rex_effect_abstract"!
- *
*/
+use FriendsOfRedaxo\Focuspoint\focuspoint_media;
+
+/** @api */
abstract class rex_effect_abstract_focuspoint extends rex_effect_abstract
{
- const URL_KEY = 'xy';
- const MM_TYPE = 'focuspoint_media_detail';
- const MED_DEFAULT = 'med_focuspoint';
- const META_FIELD_TYPE = 'Focuspoint (AddOn)';
- const HTML_PATTERN = '^(100|[1-9]?[0-9])\.[0-9],(100|[1-9]?[0-9])\.[0-9]$';
- const PATTERN = '/^(?(100|[1-9]?\d)\.\d),(?(100|[1-9]?\d)\.\d)$/';
- const STRING = '%3.1F,%3.1F';
+ public const URL_KEY = 'xy';
+ public const MM_TYPE = 'focuspoint_media_detail';
+ public const MED_DEFAULT = 'med_focuspoint';
+ public const META_FIELD_TYPE = 'Focuspoint (AddOn)';
+ public const HTML_PATTERN = '^(100|[1-9]?[0-9])\.[0-9],(100|[1-9]?[0-9])\.[0-9]$';
+ public const PATTERN = '/^(?(100|[1-9]?\d)\.\d),(?(100|[1-9]?\d)\.\d)$/';
+ public const STRING = '%3.1F,%3.1F';
/** @var array */
- static $mitte = [50,50];
-
+ public static $mitte = [50, 50];
+
/** @var array */
- static $internalEffects = [ 'focuspoint_fit', 'focuspoint_resize' ];
+ public static $internalEffects = ['focuspoint_fit', 'focuspoint_resize'];
/**
* Wandelt einen Fokuspunkt-Koordinaten-String in eine numerische Darstellung um.
@@ -43,23 +45,24 @@ abstract class rex_effect_abstract_focuspoint extends rex_effect_abstract
* Ist der Parameter $wh angegeben, werden die Koordinaten in absolute Werte umgerechnet.
*
* @param string $xy Zeichenkette mit dem Koordinaten-Paar ("12.3,34.5")
- * @param array $wh Array [breite,höhe] mit den Referenzwerten, auf die sich
- * die Prozentwerte der Koordinaten beziehen.
+ * @param array $wh array [breite,höhe] mit den Referenzwerten, auf die sich
+ * die Prozentwerte der Koordinaten beziehen
*
- * @return array|bool [x,y] als Koordinaten-Array oder false für ungültiger String
+ * @return array|false [x,y] als Koordinaten-Array oder false für ungültiger String
*/
- static public function str2fp( string $xy, array $wh=null )
+ public static function str2fp(string $xy, ?array $wh = null)
{
- if( $i = preg_match_all( self::PATTERN, (string)$xy, $tags ) )
- {
- $xy = [ min( 100, max( 0, $tags['x'][0] ) ), min( 100, max( 0, $tags['y'][0] ) ) ];
- if( $wh ) $xy = self::rel2px( $xy, $wh );
+ $i = preg_match_all(self::PATTERN, $xy, $tags);
+ if (0 < $i) {
+ $xy = [min(100, max(0, $tags['x'][0])), min(100, max(0, $tags['y'][0]))];
+ if (is_array($wh)) {
+ $xy = self::rel2px($xy, $wh);
+ }
return $xy;
}
return false;
}
-
/**
* rechnet relative Fokuspunkt-Koordinaten in absolute um.
*
@@ -68,15 +71,15 @@ static public function str2fp( string $xy, array $wh=null )
*
* @return array [x,y] als absolute Werte der Fokuspunkt-Koordinate
*/
- static public function rel2px( array $xy, array $wh )
+ public static function rel2px(array $xy, array $wh)
{
- $xy[0] = (int) round( ($wh[0]-1) * $xy[0] / 100 ) ;
- $xy[1] = (int) round( ($wh[1]-1) * $xy[1] / 100 );
+ $xy[0] = (int) round(($wh[0] - 1) * $xy[0] / 100);
+ $xy[1] = (int) round(($wh[1] - 1) * $xy[1] / 100);
return $xy;
}
/**
- * Ermittelt den "Default-Fokus"
+ * Ermittelt den "Default-Fokus".
*
* Basis ist das Feld 'focus' in dem der Defaultwert für den Effekt konfiguriert ist
* Sollt das Feld leer sein oder ungültig, wird der angegebene $default herangezogen.
@@ -87,19 +90,20 @@ static public function rel2px( array $xy, array $wh )
*
* @return array [x,y] als Koordinaten-Array
*/
- public function getDefaultFocus( array $default=null, array $wh=null )
+ public function getDefaultFocus(?array $default = null, ?array $wh = null)
{
- $xy = self::str2fp( $this->params['focus'] );
- if( !$xy ) {
- $xy = $default === null ? self::$mitte : $default;
+ $xy = self::str2fp($this->params['focus']);
+ if (false === $xy) {
+ $xy = null === $default ? self::$mitte : $default;
+ }
+ if (null !== $wh) {
+ $xy = self::rel2px($xy, $wh);
}
- if( $wh ) $xy = self::rel2px( $xy, $wh );
return $xy;
}
-
/**
- * Ermittelt das relevante Fokuspunkt-Meta-Feld für den Effekt
+ * Ermittelt das relevante Fokuspunkt-Meta-Feld für den Effekt.
*
* Das Feld 'meta' des Efektes enthält den Namen des Fokuspunkt-Meta-Feldes.
* steht er auf 'defaut', ist kein Meta-Feld ausgewählt.
@@ -108,12 +112,11 @@ public function getDefaultFocus( array $default=null, array $wh=null )
*/
public function getMetaField()
{
- return str_starts_with($this->params['meta'],'default ') ? '' : $this->params['meta'];
+ return str_starts_with($this->params['meta'], 'default ') ? '' : $this->params['meta'];
}
-
/**
- * Ermittelt die im Effekt anzuwendenden Fokuspunkt-Koordinaten
+ * Ermittelt die im Effekt anzuwendenden Fokuspunkt-Koordinaten.
*
* Vorgeschaltet ist die Auswertung der URL. Über den REX_API_CALL "focuspoint"
* können ebenfalls bearbeitete Bilder erzeugt werden. Die Fokuspunkt-Effekte
@@ -124,31 +127,30 @@ public function getMetaField()
* @param focuspoint_media $media Media-Objekt oder null
* @param array $default Default-Koordinaten falls auf anderem Wege keine
* gültigen Koordinaten ermittelt werden können
- * @param array $wh Array [breite,höhe] mit den Referenzwerten, auf die
- * sich die Prozentwerte der Koordinaten beziehen.
+ * @param array $wh array [breite,höhe] mit den Referenzwerten, auf die
+ * sich die Prozentwerte der Koordinaten beziehen
*
* @return array [x,y] als Koordinaten-Array
*/
- function getFocus( $media=null, array $default=null, array $wh=null )
+ public function getFocus($media = null, ?array $default = null, ?array $wh = null)
{
- if( $xy = rex_request( self::URL_KEY, 'string', null) )
- {
- // nur relevant für temporäre Bilder; funktioniert nicht mit Cache!
- // hier eingebaut zur Funktionsfähigkeit von focuspoint_api
- $fp = self::str2fp( $xy );
- if( !$fp ) {
- $fp = $media !== null && is_a($media,'focuspoint_media')
- ? $media->getFocus( $xy, $default ) // $xy = Meta-Feld-Name??
- : $this->getDefaultFocus( $default );
- }
- } else {
- // Standard
- $fp = $media !== null && is_a($media,'focuspoint_media')
- ? $media->getFocus( $this->getMetaField(), $default )
- : $this->getDefaultFocus( $default );
- }
- return $wh ? self::rel2px( $fp,$wh ) : $fp;
-
+ $xy = rex_request(self::URL_KEY, 'string', null);
+ if (is_string($xy)) {
+ // nur relevant für temporäre Bilder; funktioniert nicht mit Cache!
+ // hier eingebaut zur Funktionsfähigkeit von focuspoint_api
+ $fp = self::str2fp($xy);
+ if (false === $fp) {
+ $fp = null !== $media && is_a($media, 'focuspoint_media')
+ ? $media->getFocus($xy, $default) // $xy = Meta-Feld-Name??
+ : $this->getDefaultFocus($default);
+ }
+ } else {
+ // Standard
+ $fp = null !== $media && is_a($media, 'focuspoint_media')
+ ? $media->getFocus($this->getMetaField(), $default)
+ : $this->getDefaultFocus($default);
+ }
+ return is_array($wh) && 2 === count($wh) ? self::rel2px($fp, $wh) : $fp;
}
/**
@@ -158,16 +160,24 @@ function getFocus( $media=null, array $default=null, array $wh=null )
* * Auswahl des genutzten Meta-Feldes oder "default" für "Default-Koordinaten"
* * Eingabefeld für die Default-Koordinaten
*
- * @return array Felddefinitionen
+ * @return list
+ *
+ * Ursprünglich war die Meldung "Return type (array) of method rex_effect_abstract_focuspoint::getParams() should be covariant with return type (....) of method rex_effect_abstract::getParams()"
+ * Daher obige @ return aus rex_effect_abstract::getParams() kopiert und hier eingefügt. Das ergibt nun 2 x diese Meldung:
+ * STAN: Method rex_effect_abstract_focuspoint::getParams() return type has no value type specified in iterable type array.
+ * Hängt vermutlich mit "attributes?: array, options?: array" zusammen. Das ignorieren wir also ...
+ * @phpstan-ignore-next-line
*/
public function getParams()
{
-
- $qry = 'SELECT id,name FROM '.rex::getTable('metainfo_field').' WHERE type_id=(SELECT id FROM '.rex::getTable('metainfo_type').' WHERE label="'.self::META_FIELD_TYPE.'" LIMIT 1) AND name LIKE "med_%" ORDER BY name ASC';
- $felder = rex_sql::factory()->getArray( $qry, [], PDO::FETCH_KEY_PAIR );
- $felder[] = 'default => '.rex_i18n::msg('focuspoint_edit_label_focus');
+ $qry = 'SELECT id,name FROM ' . rex::getTable('metainfo_field') . ' WHERE type_id=(SELECT id FROM ' . rex::getTable('metainfo_type') . ' WHERE label="' . self::META_FIELD_TYPE . '" LIMIT 1) AND name LIKE "med_%" ORDER BY name ASC';
+ $felder = rex_sql::factory()->getArray($qry, [], PDO::FETCH_KEY_PAIR);
+ $felder[] = 'default => ' . rex_i18n::msg('focuspoint_edit_label_focus');
+ array_walk($felder, 'strtolower');
$default = current($felder);
- if( ($k = array_search(self::MED_DEFAULT,$felder)) !== false ) $default = $felder[$k];
+ if (($k = array_search(self::MED_DEFAULT, $felder, true)) !== false) {
+ $default = $felder[$k];
+ }
return [
[
'label' => rex_i18n::msg('focuspoint_edit_label_meta'),
@@ -180,11 +190,10 @@ public function getParams()
'label' => rex_i18n::msg('focuspoint_edit_label_focus'),
'name' => 'focus',
'type' => 'string',
- 'attributes' => [ 'pattern' => self::HTML_PATTERN ],
+ 'attributes' => ['pattern' => self::HTML_PATTERN],
'notice' => 'x,y: 0.0,0.0 ... 100.0,100.0',
-# 'default' => sprintf( self::STRING, self::$mitte[0], self::$mitte[1]),
+ // 'default' => sprintf( self::STRING, self::$mitte[0], self::$mitte[1]),
],
];
}
-
}
diff --git a/lib/effect_focuspoint_fit.php b/lib/effect_focuspoint_fit.php
index 718b157..e5b7c1c 100644
--- a/lib/effect_focuspoint_fit.php
+++ b/lib/effect_focuspoint_fit.php
@@ -4,7 +4,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.4
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -43,190 +43,195 @@
* erster Buchstabe ist die Grafik: Quelle (s), Ziel (d), Ausschnitt (c), Fokuspunkt der Quelle (f)
* zweiter Buchstabe ist die Verwendung: Offset (x bzw. y), Höhe (h), Breite (w), AspectRatio (r)
* Beispiel: $dw, $dh, $dr
- *
*/
+use FriendsOfRedaxo\Focuspoint\focuspoint_media;
-
+/** @api */
class rex_effect_focuspoint_fit extends rex_effect_abstract_focuspoint
{
- /** @var array */
- private $optionsZoom = ['0%','25%', '50%', '75%','100%'];
- /** @var integer */
+ public const PATTERN = '^([1-9]\d*\s*(px)?|(100|[1-9]?\d)(\.\d)?\s*%|[1-9]\d*\s*fr)$';
+ /** @var array */
+ private $optionsZoom = ['0%', '25%', '50%', '75%', '100%'];
+ /** @var int */
private $targetByAR;
- const PATTERN = '^([1-9]\d*\s*(px)?|(100|[1-9]?\d)(\.\d)?\s*%|[1-9]\d*\s*fr)$';
-
/**
- * Gibt den Namen des MM-Effektes zurück
+ * Gibt den Namen des MM-Effektes zurück.
*
* @return string Effekt-Name
*/
- public function getName()
- {
- return rex_i18n::msg('focuspoint_effect_fit');
- }
+ public function getName()
+ {
+ return rex_i18n::msg('focuspoint_effect_fit');
+ }
/**
- * Erzeugt den Bildeffekt gemäß der obigen Beschreibung
+ * Erzeugt den Bildeffekt gemäß der obigen Beschreibung.
*
* @return void
*/
public function execute()
{
- /*
- Bilddaten
- */
- $this->media->asImage();
- $gdimage = $this->media->getImage();
- $sw = $this->media->getWidth();
- $sh = $this->media->getHeight();
- $sr = $sw / $sh;
+ /*
+ Bilddaten
+ */
+ $this->media->asImage();
+ $gdimage = $this->media->getImage();
+ $sw = $this->media->getWidth();
+ $sh = $this->media->getHeight();
+ $sr = $sw / $sh;
- /*
- Fokuspunkt ermitteln:
- zuerst den Fallback-Wert bzw. Default-Wert des Effekts
- dann den FP des Bildes.
- Umrechnen in absolute Bildkoordinaten (Pixel)
- */
- list( $fx,$fy ) = $this->getFocus( focuspoint_media::get( $this->media->getMediaFilename() ), $this->getDefaultFocus( ), [$sw,$sh] );
+ /*
+ Fokuspunkt ermitteln:
+ zuerst den Fallback-Wert bzw. Default-Wert des Effekts
+ dann den FP des Bildes.
+ Umrechnen in absolute Bildkoordinaten (Pixel)
+ */
+ [$fx, $fy] = $this->getFocus(focuspoint_media::get($this->media->getMediaFilename()), $this->getDefaultFocus(), [$sw, $sh]);
- /*--------------------------
+ /*--------------------------
- Parameter überprüfen und ungültige Werte korrigieren
+ Parameter überprüfen und ungültige Werte korrigieren
- Zielhöhe und/oder Zielbreite müssen angegeben sein. Akzeptiert werden Zahlen und
- Zahlen mit %, px und fr.
- Ungültige Werte führen zum Abbruch
- 1111 => Größe in Pixel,
- 1111px => Größe in Pixel
- 11% => % der Originalgröße
- 11fr => "Anteil/fraction" zur Eingabe von Aspect-Ratios des Zielbildes.
- Ungültige Werte und Wert-Kombinationen führen zum Abbruch
- Im Fall "fr" müssen beide Werte vom Typ fr sein. 0 oder 2.
- */
- $this->targetByAR = 0;
- $dw = $this->decodeSize( $this->params['width'],$sw );
- $dh = $this->decodeSize( $this->params['height'],$sh );
- if ( empty($dw) && empty($dh) ) return;
- // Auch wenn rexstan hier meckert, aber es stimmt so: decodeSize incrmentiert targetByAR
- // @phpstan-ignore-next-line
- if ( $this->targetByAR == 1 ) return;
-
- /*
- Den Zoom-Faktor auslesen und setzen
- Entweder soll nur der Auschnitt genommen werden (0%) oder möglichst viel vom
- Rest (best fit=100%) oder eben eine der Zwischenstufen 25,50 oder 75%.
- Falls Breite/Höhe als AspectRatio (fr) angegeben wurden: immer 100%
- */
- switch ( $this->params['zoom'] )
- {
- case $this->optionsZoom[1]: $zoom = 0.25; break;
- case $this->optionsZoom[2]: $zoom = 0.5; break;
- case $this->optionsZoom[3]: $zoom = 0.75; break;
- case $this->optionsZoom[4]: $zoom = 1; break;
- default: $zoom = 0;
- }
+ Zielhöhe und/oder Zielbreite müssen angegeben sein. Akzeptiert werden Zahlen und
+ Zahlen mit %, px und fr.
+ Ungültige Werte führen zum Abbruch
+ 1111 => Größe in Pixel,
+ 1111px => Größe in Pixel
+ 11% => % der Originalgröße
+ 11fr => "Anteil/fraction" zur Eingabe von Aspect-Ratios des Zielbildes.
+ Ungültige Werte und Wert-Kombinationen führen zum Abbruch
+ Im Fall "fr" müssen beide Werte vom Typ fr sein. 0 oder 2.
+ */
+ $this->targetByAR = 0;
+ $dw = $this->decodeSize($this->params['width'], $sw);
+ $dh = $this->decodeSize($this->params['height'], $sh);
+ if (null === $dw && null === $dh) {
+ return;
+ }
+ // STAN: Strict comparison using === between 1 and 0 will always evaluate to false.
+ // Auch wenn rexstan hier meckert, aber es stimmt so: decodeSize incrementiert targetByAR
+ // @phpstan-ignore-next-line
+ if (1 === $this->targetByAR) {
+ return;
+ }
- /*--------------------------
- An die Arbeit ... :
+ /*
+ Den Zoom-Faktor auslesen und setzen
+ Entweder soll nur der Auschnitt genommen werden (0%) oder möglichst viel vom
+ Rest (best fit=100%) oder eben eine der Zwischenstufen 25,50 oder 75%.
+ Falls Breite/Höhe als AspectRatio (fr) angegeben wurden: immer 100%
+ */
+ switch ($this->params['zoom']) {
+ case $this->optionsZoom[1]: $zoom = 0.25;
+ break;
+ case $this->optionsZoom[2]: $zoom = 0.5;
+ break;
+ case $this->optionsZoom[3]: $zoom = 0.75;
+ break;
+ case $this->optionsZoom[4]: $zoom = 1;
+ break;
+ default: $zoom = 0;
+ }
- Das Zielformat bestimmen:
+ /*--------------------------
+ An die Arbeit ... :
- Breite x Höhe angegeben => wie angegeben nehmen
- Nur Breite angegeben => Höhe über den AspectRatio des Originals bestimmen
- Nur Höhe angegeben => Breite über den AspectRatio des Originals bestimmen
- */
- $dw = empty( $dw ) ? $dh * $sr : $dw;
- $dh = empty( $dh ) ? $dw / $sr : $dh;
- $dr = $dw / $dh;
- $too_wide = ( $sr >= $dr );
+ Das Zielformat bestimmen:
- /*
- Im Fall, dass die Bildgröße via AspectRatio angegeben wird, wie z.B. mit Breite 16fr
- und Höhe 9fr, was 16:9 entspricht), muss das Zielformat auf die Bildgröße
- geändert werden. Zoom ist dann irrelevant.
- */
- // Auch wenn rexstan hier meckert, aber es stimmt so: decodeSize incrmentiert targetByAR
- // @phpstan-ignore-next-line
- if ( $this->targetByAR == 2)
- {
- $dw = $too_wide ? floor($sh * $dr) : $sw;
- $dh = $too_wide ? $sh : floor($sw / $dr);
- $zoom = 0;
- }
- /*
- Den Ausschnitt festlegen - Basisgröße
+ Breite x Höhe angegeben => wie angegeben nehmen
+ Nur Breite angegeben => Höhe über den AspectRatio des Originals bestimmen
+ Nur Höhe angegeben => Breite über den AspectRatio des Originals bestimmen
+ */
+ $dw = null === $dw ? $dh * $sr : $dw;
+ $dh = null === $dh ? $dw / $sr : $dh;
+ $dr = $dw / $dh;
+ $too_wide = ($sr >= $dr);
- Das Zielformat und das Auschnittsformat ist identisch. Aber beide Dimensionen dürfen
- nicht größer sein als die Bildgröße. Ist eine Dimension zu klein wird das
- Ausschnittsformat entsprechend reduziert.
- (anders gesagt: das Bild wird vergrößert)
- */
- $cw = $dw;
- $ch = $dh;
- if ( $sw < $cw || $sh < $ch )
- {
- $scale = ( $too_wide ? $sh/$dh : $sw/$dw );
- $cw = floor( $cw * $scale );
- $ch = floor( $ch * $scale );
- }
- /*
- Den Ausschnitt festlegen - Zoomen
+ /*
+ Im Fall, dass die Bildgröße via AspectRatio angegeben wird, wie z.B. mit Breite 16fr
+ und Höhe 9fr, was 16:9 entspricht), muss das Zielformat auf die Bildgröße
+ geändert werden. Zoom ist dann irrelevant.
+ */
+ // STAN: Strict comparison using === between 2 and 0 will always evaluate to false.
+ // Auch wenn rexstan hier meckert, aber es stimmt so: decodeSize incrementiert targetByAR
+ // @phpstan-ignore-next-line
+ if (2 === $this->targetByAR) {
+ $dw = $too_wide ? floor($sh * $dr) : $sw;
+ $dh = $too_wide ? $sh : floor($sw / $dr);
+ $zoom = 0;
+ }
+ /*
+ Den Ausschnitt festlegen - Basisgröße
- Grade wenn große Bilder auf einen kleinen Ausschnitt treffen, wäre ein Zoom
- sinnvoll. Der Zoom-Faktor sagt, wieviel % vom Abstand zwischen Originalbild und
- Ausschnitt mit hineingenooen werden sollen. Faktisch wird der Ausschnitt um einen
- entsprechenden Faktor vergrößert.
- */
- if ( $zoom )
- {
- $faktor = $too_wide ? (($sh-$ch) * $zoom + $ch) / $ch : (($sw-$cw) * $zoom + $cw) / $cw;
- $cw = floor( $cw * $faktor );
- $ch = floor( $ch * $faktor );
- }
- /*
- Den Bildauschnitt positionieren:
+ Das Zielformat und das Auschnittsformat ist identisch. Aber beide Dimensionen dürfen
+ nicht größer sein als die Bildgröße. Ist eine Dimension zu klein wird das
+ Ausschnittsformat entsprechend reduziert.
+ (anders gesagt: das Bild wird vergrößert)
+ */
+ $cw = $dw;
+ $ch = $dh;
+ if ($sw < $cw || $sh < $ch) {
+ $scale = ($too_wide ? $sh / $dh : $sw / $dw);
+ $cw = floor($cw * $scale);
+ $ch = floor($ch * $scale);
+ }
+ /*
+ Den Ausschnitt festlegen - Zoomen
- Der Bildausschnitt wird so gelegt, dass der Fokuspunkt in der Mitte liegt.
- Falls dann der Ausschnitt irgendwo über die Ränder ragt, wird er in das Bild
- zurückgeschoben. Der Fokuspunkt ist dann natürlich nicht mehr in der Mitte.
- Das Ergebnis ist die Offset-Position des Auschnitts im Originalbild.
- */
- $cx = $fx - floor( $cw/2 );
- $cy = $fy - floor( $ch/2 );
- $cx = min( $sw-$cw, max( 0,$cx ) );
- $cy = min( $sh-$ch, max( 0,$cy ) );
+ Grade wenn große Bilder auf einen kleinen Ausschnitt treffen, wäre ein Zoom
+ sinnvoll. Der Zoom-Faktor sagt, wieviel % vom Abstand zwischen Originalbild und
+ Ausschnitt mit hineingenooen werden sollen. Faktisch wird der Ausschnitt um einen
+ entsprechenden Faktor vergrößert.
+ */
+ if (0 < $zoom) {
+ $faktor = $too_wide ? (($sh - $ch) * $zoom + $ch) / $ch : (($sw - $cw) * $zoom + $cw) / $cw;
+ $cw = floor($cw * $faktor);
+ $ch = floor($ch * $faktor);
+ }
+ /*
+ Den Bildauschnitt positionieren:
- /*--------------------------
+ Der Bildausschnitt wird so gelegt, dass der Fokuspunkt in der Mitte liegt.
+ Falls dann der Ausschnitt irgendwo über die Ränder ragt, wird er in das Bild
+ zurückgeschoben. Der Fokuspunkt ist dann natürlich nicht mehr in der Mitte.
+ Das Ergebnis ist die Offset-Position des Auschnitts im Originalbild.
+ */
+ $cx = $fx - floor($cw / 2);
+ $cy = $fy - floor($ch / 2);
+ $cx = min($sw - $cw, max(0, $cx));
+ $cy = min($sh - $ch, max(0, $cy));
- Ausgabe der Grafik
- */
- if (function_exists('ImageCreateTrueColor')) {
- $des = @imagecreatetruecolor($dw, $dh);
- } else {
- $des = @imagecreate($dw, $dh);
- }
+ /*--------------------------
- if (!$des) {
- return;
- }
+ Ausgabe der Grafik
+ */
+ if (function_exists('ImageCreateTrueColor')) {
+ $des = @imagecreatetruecolor((int) $dw, (int) $dh);
+ } else {
+ $des = @imagecreate((int) $dw, (int) $dh);
+ }
- // Die Fehlermeldung von rexstan beruht auf der Prüfung gegen PHP8. Dort sind GD-Objekte vom Typ "GdImage" und nicht "resoource"
- // Daher werden nachfolgend drei Zeilen ignoriert.
- // @phpstan-ignore-next-line
- $this->keepTransparent($des);
- // @phpstan-ignore-next-line
- imagecopyresampled($des, $gdimage,
- 0, 0, (int)$cx, (int)$cy,
- (int)$dw, (int)$dh, (int)$cw, (int)$ch);
+ if (false === $des) {
+ return;
+ }
- // @phpstan-ignore-next-line
- $this->media->setImage($des);
- $this->media->refreshImageDimensions();
+ // Die Fehlermeldung von rexstan beruht auf der Prüfung gegen PHP8. Dort sind GD-Objekte vom Typ "GdImage" und nicht "resoource"
+ // Daher werden nachfolgend drei Zeilen ignoriert.
+ // TODO: 5.0.0 Auflösen; wir sind bei nur noch PHP 8
+ // @phpstan-ignore-next-line
+ $this->keepTransparent($des);
+ // @phpstan-ignore-next-line
+ imagecopyresampled($des, $gdimage,
+ 0, 0, (int) $cx, (int) $cy,
+ (int) $dw, (int) $dh, (int) $cw, (int) $ch);
- }
+ // @phpstan-ignore-next-line
+ $this->media->setImage($des);
+ $this->media->refreshImageDimensions();
+ }
/**
* Stellt die Felder für die Effekt-Konfiguration als Array bereit.
@@ -234,33 +239,40 @@ public function execute()
* Die Basisfelder werden aus der Parent-Klasse abgerufen und um die Felder für
* Breite und Höhe des Zielbildes sowie den Zoom-Faktor ergänzt.
*
- * @return array Felddefinitionen
+ * @return list
+ *
+ * Ursprünglich war die Meldung "Return type (array) of method rex_effect_focuspoint_fit::getParams() should be compatible with return type (....) of method rex_effect_abstract_focuspoint::getParams()"
+ * Daher obige @ return aus rex_effect_abstract_focuspoint::getParams() kopiert und hier eingefügt. Das ergibt nun 2 x diese Meldung:
+ * STAN: Method rex_effect_focuspoint_fit::getParams() return type has no value type specified in iterable type array.
+ * Hängt vermutlich mit "attributes?: array, options?: array" zusammen. Das ignorieren wir also ...
+ * TODO: Issue im Core aufmachen
+ * @phpstan-ignore-next-line
*/
public function getParams()
{
$felder = parent::getParams();
$info = rex_i18n::msg('focuspoint_edit_notice_widthheigth_fit');
$felder[] = [
- 'label' => rex_i18n::msg('focuspoint_edit_label_width'),
- 'name' => 'width',
- 'type' => 'int',
- 'notice' => $info,
- 'attributes' => [ 'pattern' => self::PATTERN ],
- ];
+ 'label' => rex_i18n::msg('focuspoint_edit_label_width'),
+ 'name' => 'width',
+ 'type' => 'int',
+ 'notice' => $info,
+ 'attributes' => ['pattern' => self::PATTERN],
+ ];
$felder[] = [
- 'label' => rex_i18n::msg('focuspoint_edit_label_heigth'),
- 'name' => 'height',
- 'type' => 'int',
- 'notice' => $info,
- 'attributes' => [ 'pattern' => self::PATTERN ],
- ];
+ 'label' => rex_i18n::msg('focuspoint_edit_label_heigth'),
+ 'name' => 'height',
+ 'type' => 'int',
+ 'notice' => $info,
+ 'attributes' => ['pattern' => self::PATTERN],
+ ];
$felder[] = [
- 'label' => rex_i18n::msg('focuspoint_edit_label_zoom'),
- 'name' => 'zoom',
- 'type' => 'select',
- 'options' => $this->optionsZoom,
- 'notice' => rex_i18n::msg('focuspoint_edit_notice_zoom'),
- ];
+ 'label' => rex_i18n::msg('focuspoint_edit_label_zoom'),
+ 'name' => 'zoom',
+ 'type' => 'select',
+ 'options' => $this->optionsZoom,
+ 'notice' => rex_i18n::msg('focuspoint_edit_notice_zoom'),
+ ];
return $felder;
}
@@ -277,24 +289,26 @@ public function getParams()
*
* @return float|null umgerechneter Wert oder null für ungültiges Format
*/
- function decodeSize( $value, $ref=0 )
+ public function decodeSize($value, $ref = 0)
{
- $value = trim( (string)$value );
- if ( !preg_match( '/'.self::PATTERN.'/', $value ) ) return null;
- if ( strpos( $value,'%' ) )
- {
- $value = trim(str_replace( '%','',$value));
- $value = max( 0, min( 100, $value ) );
- if( $ref ) $value = $ref * $value / 100;
- return (float)$value;
+ $value = trim($value);
+ if (0 === preg_match('/' . self::PATTERN . '/', $value)) {
+ return null;
}
- if ( strpos( $value,'fr' ) )
- {
- $value = trim(str_replace( 'fr','',$value));
- $this->targetByAR++;
- return (int)$value;
+ if (str_contains($value, '%')) {
+ $value = trim(str_replace('%', '', $value));
+ $value = (float) $value;
+ $value = max(0, min(100, $value));
+ if (0 < $ref) {
+ $value = $ref * $value / 100;
+ }
+ return (float) $value;
}
- return (int)trim(str_replace( 'px','',$value));
+ if (str_contains($value, 'fr')) {
+ $value = trim(str_replace('fr', '', $value));
+ ++$this->targetByAR;
+ return (int) $value;
+ }
+ return (int) trim(str_replace('px', '', $value));
}
-
}
diff --git a/lib/focuspoint.php b/lib/focuspoint.php
index e82ba88..e1ea12c 100644
--- a/lib/focuspoint.php
+++ b/lib/focuspoint.php
@@ -4,7 +4,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -16,9 +16,26 @@
* aufgerufen werden
*/
+namespace FriendsOfRedaxo\Focuspoint;
+
+use PDO;
+use rex;
+use rex_effect_abstract;
+use rex_effect_abstract_focuspoint;
+use rex_extension;
+use rex_extension_point;
+use rex_fragment;
+use rex_i18n;
+use rex_media_manager;
+use rex_sql;
+use rex_url;
+
+use function count;
+use function strlen;
+
+/** @api */
class focuspoint
{
-
/**
* Erzeugt den HTML-Code, der in der Sidebar des Media-Detailformulars zur interaktiven
* Auswahl des Fokuspunktes eingebaut wird.
@@ -35,22 +52,18 @@ class focuspoint
*
* Das HTML wird vom Fragment "fp_panel.php" erzeugt.
*
- * @param rex_extension_point $ep
- *
+ * @template T
+ * @param rex_extension_point $ep
* @return string|void modifiziertes Sidebar-Html | keine Änderung
*/
-
- // rexstan meldet: "Method focuspoint::show_sidebar() has parameter $ep with generic class rex_extension_point but does not specify its types: T"
- // Warum?? Einfach ignorieren
- public static function show_sidebar( rex_extension_point $ep )
+ public static function show_sidebar(rex_extension_point $ep)
{
$params = $ep->getParams();
// Abbruch wenn kein Bild; Metafelder ausblenden
// der Flag focuspoint_no_image wird in customfield ausgewertet, da dort keine passenden Informationen verfügbar sind.
- if( !$params['is_image'] )
- {
- rex::setProperty('focuspoint_no_image',true);
+ if (!$params['is_image']) {
+ rex::setProperty('focuspoint_no_image', true);
return;
}
@@ -66,52 +79,59 @@ public static function show_sidebar( rex_extension_point $ep )
$text = $ep->getSubject();
$mediafile = $params['filename'];
- $referenz = '', $p1 + strlen($referenz) );
- if( $p2 === false ) return;
+ $p2 = stripos($text, '', $p1 + strlen($referenz));
+ if (false === $p2) {
+ return;
+ }
$p2 = $p2 + 4;
-
$fragment = new rex_fragment();
- $fragment->setVar ('mediafile', $mediafile );
+ $fragment->setVar('mediafile', $mediafile);
// relevante Media-Typen abrufen (nur Mediatypes, die Fokuspoint-Effekte beinhalten)
// benutze Felder zuordnen
// array[typ] = [ feld1, feld2, ...]
- $typen = array_unique( array_column( $params['effectsInUse']=self::getFocuspointEffectsInUse(), 'name' ) );
- asort( $typen );
- $typen = array_combine($typen,array_fill(0,count($typen),[]));
- foreach( self::getMetafieldList( ) as $f ) {
- foreach( self::getFocuspointMetafieldInUse( $f ) as $e ) $typen[$e['name']][] = $f;
+ $typen = array_unique(array_column($params['effectsInUse'] = self::getFocuspointEffectsInUse(), 'name'));
+ asort($typen);
+ $typen = array_combine($typen, array_fill(0, count($typen), []));
+ foreach (self::getMetafieldList() as $f) {
+ foreach (self::getFocuspointMetafieldInUse($f) as $e) {
+ $typen[$e['name']][] = $f;
+ }
}
- array_walk( $typen, function(&$t, $k) { $t = ['label'=>$k,'meta'=>$t]; });
+ array_walk($typen, static function (&$t, $k) {
+ $t = ['label' => $k, 'meta' => $t];
+ });
$typen = rex_extension::registerPoint(new rex_extension_point('FOCUSPOINT_PREVIEW_SELECT', $typen, $params));
- $fragment->setVar( 'mediatypes', $typen );
+ $fragment->setVar('mediatypes', $typen);
// Option-Liste der Felder aufbauen - falls es mindestens zwei Felder und davon mindestens ein hidden-Feld gibt.
- $qry = 'SELECT name,title,params FROM '.rex::getTable('metainfo_field').' WHERE name LIKE "med_%" AND type_id = (SELECT id FROM '.rex::getTable('metainfo_type').' WHERE label="'.rex_effect_abstract_focuspoint::META_FIELD_TYPE.'") ORDER BY priority ASC';
- $felder = rex_sql::factory()->getArray( $qry );
- if( count($felder) > 1 )
- {
+ $qry = 'SELECT name,title,params FROM ' . rex::getTable('metainfo_field') . ' WHERE name LIKE "med_%" AND type_id = (SELECT id FROM ' . rex::getTable('metainfo_type') . ' WHERE label="' . rex_effect_abstract_focuspoint::META_FIELD_TYPE . '") ORDER BY priority ASC';
+ /** @var array $felder */
+ $felder = rex_sql::factory()->getArray($qry);
+ if (count($felder) > 1) {
$feldauswahl = [];
$hidden = false;
- foreach( $felder as $feld )
- {
- $feldauswahl[ $feld['name'] ] = $feld['title'] ? rex_i18n::translate($feld['title']) : htmlspecialchars($feld['name']);
- $hidden = $hidden || strtolower($feld['params']) == 'hidden';
+ foreach ($felder as $feld) {
+ $feldauswahl[$feld['name']] = '' < $feld['title'] ? rex_i18n::translate($feld['title']) : htmlspecialchars($feld['name']);
+ $hidden = $hidden || 'hidden' === strtolower($feld['params']);
+ }
+ if ($hidden) {
+ $fragment->setVar('fieldselect', $feldauswahl);
}
- if( $hidden ) $fragment->setVar( 'fieldselect', $feldauswahl );
}
- return substr_replace( $text, $fragment->parse('fp_panel.php'), $p1, $p2 - $p1 );
+ return substr_replace($text, $fragment->parse('fp_panel.php'), $p1, $p2 - $p1);
}
-
/**
* Die Funktion liefert das Feld-HTML für Fokuspunkt-Felder (Meta-Typ "Focuspoint (AddOn)").
*
@@ -122,19 +142,19 @@ public static function show_sidebar( rex_extension_point $ep )
*
* Das HTML wird vom Fragment "fp_metafield.php" erzeugt.
*
- * @param rex_extension_point $ep
- *
+ * @template T
+ * @param rex_extension_point $ep
* @return array|void Metafield-Html, ....
*/
-
- // rexstan meldet: "Method focuspoint::customfield() has parameter $ep with generic class rex_extension_point but does not specify its types: T"
- // Warum?? Einfach ignorieren
- public static function customfield( rex_extension_point $ep )
+ public static function customfield(rex_extension_point $ep)
{
$subject = $ep->getSubject();
- if( $subject['type'] != rex_effect_abstract_focuspoint::META_FIELD_TYPE ) return;
+
+ if (rex_effect_abstract_focuspoint::META_FIELD_TYPE !== $subject['type']) {
+ return;
+ }
$default = $subject['sql']->getValue('default');
- if( !rex_effect_abstract_focuspoint::str2fp($subject['sql']->getValue('default') ) ) {
+ if (false === rex_effect_abstract_focuspoint::str2fp($subject['sql']->getValue('default'))) {
$default = '';
}
@@ -142,15 +162,15 @@ public static function customfield( rex_extension_point $ep )
// image, the fopuspoint-meta-fields don´t make any sense and will be flagged as hidden.
// as of V2.2 the fields are still available just for not cousing a BC.
// A future V3.0 will instead stop generating the HTML.
- $hidden = rex::getProperty('focuspoint_no_image',false) === true;
-
+ $hidden = true === rex::getProperty('focuspoint_no_image', false);
+
$feld = new rex_fragment();
- $feld->setVar( 'label', $subject[4], false );
- $feld->setVar( 'id', $subject[3] );
- $feld->setVar( 'name', str_replace('rex-metainfo-','',$subject[3]) );
- $feld->setVar( 'value', $subject['values'][0] );
- $feld->setVar( 'default', $default );
- $feld->setVar( 'hidden', $hidden || strtolower(trim($subject['sql']->getValue('params'))) == 'hidden' );
+ $feld->setVar('label', $subject[4], false);
+ $feld->setVar('id', $subject[3]);
+ $feld->setVar('name', str_replace('rex-metainfo-', '', $subject[3]));
+ $feld->setVar('value', $subject['values'][0]);
+ $feld->setVar('default', $default);
+ $feld->setVar('hidden', $hidden || 'hidden' === strtolower(trim($subject['sql']->getValue('params'))));
$subject[0] = $feld->parse('fp_metafield.php');
return $subject;
@@ -168,29 +188,27 @@ public static function customfield( rex_extension_point $ep )
*
* @return string
*/
-
public static function checkUninstallDependencies()
{
$message = '';
// ermittle die Meta-Felder vom Typ 'Focuspoint (AddOn)', die nicht 'med_focuspoint' sind.
- if( $felder = self::getMetafieldList( true ) )
- {
- $message .= '' . rex_i18n::msg('focuspoint_uninstall_metafields', rex_effect_abstract_focuspoint::META_FIELD_TYPE ) .
- '- ' . implode('
- ',$felder) .
+ $felder = self::getMetafieldList(true);
+ if (0 < count($felder)) {
+ $message .= '
- ' . rex_i18n::msg('focuspoint_uninstall_metafields', rex_effect_abstract_focuspoint::META_FIELD_TYPE) .
+ '
- ' . implode('
- ', $felder) .
'
';
}
// ermittle alle Effekte der Liste, die im Media-Manager genutzt werden
- if( $mmEffekteMsg = self::getFocuspointEffectsInUse() )
- {
- $mmEffekteMsg = self::getFocuspointEffectsInUseMessage( $mmEffekteMsg );
+ $mmEffekteMsg = self::getFocuspointEffectsInUse();
+ if (0 < count($mmEffekteMsg)) {
+ $mmEffekteMsg = self::getFocuspointEffectsInUseMessage($mmEffekteMsg);
$message .= "- $mmEffekteMsg
";
}
- if( $message )
- {
- $message = '' . rex_i18n::msg( 'focuspoint_uninstall_dependencies' ) . "";
+ if ('' < $message) {
+ $message = '' . rex_i18n::msg('focuspoint_uninstall_dependencies') . "";
}
return $message;
}
@@ -207,34 +225,31 @@ public static function checkUninstallDependencies()
*
* @return string
*/
-
public static function checkActivateDependencies()
{
$message = '';
$sql = rex_sql::factory();
$qry = 'SELECT id FROM ' . rex::getTable('metainfo_type') . ' WHERE label=:label LIMIT 1';
$sql->setQuery($qry, [':label' => rex_effect_abstract_focuspoint::META_FIELD_TYPE]);
- if( $sql->getRows() == 0 ) {
- $message .= '- '.rex_i18n::msg( 'focuspoint_activate_missing_metainfotype' ).'
';
+ if (0 === $sql->getRows()) {
+ $message .= '- ' . rex_i18n::msg('focuspoint_activate_missing_metainfotype') . '
';
}
$qry = 'SELECT type_id FROM ' . rex::getTable('metainfo_field') . ' WHERE name=:name LIMIT 1';
$sql->setQuery($qry, [':name' => rex_effect_abstract_focuspoint::MED_DEFAULT]);
- if( $sql->getRows() == 0 ) {
- $message .= '- '.rex_i18n::msg( 'focuspoint_activate_missing_metainfofield' ).'
';
+ if (0 === $sql->getRows()) {
+ $message .= '- ' . rex_i18n::msg('focuspoint_activate_missing_metainfofield') . '
';
}
$qry = 'SELECT id FROM ' . rex::getTable('media_manager_type') . ' WHERE name=:name LIMIT 1';
$sql->setQuery($qry, [':name' => rex_effect_abstract_focuspoint::MM_TYPE]);
- if( $sql->getRows() == 0 ) {
- $message .= '- '.rex_i18n::msg( 'focuspoint_activate_missing_mediamanagertype' ).'
';
+ if (0 === $sql->getRows()) {
+ $message .= '- ' . rex_i18n::msg('focuspoint_activate_missing_mediamanagertype') . '
';
}
- if( $message )
- {
- $message = '' . rex_i18n::msg( 'focuspoint_activate_dependencies' ) . "";
+ if ('' < $message) {
+ $message = '' . rex_i18n::msg('focuspoint_activate_dependencies') . "";
}
return $message;
}
-
/**
* Die Funktion überprüft Abhängigkeiten und bereitet die Ergebnisse als HTML-Liste auf.
*
@@ -245,18 +260,17 @@ public static function checkActivateDependencies()
*
* @return string
*/
-
public static function checkDeactivateDependencies()
{
- if( $message = self::getFocuspointEffectsInUse() )
- {
- $message = self::getFocuspointEffectsInUseMessage( $message );
- $message = '' . rex_i18n::msg( 'focuspoint_deactivate_dependencies' ) . "
$message";
+ $message = '';
+ $inUseMessages = self::getFocuspointEffectsInUse();
+ if (0 < count($inUseMessages)) {
+ $message = self::getFocuspointEffectsInUseMessage($inUseMessages);
+ $message = '' . rex_i18n::msg('focuspoint_deactivate_dependencies') . "
$message";
}
return $message;
}
-
/**
* Die Funktion ermittelt, ob Fokuspunkt-Meta-Felder in Effekten des Media-Managers benutzt
* werden und daher nicht gelöscht werden dürfen.
@@ -269,35 +283,34 @@ public static function checkDeactivateDependencies()
* @param int $id Nummer des Feldes (Datensatz-Id in rex_metainfo_field)
* @return string leerer String oder Rückmeldung der gefundenen Einträge
*/
-
- public static function metafield_is_in_use( $id )
+ public static function metafield_is_in_use($id)
{
+ $result = '';
// Name des zu löschenden Metafeldes
- $feld = self::getMetafieldList( );
- if( !isset( $feld[$id] ) ) return '';
+ $feld = self::getMetafieldList();
+ if (!isset($feld[$id])) {
+ return '';
+ }
$feld = $feld[$id];
// Das Default-Feld "med_focuspoint" darf so oder so nie gelöcht werden.
- if( $feld == rex_effect_abstract_focuspoint::MED_DEFAULT )
- {
+ if (rex_effect_abstract_focuspoint::MED_DEFAULT === $feld) {
$result = rex_i18n::msg('focuspoint_isinuse_dontdeletedefault', $feld);
}
// Andere Felder gezielt überprüfen
- elseif( $result = self::getFocuspointMetafieldInUse( $feld ) )
- {
- $result = '' .rex_i18n::rawMsg(
- 'focuspoint_isinuse_message',
- $feld,
- rex_url::backendController(['page' => 'media_manager/types'])
- ) . '
' . self::getFocuspointEffectsInUseMessage( $result );
+ elseif (0 < count($inUseList = self::getFocuspointMetafieldInUse($feld))) {
+ $result = '' . rex_i18n::rawMsg(
+ 'focuspoint_isinuse_message',
+ $feld,
+ rex_url::backendController(['page' => 'media_manager/types']),
+ ) . '
' . self::getFocuspointEffectsInUseMessage($inUseList);
}
return $result;
}
-
/**
- * Die Funktion ermittelt die Liste aller Fokuspunkt-Metafelder
+ * Die Funktion ermittelt die Liste aller Fokuspunkt-Metafelder.
*
* Die Felder werden über den Typ "Focuspoint (AddOn)" identifiziert.
*
@@ -306,17 +319,17 @@ public static function metafield_is_in_use( $id )
*
* @return array Key/Value-Array mit id=>name
*/
-
- public static function getMetafieldList( $extern=false )
+ public static function getMetafieldList($extern = false)
{
- $qry = 'SELECT f.id,name FROM '.
- rex::getTable('metainfo_field').' f LEFT JOIN '.rex::getTable('metainfo_type').
- ' t ON f.type_id = t.id WHERE label LIKE "'.rex_effect_abstract_focuspoint::META_FIELD_TYPE.'"';
- if( $extern ) $qry .= ' AND name NOT LIKE "'.rex_effect_abstract_focuspoint::MED_DEFAULT.'"';
- return rex_sql::factory()->getArray( $qry, [], PDO::FETCH_KEY_PAIR );
+ $qry = 'SELECT f.id,name FROM ' .
+ rex::getTable('metainfo_field') . ' f LEFT JOIN ' . rex::getTable('metainfo_type') .
+ ' t ON f.type_id = t.id WHERE label LIKE "' . rex_effect_abstract_focuspoint::META_FIELD_TYPE . '"';
+ if ($extern) {
+ $qry .= ' AND name NOT LIKE "' . rex_effect_abstract_focuspoint::MED_DEFAULT . '"';
+ }
+ return rex_sql::factory()->getArray($qry, [], PDO::FETCH_KEY_PAIR);
}
-
/**
* Die Funktion ermittelt die Liste aller Media-Manager-Typen/Effekte, in denen ein gegebenes
* Feld eingesetzt sind.
@@ -334,48 +347,47 @@ public static function getMetafieldList( $extern=false )
* id => id des effektes (rex_media_manager_type_effect)
* parameters => Parameter des Effektes
*/
-
- public static function getFocuspointMetafieldInUse( $feld )
+ public static function getFocuspointMetafieldInUse($feld)
{
- $effects = self::getFocuspointEffectsInUse( );
- foreach( $effects as $k=>$v )
- {
- $params = json_decode( $v['parameters'], true );
+ $effects = self::getFocuspointEffectsInUse();
+ foreach ($effects as $k => $v) {
+ $params = json_decode($v['parameters'], true);
$effekt = "rex_effect_{$v['effect']}";
$meta = "{$effekt}_meta";
- if( isset($params[$effekt][$meta]) && $params[$effekt][$meta] == $feld ) continue;
- unset( $effects[$k] );
+ if (isset($params[$effekt][$meta]) && $params[$effekt][$meta] === $feld) {
+ continue;
+ }
+ unset($effects[$k]);
}
return $effects;
}
-
/**
- * Die Funktion ermittelt die Liste aller Fokuspunkt-Effekte
+ * Die Funktion ermittelt die Liste aller Fokuspunkt-Effekte.
*
* Die Effekte werden über die Klasse "rex_effect_abstract_focuspoint" identifiziert, von der
* alle, auch externe (nicht mitgelieferte) Effekte abgeleitet sein sollten.
*
* @param bool $extern wenn true werden nur Effekte ermittelt, die zusätzlich zu den
- * AddOn-eigenen Effekten beim Media-Manager registriert wurden.
+ * AddOn-eigenen Effekten beim Media-Manager registriert wurden
*
* @return array Key/Value-Array mit rex_effect_«name»=>«name»
*/
-
- public static function getFocuspointEffects( $extern=false )
+ public static function getFocuspointEffects($extern = false)
{
$effects = array_filter(
- rex_media_manager::getSupportedEffects(),
- function ($class){ return is_subclass_of( $class, 'rex_effect_abstract_focuspoint');},
- ARRAY_FILTER_USE_KEY
- );
- if( $extern ) {
- $effects = array_diff( $effects, rex_effect_abstract_focuspoint::$internalEffects );
+ rex_media_manager::getSupportedEffects(),
+ static function ($class) {
+ return is_subclass_of($class, 'rex_effect_abstract_focuspoint');
+ },
+ ARRAY_FILTER_USE_KEY,
+ );
+ if ($extern) {
+ $effects = array_diff($effects, rex_effect_abstract_focuspoint::$internalEffects);
}
return $effects;
}
-
/**
* Die Funktion ermittelt die Liste aller Fokuspunkt-Effekte, die in einem Media-Manager-Typ
* eingesetzt sind.
@@ -387,59 +399,54 @@ function ($class){ return is_subclass_of( $class, 'rex_effect_abstract_focuspoin
* id => id des effektes (rex_media_manager_type_effect)
* parameters => Parameter des Effektes
*/
-
- public static function getFocuspointEffectsInUse( )
+ public static function getFocuspointEffectsInUse()
{
- if( $effects = self::getFocuspointEffects() )
- {
- $qry = 'SELECT name, effect, parameters, type_id, a.id as id, description FROM '.
- rex::getTable('media_manager_type_effect').' as a, '.rex::getTable('media_manager_type').
- ' as b WHERE effect IN ("'.implode( '","',$effects ).'") AND b.id = a.type_id';
- return rex_sql::factory()->getArray( $qry );
+ $effects = self::getFocuspointEffects();
+ if (0 < count($effects)) {
+ $qry = 'SELECT name, effect, parameters, type_id, a.id as id, description FROM ' .
+ rex::getTable('media_manager_type_effect') . ' as a, ' . rex::getTable('media_manager_type') .
+ ' as b WHERE effect IN (:effects) AND b.id = a.type_id';
+ return rex_sql::factory()->getArray($qry, [':effects' => implode('","', $effects)]);
}
return [];
}
-
/**
* Die Funktion bereitet die angegebenen Effekte zu einer UL/LI-Meldung auf.
*
* @param array $effekte
* @return string
*/
-
- public static function getFocuspointEffectsInUseMessage( array $effekte )
+ public static function getFocuspointEffectsInUseMessage(array $effekte)
{
$message = '';
- foreach( $effekte as $effect )
- {
+ foreach ($effekte as $effect) {
+ /** @ var rex_effect_abstract $target */
+ /** @var non-falsy-string $target */
$target = "rex_effect_{$effect['effect']}";
$name = new $target();
$message .= '- ' . rex_i18n::rawMsg(
'focuspoint_isinuse_entry',
$effect['name'],
rex_url::backendController([
- 'page' => 'media_manager/types',
- 'type_id' => $effect['type_id'],
- 'effects' => 1,
- ]),
+ 'page' => 'media_manager/types',
+ 'type_id' => $effect['type_id'],
+ 'effects' => 1,
+ ]),
$name->getName(),
rex_url::backendController([
- 'page' => 'media_manager/types',
- 'effects' => 1,
- 'func' => 'edit',
- 'type_id' => $effect['type_id'],
- 'effect_id' => $effect['id'],
- ])
- ) .' / '.$effect['effect'] . '
';
+ 'page' => 'media_manager/types',
+ 'effects' => 1,
+ 'func' => 'edit',
+ 'type_id' => $effect['type_id'],
+ 'effect_id' => $effect['id'],
+ ]),
+ ) . ' / ' . $effect['effect'] . '
';
}
- if( $message )
- {
+ if ('' < $message) {
$message = "";
}
return $message;
}
-
-
}
diff --git a/lib/focuspoint_api.php b/lib/focuspoint_api.php
index aff91f0..d4f95d4 100644
--- a/lib/focuspoint_api.php
+++ b/lib/focuspoint_api.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -31,49 +31,46 @@
* &file= Name der Mediendatei
* &type= Name des MM-Effektes
* &xy= Fokuspunkt numerisch (0.0,0.0 bis 100.1,100.0)
- *
*/
- class rex_api_focuspoint extends rex_api_function {
-
+class rex_api_focuspoint extends rex_api_function
+{
// protected $published = true;
/**
- * Ausführende Funktion des rex_api_call "focuspoint"
+ * Ausführende Funktion des rex_api_call "focuspoint".
*
* prüft die Request-Parameter, initiiert die Bilderstellung und sendet das Bild an die Browser
*/
- public function execute() {
+ public function execute()
+ {
- $mediafile = rex_request( 'file', 'string', '' );
- $mediatype = rex_request( 'type', 'string', '' );
+ $mediafile = rex_request('file', 'string', '');
+ $mediatype = rex_request('type', 'string', '');
- if( $mediafile && $mediatype )
- {
- $bild = focuspoint_media_manager::createMedia( $mediatype, $mediafile );
- $bild->sendMedia( '', '' );
+ if ('' < $mediafile && '' < $mediatype) {
+ $bild = focuspoint_media_manager::createMedia($mediatype, $mediafile);
+ $bild->sendMedia('', '');
}
exit;
}
-
}
/**
-* Da die wichtige Funktion rex_media_manager->applyEffects 'protected' ist, muss eine abgeleitete
-* Klasse "focuspoint_media_manager" zwischengeschaltet werden, um das neue Bild zu generieren.
-*
-*/
+ * Da die wichtige Funktion rex_media_manager->applyEffects 'protected' ist, muss eine abgeleitete
+ * Klasse "focuspoint_media_manager" zwischengeschaltet werden, um das neue Bild zu generieren.
+ */
class focuspoint_media_manager extends rex_media_manager
{
/**
- * Erzeugt das Bild des media-Effektes
+ * Erzeugt das Bild des media-Effektes.
*
* @param string $type Medientyp
* @param string $file Name der Bilddatei im Medienpool
*
* @return rex_managed_media Ergebnisbild
*/
- public static function createMedia( $type=null, $file=null )
+ public static function createMedia($type = null, $file = null)
{
$mediaPath = rex_path::media($file);
$media = new rex_managed_media($mediaPath);
diff --git a/lib/focuspoint_boot.php b/lib/focuspoint_boot.php
index d43d73e..f83e653 100644
--- a/lib/focuspoint_boot.php
+++ b/lib/focuspoint_boot.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -15,59 +15,75 @@
* besondere Einstellungen z.B. mittels Extension-Points vorzunehmen sind.
* Die Aktivitäten wurden in eine separate Datei ausgelagert, um für den Normalbetrieb der
* REDAXO-Instanz eine schlanke boot.php mit geringem Kompilieraufwand zu haben.
- *
*/
-class focuspoint_boot {
+namespace FriendsOfRedaxo\Focuspoint;
+
+use ReflectionException;
+use rex;
+use rex_addon;
+use rex_effect_abstract_focuspoint;
+use rex_extension;
+use rex_extension_point;
+use rex_i18n;
+use rex_sql;
+use rex_view;
+
+use function array_key_exists;
+use function count;
+/** @api */
+class focuspoint_boot
+{
/**
- * page=mediapool/media
+ * page=mediapool/media.
*
* Ressourcen für die Fokuspunkt-Erfassung im Mediapool einbinden
- *
+ *
* @param rex_addon $fpAddon
* @return void
*/
- static public function mediaDetailPage( $fpAddon )
+ public static function mediaDetailPage($fpAddon)
{
rex_view::addCssFile($fpAddon->getAssetsUrl('focuspoint.min.css'));
rex_view::addJsFile($fpAddon->getAssetsUrl('focuspoint.min.js'));
rex_extension::register('MEDIA_DETAIL_SIDEBAR', 'focuspoint::show_sidebar');
- rex_extension::register('METAINFO_CUSTOM_FIELD', 'focuspoint::customfield' );
+ rex_extension::register('METAINFO_CUSTOM_FIELD', 'focuspoint::customfield');
}
/**
* page=metainfo/articles
* page=metainfo/categories
- * page=metainfo/clangs
+ * page=metainfo/clangs.
*
* Auswahl des Metainfo-Datentyp "focuspoint (AddOn)" ausblenden da nur für Medien relevant
- *
+ *
* @return void
*/
- static public function metainfoDefault()
+ public static function metainfoDefault()
{
- if( rex_request('func', 'string') != 'delete' )
- {
- rex_extension::register( 'REX_FORM_GET', function( rex_extension_point $ep ){
+ if ('delete' !== rex_request('func', 'string')) {
+ rex_extension::register('REX_FORM_GET', static function (rex_extension_point $ep) {
try {
// provide access to the form-elements
- $formReflection = new focuspoint_reflection( $ep->getSubject() );
- $fieldset = $formReflection->getPropertyValue( 'fieldset' );
+ $formReflection = new focuspoint_reflection($ep->getSubject());
+ $fieldset = $formReflection->getPropertyValue('fieldset');
// search the type-select
- $typeid = $formReflection->executeMethod ( 'getElement', [$fieldset,'type_id'] );
- $typeidReflection = new focuspoint_reflection( $typeid );
+ $typeid = $formReflection->executeMethod('getElement', [$fieldset, 'type_id']);
+ $typeidReflection = new focuspoint_reflection($typeid);
// get access to the internal REX_SELECT-element
- $selectReflection = new focuspoint_reflection( $typeidReflection->getPropertyValue('select') );
+ $selectReflection = new focuspoint_reflection($typeidReflection->getPropertyValue('select'));
$options = $selectReflection->getPropertyValue('options');
- foreach( $options[0][0] as $i=>$o ){
- if( $o[0] != rex_effect_abstract_focuspoint::META_FIELD_TYPE ) continue;
- array_splice( $options[0][0], $i, 1, [] );
- $selectReflection->setPropertyValue( 'options',$options );
- $selectReflection->setPropertyValue( 'optCount',$selectReflection->getPropertyValue('optCount') - 1 );
+ foreach ($options[0][0] as $i => $o) {
+ if (rex_effect_abstract_focuspoint::META_FIELD_TYPE !== $o[0]) {
+ continue;
+ }
+ array_splice($options[0][0], $i, 1, []);
+ $selectReflection->setPropertyValue('options', $options);
+ $selectReflection->setPropertyValue('optCount', $selectReflection->getPropertyValue('optCount') - 1);
return;
}
- } catch (\ReflectionException $e) {
+ } catch (ReflectionException $e) {
return;
}
});
@@ -76,7 +92,7 @@ static public function metainfoDefault()
}
/**
- * page=metainfo/media
+ * page=metainfo/media.
*
* 1) Metafelder werden in Media-Manager-Typen bzw. den eingebundenen Focuspunkt-Effekten
* referenziert. Sofern noch Effekte ein Focuspunkt-Metafeld nutzen, darf es nicht
@@ -86,168 +102,171 @@ static public function metainfoDefault()
* entsprechenden Felder gesperrt, gelöscht oder begrenzt. (per JS)
* Gilt auch für Fokuspunkt-Felder, die bereits in Effekten/Typen des MM genutzt werden.
* 3) Liste: In der Liste der Metafelder wird ebenfalls das Default-Feld gegen Löschen gesperrt
- *
+ *
* @return void
*/
- static public function metainfoMedia()
+ public static function metainfoMedia()
{
// prevent deletion of meta-fields still in use by effects
- if( rex_request('func', 'string') == 'delete' )
- {
- rex_extension::register( 'PACKAGES_INCLUDED', function( rex_extension_point $ep ){
- if( $result = focuspoint::metafield_is_in_use( rex_request('field_id', 'int', 0) ) )
- {
+ if ('delete' === rex_request('func', 'string')) {
+ rex_extension::register('PACKAGES_INCLUDED', static function (rex_extension_point $ep) {
+ $inUseMessage = focuspoint::metafield_is_in_use(rex_request('field_id', 'int', 0));
+ if ('' < $inUseMessage) {
+ // STAN: Using $_REQUEST is forbidden, use rex_request::request() or rex_request() instead.
+ // Da hat er recht, aber ich wüsste nicht, wie man es anders löst.
+ // @phpstan-ignore-next-line
$_REQUEST['func'] = '';
- rex_extension::register('PAGE_TITLE_SHOWN', function(rex_extension_point $ep) use ($result) {
- $ep->setSubject(rex_view::error($result) . $ep->getSubject());
+ rex_extension::register('PAGE_TITLE_SHOWN', static function (rex_extension_point $ep) use ($inUseMessage) {
+ $ep->setSubject(rex_view::error($inUseMessage) . $ep->getSubject());
});
}
});
}
// limit changing the default-focuspoint-metafield and fields in use: fieldname, fieldtype, no delete
- if( rex_request('func', 'string') == 'edit' )
- {
- rex_extension::register( 'REX_FORM_GET', function( rex_extension_point $ep ){
+ if ('edit' === rex_request('func', 'string')) {
+ rex_extension::register('REX_FORM_GET', static function (rex_extension_point $ep) {
$form = $ep->getSubject();
- $fpMetafields = focuspoint::getMetafieldList( );
+ $fpMetafields = focuspoint::getMetafieldList();
$field_id = rex_request('field_id', 'int');
- if( array_key_exists( $field_id, $fpMetafields ) ) {
- $fpField = $fpMetafields[ $field_id ];
+ if (array_key_exists($field_id, $fpMetafields)) {
+ $fpField = $fpMetafields[$field_id];
$message = '';
try {
// provide access to the form-elements
- $formReflection = new focuspoint_reflection( $ep->getSubject() );
- $fieldset = $formReflection->getPropertyValue( 'fieldset' );
- $elements = $formReflection->getPropertyValue( 'elements' );
+ $formReflection = new focuspoint_reflection($ep->getSubject());
+ $fieldset = $formReflection->getPropertyValue('fieldset');
+ $elements = $formReflection->getPropertyValue('elements');
$fselements = $elements[$fieldset] ?? [];
// the default-field is not restrictable to mediapool-categories
- if( $fpField == rex_effect_abstract_focuspoint::MED_DEFAULT ) {
- $message .= rex_i18n::msg('focuspoint_edit_msg_inuse2',$fpField).'
';
+ if (rex_effect_abstract_focuspoint::MED_DEFAULT === $fpField) {
+ $message .= rex_i18n::msg('focuspoint_edit_msg_inuse2', $fpField) . '
';
}
// focuspoint-fields in use will get restrictions
- if ( $effects=focuspoint::getFocuspointMetafieldInUse( $fpField ) ) {
- $message .= rex_i18n::msg('focuspoint_edit_msg_inuse1', $fpField) .
- '
' . focuspoint::getFocuspointEffectsInUseMessage( $effects );
+ $effects = focuspoint::getFocuspointMetafieldInUse($fpField);
+ if (0 < count($effects)) {
+ $message .= rex_i18n::msg('focuspoint_edit_msg_inuse1', $fpField) .
+ '
' . focuspoint::getFocuspointEffectsInUseMessage($effects);
}
- if( $message ) {
- $message .= rex_i18n::msg('focuspoint_edit_msg_inuse3',rex_i18n::msg('minfo_field_label_name'),rex_i18n::msg('minfo_field_label_type'));
- echo rex_view::info(''.rex_i18n::msg('focuspoint_doc').'
'.$message) . "\n";
- foreach( $fselements as $k=>$e ) {
- if( $e->getFieldName() == 'name' ) {
+ if ('' < $message) {
+ $message .= rex_i18n::msg('focuspoint_edit_msg_inuse3', rex_i18n::msg('minfo_field_label_name'), rex_i18n::msg('minfo_field_label_type'));
+ echo rex_view::info('' . rex_i18n::msg('focuspoint_doc') . '
' . $message) . "\n";
+ foreach ($fselements as $k => $e) {
+ if ('name' === $e->getFieldName()) {
// prevent the name from being changed by turning the field in a hidden one.
// Don´t use type=hidden due to rex_form-behavior
- $e->setPrefix( ''.$form->stripPrefix($e->getValue()).'
' );
- $e->setAttribute('class','hidden');
+ $e->setPrefix('' . $form->stripPrefix($e->getValue()) . '
');
+ $e->setAttribute('class', 'hidden');
continue;
}
- if( $e->getFieldName() == 'type_id' ) {
+ if ('type_id' === $e->getFieldName()) {
// replace by a simple hidden input to preserve the value
// Don´t use type=hidden due to rex_form-behavior
- $x = $form->addInputField( 'input','type_id',null,[],false );
- $x->setLabel( $e->getLabel() );
- $x->setPrefix( ''.rex_effect_abstract_focuspoint::META_FIELD_TYPE.'
' );
- $x->setAttribute( 'class','hidden' );
+ $x = $form->addInputField('input', 'type_id', null, [], false);
+ $x->setLabel($e->getLabel());
+ $x->setPrefix('' . rex_effect_abstract_focuspoint::META_FIELD_TYPE . '
');
+ $x->setAttribute('class', 'hidden');
$fselements[$k] = $x;
continue;
}
- if( get_class($e) == 'rex_form_control_element' ) {
+ if ('rex_form_control_element' === $e::class) {
// don´t delete the default-field or fields in use
// so remove the delete-button
$controlReflection = new focuspoint_reflection($e);
- $controlReflection->setPropertyValue( 'deleteElement',null );
+ $controlReflection->setPropertyValue('deleteElement', null);
continue;
}
}
}
$elements[$fieldset] = $fselements;
- $formReflection->setPropertyValue( 'elements',$elements );
- } catch (\ReflectionException $e) {
+ $formReflection->setPropertyValue('elements', $elements);
+ } catch (ReflectionException $e) {
return;
}
}
});
}
// don´t remove the default-Metafield from the list,
- rex_extension::register( 'REX_LIST_GET', function( rex_extension_point $ep ){
+ rex_extension::register('REX_LIST_GET', static function (rex_extension_point $ep) {
$list = $ep->getSubject();
-# Erkenntnis aus rexstan: $effectsInUse wird in der custom-function nicht (mehr) benutzt.
-# Erst mal als Kommentar im Code belassen
-# $effectsInUse = focuspoint::getFocuspointEffectsInUse();
-# $list->setColumnFormat('delete', 'custom', function ($params) use($effectsInUse) {
- $list->setColumnFormat('delete', 'custom', function ($params) {
+ // Erkenntnis aus rexstan: $effectsInUse wird in der custom-function nicht (mehr) benutzt.
+ // Erst mal als Kommentar im Code belassen
+ // $effectsInUse = focuspoint::getFocuspointEffectsInUse();
+ // $list->setColumnFormat('delete', 'custom', function ($params) use($effectsInUse) {
+ $list->setColumnFormat('delete', 'custom', static function ($params) {
$list = $params['list'];
- if( $list->getValue('name') == rex_effect_abstract_focuspoint::MED_DEFAULT ) {
+ if (rex_effect_abstract_focuspoint::MED_DEFAULT === $list->getValue('name')) {
return '' . rex_i18n::msg('focuspoint_doc') . '';
}
- # planned with V3.0 because it is a breaking change:
- # show detailed in-use-information insteag of a "blocked"
- # if( $inUse = focuspoint::metafield_is_in_use( $list->getValue('id') ) ) return ''.$inUse.'';
- if( $presetValue = $params['params'][0] ) return $list->formatValue('', $presetValue, false, 'delete');
+ // planned with V3.0 because it is a breaking change:
+ // show detailed in-use-information insteag of a "blocked"
+ // if( $inUse = focuspoint::metafield_is_in_use( $list->getValue('id') ) ) return ''.$inUse.'';
+ if ($presetValue = $params['params'][0]) {
+ return $list->formatValue('', $presetValue, false, 'delete');
+ }
return $list->getColumnLink('delete', $list->getValue('delete'));
}, [$list->getColumnFormat('delete')]);
});
}
/**
- * page=media_manager/types
+ * page=media_manager/types.
*
* Verhindert in der Liste der verfügbaren Media-Manager-Typen bzw. im Edit-Formular,
* dass der von Focuspoint selbst benötigte Media-Manager-Typ "rex_effect_abstract_focuspoint::MM_TYPE"
* gelöscht oder sein Name verändert wird.
- *
+ *
* @return void
*/
- static public function media_managerTypes()
+ public static function media_managerTypes()
{
- if( rex_request('effects', 'int') != 1 ) {
+ if (1 !== rex_request('effects', 'int')) {
// Listenansicht anpassen und hier schon unzulässige Button deaktivieren
- rex_extension::register( 'REX_LIST_GET', function( rex_extension_point $ep ){
+ rex_extension::register('REX_LIST_GET', static function (rex_extension_point $ep) {
$list = $ep->getSubject();
- $list->setColumnFormat('deleteType', 'custom', function($params){
+ $list->setColumnFormat('deleteType', 'custom', static function ($params) {
$list = $params['list'];
- if( $list->getValue('name') == rex_effect_abstract_focuspoint::MM_TYPE ) {
+ if (rex_effect_abstract_focuspoint::MM_TYPE === $list->getValue('name')) {
return '' . rex_i18n::msg('focuspoint_doc') . '';
}
$field = $params['field'];
- if( $presetValue = $params['params'][0] ) {
+ if ($presetValue = $params['params'][0]) {
return $list->formatValue($list->getValue($field), $presetValue, false, $field);
}
return $list->getColumnLink($field, $list->getValue($field));
}, [$list->getColumnFormat('deleteType')]);
});
-
}
// Verhindert beim Editieren des Support-Media-Types im Medienpool dass der Name überschrieben wird.
// Außerdem darf der Eintrag nicht gelöscht werden, daher muss der Löschbutton unterdrückt werden.
- if( 'edit' == rex_request('func', 'string') ) {
+ if ('edit' === rex_request('func', 'string')) {
- rex_extension::register( 'REX_FORM_CONTROL_FIELDS', function( rex_extension_point $ep ){
+ rex_extension::register('REX_FORM_CONTROL_FIELDS', static function (rex_extension_point $ep) {
$sql = rex_sql::factory();
$qry = 'SELECT * FROM ' . rex::getTable('media_manager_type') . ' WHERE id=? and name=?';
- $sql->setQuery($qry, [rex_request('type_id', 'int'),rex_effect_abstract_focuspoint::MM_TYPE]);
- if( $sql->getRows() ) {
+ $sql->setQuery($qry, [rex_request('type_id', 'int'), rex_effect_abstract_focuspoint::MM_TYPE]);
+ if (0 < $sql->getRows()) {
$cf = $ep->getSubject();
$cf['delete'] = '';
- $ep->setSubject( $cf );
- rex_extension::register( 'REX_FORM_GET', function( rex_extension_point $ep ){
+ $ep->setSubject($cf);
+ rex_extension::register('REX_FORM_GET', static function (rex_extension_point $ep) {
$form = $ep->getSubject();
// provide access to the form-elements
- $formReflection = new focuspoint_reflection( $form );
- $fieldset = $formReflection->getPropertyValue( 'fieldset' );
- $elements = $formReflection->getPropertyValue( 'elements' );
+ $formReflection = new focuspoint_reflection($form);
+ $fieldset = $formReflection->getPropertyValue('fieldset');
+ $elements = $formReflection->getPropertyValue('elements');
$fselements = $elements[$fieldset] ?? [];
- foreach( $fselements as $k=>$e ) {
- if( 'name' == $e->getFieldName() ) {
+ foreach ($fselements as $k => $e) {
+ if ('name' === $e->getFieldName()) {
// prevent the name from being changed by turning the field in a hidden one.
// Don´t use type=hidden due to rex_form-behavior
- $e->setPrefix( ''.$e->getValue().'
' );
- $e->setAttribute('class','hidden');
+ $e->setPrefix('' . $e->getValue() . '
');
+ $e->setAttribute('class', 'hidden');
break;
}
}
@@ -258,36 +277,40 @@ static public function media_managerTypes()
}
// Falls doch ein "delete" ankommt und den Default-Type betrifft: abblocken
- if( 'delete' == rex_request('func', 'string') ) {
+ if ('delete' === rex_request('func', 'string')) {
$sql = rex_sql::factory();
$qry = 'SELECT * FROM ' . rex::getTable('media_manager_type') . ' WHERE id=? and name=?';
- $sql->setQuery($qry, [rex_request('type_id', 'int'),rex_effect_abstract_focuspoint::MM_TYPE]);
- if( $sql->getRows() ) {
+ $sql->setQuery($qry, [rex_request('type_id', 'int'), rex_effect_abstract_focuspoint::MM_TYPE]);
+ if (0 < $sql->getRows()) {
+ // STAN: Using $_REQUEST is forbidden, use rex_request::request() or rex_request() instead.
+ // Da hat er recht, aber ich wüsste nicht, wie man es anders löst.
+ // @phpstan-ignore-next-line
$_REQUEST['func'] = '';
- rex_extension::register('PAGE_TITLE_SHOWN', function(rex_extension_point $ep) {
- $result = rex_i18n::msg('focuspoint_isinuse_dontdeletedefault',rex_effect_abstract_focuspoint::MM_TYPE);
+ rex_extension::register('PAGE_TITLE_SHOWN', static function (rex_extension_point $ep) {
+ $result = rex_i18n::msg('focuspoint_isinuse_dontdeletedefault', rex_effect_abstract_focuspoint::MM_TYPE);
$ep->setSubject(rex_view::error($result) . $ep->getSubject());
});
- };
+ }
}
}
/**
- * page=packages
+ * page=packages.
*
* leitet auf einen spezialisierten API-Handler um.
- *
+ *
* @param rex_addon $fpAddon
* @return void
*/
- static public function packages( $fpAddon )
+ public static function packages($fpAddon)
{
- if( rex_request('package', 'string') == $fpAddon->getName()
- && isset($_REQUEST['rex-api-call'])
- && $_REQUEST['rex-api-call'] == 'package' )
- {
- $_REQUEST['rex-api-call'] = 'focuspoint_package';
+ if (rex_request('package', 'string') === $fpAddon->getName()) {
+ if ('package' === rex_request('rex-api-call', 'string', '')) {
+ // STAN: Using $_REQUEST is forbidden, use rex_request::request() or rex_request() instead.
+ // Da hat er recht, aber ich wüsste nicht, wie man es anders löst.
+ // @phpstan-ignore-next-line
+ $_REQUEST['rex-api-call'] = 'focuspoint_package';
+ }
}
}
-
}
diff --git a/lib/focuspoint_media.php b/lib/focuspoint_media.php
index b48e921..efdee3c 100644
--- a/lib/focuspoint_media.php
+++ b/lib/focuspoint_media.php
@@ -4,7 +4,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -14,12 +14,16 @@
*
* Die Klasse "focuspoint_media" ist von "rex_media" abgeleitet und erleichetrt den
* Umgang mit Medien, deren Darstellung auf Fokuspunkten basiert.
- *
*/
+namespace FriendsOfRedaxo\Focuspoint;
+
+use rex_effect_abstract_focuspoint;
+use rex_media;
+
+/** @api */
class focuspoint_media extends rex_media
{
-
/**
* Gibt die Bildinstanz zurück und prüft dabei ab, ob es ein Bild ist (isImage).
*
@@ -28,17 +32,16 @@ class focuspoint_media extends rex_media
public static function get($name)
{
$media = parent::get($name);
- if( $media ) {
- if( !$media->isImage() ) {
+ if (null !== $media) {
+ if (!$media->isImage()) {
$media = null;
}
}
return $media;
}
-
/**
- * Ermittelt die Fokuspunkt-Koordinaten des Bildes
+ * Ermittelt die Fokuspunkt-Koordinaten des Bildes.
*
* Liefert ein Koordinatenpaar (Prozentwert) aus dem angegebenen Metafeld oder (default) aus
* dem Feld "med_focuspoint". Ist das feld leer oder hat einen formal ungültigen wert, wird
@@ -55,35 +58,37 @@ public static function get($name)
* default: med_focuspoint
* @param array $default Default-Koordinaten falls das Metafeld leer oder ungültig ist.
* Wenn $default fehlt: 50,50
- * @param array|bool $wh Array [breite,höhe] mit den absoluten Referenzwerten, auf die
+ * @param array|bool $wh array [breite,höhe] mit den absoluten Referenzwerten, auf die
* sich die Prozentwerte der Koordinaten beziehen, oder True für
- * [bildbreite,bildhöhe].
+ * [bildbreite,bildhöhe]
*
- * @return array [x,y] als Koordinaten-Array
+ * @return array [x,y] als Koordinaten-Array
*/
- function getFocus( $metafield = null, array $default = null, $wh=false )
+ public function getFocus($metafield = null, ?array $default = null, $wh = false)
{
// read the field
- if( $metafield == null ) $metafield = rex_effect_abstract_focuspoint::MED_DEFAULT;
- $xy = (string) $this->getValue( (string)$metafield );
+ if (null === $metafield) {
+ $metafield = rex_effect_abstract_focuspoint::MED_DEFAULT;
+ }
+ $xy = (string) $this->getValue($metafield);
- $fp = rex_effect_abstract_focuspoint::str2fp( $xy );
- if( $fp === false )
- {
- $fp = $default ? $default : rex_effect_abstract_focuspoint::$mitte;
+ $fp = rex_effect_abstract_focuspoint::str2fp($xy);
+ if (false === $fp) {
+ $fp = null === $default ? rex_effect_abstract_focuspoint::$mitte : $default;
}
- if( $wh !== false )
- {
- if( $wh === true ) $wh = [ $this->getWidth(), $this->getHeight() ];
- $fp = rex_effect_abstract_focuspoint::rel2px( $fp, $wh );
+ if (false !== $wh) {
+ if (true === $wh) {
+ $wh = [$this->getWidth(), $this->getHeight()];
+ }
+ $fp = rex_effect_abstract_focuspoint::rel2px($fp, $wh);
}
return $fp;
}
/**
- * Ermittelt, ob ein Fokuspunkt gesetzt ist
+ * Ermittelt, ob ein Fokuspunkt gesetzt ist.
*
* Liefert true zurück, wenn
* (1) das angegebene Fokuspunkt-Metafeld existiert und
@@ -92,14 +97,16 @@ function getFocus( $metafield = null, array $default = null, $wh=false )
* @param string $metafield Metafeld, aus dem die Koordinaten entnommen werden.
* default: med_focuspoint
*
- * @return bool
+ * @return bool
*/
- function hasFocus( $metafield = null )
+ public function hasFocus($metafield = null)
{
// read the field
- if( $metafield == null ) $metafield = rex_effect_abstract_focuspoint::MED_DEFAULT;
- $xy = (string) $this->getValue( (string)$metafield );
+ if (null === $metafield) {
+ $metafield = rex_effect_abstract_focuspoint::MED_DEFAULT;
+ }
+ $xy = (string) $this->getValue($metafield);
// check for a valid entry
- return rex_effect_abstract_focuspoint::str2fp( $xy ) !== false;
+ return false !== rex_effect_abstract_focuspoint::str2fp($xy);
}
}
diff --git a/lib/focuspoint_reflection.php b/lib/focuspoint_reflection.php
index 4c76e2a..445923a 100644
--- a/lib/focuspoint_reflection.php
+++ b/lib/focuspoint_reflection.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -16,54 +16,64 @@
* in der Klasse ansonsten nicht zugänglich sind (private oder protected)
*
* HANDLE WITH CARE!
- *
*/
-// rexstan meldet: "Class focuspoint_reflection extends generic class ReflectionClass but does not specify its types: T"
-// Warum?? Einfach ignorieren
-class focuspoint_reflection extends ReflectionClass {
+namespace FriendsOfRedaxo\Focuspoint;
+
+use ReflectionClass;
- /** @var object */
- public $obj = null;
+class focuspoint_reflection extends ReflectionClass
+{
+ /**
+ * @var object
+ * @api
+ */
+ public $obj;
/**
- * @param object $obj
* @return void
*/
- function __construct( $obj ) {
- parent::__construct( $obj );
+ public function __construct(object $obj)
+ {
+ parent::__construct($obj);
$this->obj = $obj;
}
/**
+ * @api
* @param string $method
* @param array $params
* @return mixed
*/
- function executeMethod ($method, array $params){
- $method = $this->getMethod( $method );
+ public function executeMethod($method, array $params)
+ {
+ $method = $this->getMethod($method);
$method->setAccessible(true);
return $method->invokeArgs($this->obj, $params);
}
/**
+ * @api
* @param string $prop
* @return mixed
*/
- function getPropertyValue ( $prop ) {
+ public function getPropertyValue($prop)
+ {
$property = $this->getProperty($prop);
$property->setAccessible(true);
- return $property->getValue( $this->obj );
+ return $property->getValue($this->obj);
}
/**
+ * @api
* @param string $prop
* @param mixed $value
* @return void
*/
- function setPropertyValue ( $prop, $value ) {
+ public function setPropertyValue($prop, $value)
+ {
$property = $this->getProperty($prop);
$property->setAccessible(true);
- $property->setValue( $this->obj, $value );
+ $property->setValue($this->obj, $value);
}
}
diff --git a/lib/no_namespace/focuspoint.php b/lib/no_namespace/focuspoint.php
new file mode 100644
index 0000000..930e011
--- /dev/null
+++ b/lib/no_namespace/focuspoint.php
@@ -0,0 +1,25 @@
+
+ * @version 4.1.0
+ * @copyright FriendsOfREDAXO
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * ------------------------------------------------------------------------------------------------
+ *
+ * Mit Version 4.1 wird das Addon auf namespaces umgestellt. Für den Übergang wird die alte Klasse
+ * auf diesem Wege weiterhin bereitgestellt. Diese Klasse fällt mit Version 5.0.0 weg, nachdem
+ * Redaxo auf Composer als Installer umgestellt wurde.
+ *
+ * @deprecated 5.0.0 Aufrufe auf "FriendsOfRedaxo\Focuspoint\focuspoint" (Namespace) umstellen
+ * @see https://github.com/orgs/FriendsOfREDAXO/discussions/40
+ */
+
+class focuspoint extends FriendsOfRedaxo\Focuspoint\focuspoint
+{
+}
diff --git a/lib/no_namespace/focuspoint_boot.php b/lib/no_namespace/focuspoint_boot.php
new file mode 100644
index 0000000..5307b86
--- /dev/null
+++ b/lib/no_namespace/focuspoint_boot.php
@@ -0,0 +1,25 @@
+
+ * @version 4.1.0
+ * @copyright FriendsOfREDAXO
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * ------------------------------------------------------------------------------------------------
+ *
+ * Mit Version 4.1 wird das Addon auf namespaces umgestellt. Für den Übergang wird die alte Klasse
+ * auf diesem Wege weiterhin bereitgestellt. Diese Klasse fällt mit Version 5.0.0 weg, nachdem
+ * Redaxo auf Composer als Installer umgestellt wurde.
+ *
+ * @deprecated 5.0.0 Aufrufe auf "FriendsOfRedaxo\Focuspoint\focuspoint_boot" (Namespace) umstellen
+ * @see https://github.com/orgs/FriendsOfREDAXO/discussions/40
+ */
+
+class focuspoint_boot extends FriendsOfRedaxo\Focuspoint\focuspoint_boot
+{
+}
diff --git a/lib/no_namespace/focuspoint_media.php b/lib/no_namespace/focuspoint_media.php
new file mode 100644
index 0000000..826b129
--- /dev/null
+++ b/lib/no_namespace/focuspoint_media.php
@@ -0,0 +1,25 @@
+
+ * @version 4.1.0
+ * @copyright FriendsOfREDAXO
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * ------------------------------------------------------------------------------------------------
+ *
+ * Mit Version 4.1 wird das Addon auf namespaces umgestellt. Für den Übergang wird die alte Klasse
+ * auf diesem Wege weiterhin bereitgestellt. Diese Klasse fällt mit Version 5.0.0 weg, nachdem
+ * Redaxo auf Composer als Installer umgestellt wurde.
+ *
+ * @deprecated 5.0.0 Aufrufe auf "FriendsOfRedaxo\Focuspoint\focuspoint_media" (Namespace) umstellen
+ * @see https://github.com/orgs/FriendsOfREDAXO/discussions/40
+ */
+
+class focuspoint_media extends FriendsOfRedaxo\Focuspoint\focuspoint_media
+{
+}
diff --git a/lib/no_namespace/focuspoint_reflection.php b/lib/no_namespace/focuspoint_reflection.php
new file mode 100644
index 0000000..4a14dba
--- /dev/null
+++ b/lib/no_namespace/focuspoint_reflection.php
@@ -0,0 +1,25 @@
+
+ * @version 4.1.0
+ * @copyright FriendsOfREDAXO
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * ------------------------------------------------------------------------------------------------
+ *
+ * Mit Version 4.1 wird das Addon auf namespaces umgestellt. Für den Übergang wird die alte Klasse
+ * auf diesem Wege weiterhin bereitgestellt. Diese Klasse fällt mit Version 5.0.0 weg, nachdem
+ * Redaxo auf Composer als Installer umgestellt wurde.
+ *
+ * @deprecated 5.0.0 Aufrufe auf "FriendsOfRedaxo\Focuspoint\focuspoint_reflection" (Namespace) umstellen
+ * @see https://github.com/orgs/FriendsOfREDAXO/discussions/40
+ */
+
+class focuspoint_reflection extends FriendsOfRedaxo\Focuspoint\focuspoint_reflection
+{
+}
diff --git a/lib/package_api.php b/lib/package_api.php
index 1b57b9f..361add5 100644
--- a/lib/package_api.php
+++ b/lib/package_api.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -31,60 +31,67 @@
* &file= Name der Mediendatei
* &type= Name des MM-Effektes
* &xy= Fokuspunkt numerisch (0.0,0.0 bis 100.1,100.0)
- *
*/
- class rex_api_focuspoint_package extends rex_api_package {
-
- /**
- * Ausführende Funktion des rex_api_call "focuspoint"
- *
- * prüft die Request-Parameter, initiiert die Bilderstellung und sendet das Bild an die Browser
- */
- public function execute()
- {
- $function = rex_request('function', 'string');
- if (!in_array($function, ['install', 'uninstall', 'activate', 'deactivate', 'delete'])) {
- throw new rex_api_exception('Unknown package function "' . $function . '"!');
- }
- $packageId = rex_request('package', 'string');
- $package = rex_package::get($packageId);
- if ($function == 'uninstall' && !$package->isInstalled()
- || $function == 'activate' && $package->isAvailable()
- || $function == 'deactivate' && !$package->isAvailable()
- || $function == 'delete' && !rex_package::exists($packageId)
- ) {
- return new rex_api_result(true);
- }
+class rex_api_focuspoint_package extends rex_api_package
+{
+ /**
+ * Ausführende Funktion des rex_api_call "focuspoint".
+ *
+ * prüft die Request-Parameter, initiiert die Bilderstellung und sendet das Bild an die Browser
+ */
+ public function execute()
+ {
+ $function = strtolower(rex_request('function', 'string'));
+ if (!in_array($function, ['install', 'uninstall', 'activate', 'deactivate', 'delete'], true)) {
+ throw new rex_api_exception('Unknown package function "' . $function . '"!');
+ }
+ $packageId = rex_request('package', 'string');
+ $package = rex_package::get($packageId);
+ if ('uninstall' === $function && !$package->isInstalled()
+ || 'activate' === $function && $package->isAvailable()
+ || 'deactivate' === $function && !$package->isAvailable()
+ || 'delete' === $function && !rex_package::exists($packageId)
+ ) {
+ return new rex_api_result(true);
+ }
- if ($package instanceof rex_null_package) {
- throw new rex_api_exception('Package "' . $packageId . '" doesn\'t exists!');
- }
- $reinstall = 'install' === $function && $package->isInstalled();
- // Die rexstan-Fehlermeldung beruht vermutlich auf Bezügen zu rex_package; ist aber hier nicht lösbar.
- // @phpstan-ignore-next-line
- $manager = rex_package_manager::factory($package);
- try {
- $package->includeFile('precheck.php', [ 'request' => ($reinstall ? 'reinstall' : $function) ] );
- $message = ''; #$package->getProperty('precheckmsg', '');
- $success = true; # $message == '';
- } catch (rex_functional_exception $e) {
- $message = $e->getMessage();
- $success = false;
- }
- if( $success ) {
- $success = $manager->$function();
- $message = $manager->getMessage();
- }
- $result = new rex_api_result($success, $message);
- if ($success && !$reinstall) {
- $result->setRequiresReboot(true);
- }
- return $result;
- }
- protected function requiresCsrfProtection()
- {
- return false;
- }
+ if ($package instanceof rex_null_package) {
+ throw new rex_api_exception('Package "' . $packageId . '" doesn\'t exists!');
+ }
+ $reinstall = 'install' === $function && $package->isInstalled();
+ /**
+ * STAN: Parameter #1 $package of static method rex_package_manager::factory() expects rex_package, rex_package_interface given.
+ * Die rexstan-Fehlermeldung beruht vermutlich auf Bezügen zu rex_package; wüsste nicht, wie ich das auflösen sollte.
+ * TODO: 5.0 Diese ganze Nummer zum Abfangen von undefinierten Zuständen ab REX 6 neu überdenken.
+ * @phpstan-ignore-next-line
+ */
+ $manager = rex_package_manager::factory($package);
+ try {
+ $package->includeFile('precheck.php', ['request' => ($reinstall ? 'reinstall' : $function)]);
+ $message = ''; // $package->getProperty('precheckmsg', '');
+ $success = true; // $message == '';
+ } catch (rex_functional_exception $e) {
+ $message = $e->getMessage();
+ $success = false;
+ }
+ if ($success) {
+ /**
+ * STAN: Variable method call on rex_package_manager.
+ * @phpstan-ignore-next-line
+ */
+ $success = rex_type::bool($manager->$function());
+ $message = $manager->getMessage();
+ }
+ $result = new rex_api_result($success, $message);
+ if ($success && !$reinstall) {
+ $result->setRequiresReboot(true);
+ }
+ return $result;
+ }
- }
+ protected function requiresCsrfProtection()
+ {
+ return false;
+ }
+}
diff --git a/package.yml b/package.yml
index 416d77d..0987c72 100644
--- a/package.yml
+++ b/package.yml
@@ -1,5 +1,5 @@
package: focuspoint
-version: '4.0.4'
+version: '4.1.0'
author: Friends Of REDAXO
supportpage: https://github.com/FriendsOfREDAXO/focuspoint
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..c8a910a
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+ tests/unit
+
+
+
diff --git a/precheck.php b/precheck.php
index a4dff97..5f30fdd 100644
--- a/precheck.php
+++ b/precheck.php
@@ -1,9 +1,9 @@
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -47,20 +47,30 @@
* Note:
* in case of an install (not re-install) or update the addon addon/lib and other configurations
* are not loaded. Be carefull. But generally special prechecks are not necessary for "install"
- *
- * @var rex_addon $this
- * @var string $request
*/
+namespace FriendsOfRedaxo\Focuspoint;
+
+use rex_addon;
+
+/**
+ * @var rex_addon $this
+ * @var string $request Ist aus dem aufrufenden Context vorhanden
+ */
+
+namespace FriendsOfRedaxo\Focuspoint;
+
+use rex_functional_exception;
+use rex_i18n;
+
$message = '';
$header = '';
-switch ( $request )
-{
+switch ($request) {
case 'install':
- //noop
+ // noop
break;
case 'reinstall':
- //noop
+ // noop
break;
case 'activate':
$message = focuspoint::checkActivateDependencies();
@@ -79,8 +89,8 @@
$header = 'addon_not_deleted';
break;
}
-dump($message);
-if( $message ){
+
+if ('' < $message) {
$message = rex_i18n::rawMsg($header, $this->getName()) . "
$message";
- throw new rex_functional_exception( $message );
+ throw new rex_functional_exception($message);
}
diff --git a/tests/unit/focuspoint_test.php b/tests/unit/focuspoint_test.php
new file mode 100644
index 0000000..501feb6
--- /dev/null
+++ b/tests/unit/focuspoint_test.php
@@ -0,0 +1,27 @@
+prepareQuery('SELECT * FROM rex_metainfo_type WHERE Label =:label');
+ $sql->execute(['label' => 'Focuspoint (AddOn)']);
+
+ $dbtype = $sql->getValue('dbtype');
+ $length = $sql->getValue('dblength');
+ $count = count($sql->getArray());
+
+ // check if entry exists once
+ static::assertFalse($count < 1, 'Meta Type "Focuspoint (AddOn)" not found');
+ static::assertFalse($count > 1, 'Meta Type "Focuspoint (AddOn)" duplicate entry');
+ // check db type and length
+ static::assertEquals('varchar', $dbtype, 'Meta Type "Focuspoint (AddOn)" wrong dbtype');
+ static::assertEquals(20, $length, 'Meta Type "Focuspoint (AddOn)" dblenght not 20');
+ }
+}
diff --git a/uninstall.php b/uninstall.php
index d1bd7b2..968031c 100644
--- a/uninstall.php
+++ b/uninstall.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -22,38 +22,47 @@
* 2) Lösche die zuvor installierten Standards
* - Meta-Feld "med_focuspoint"
* - Meta-Typ "Focuspoint (AddOn)"
- *
- * @var rex_addon $this
*/
+namespace FriendsOfRedaxo\Focuspoint;
+
+use rex;
+use rex_addon;
+use rex_effect_abstract_focuspoint;
+use rex_media_manager;
+use rex_sql;
+
+use function count;
+
+/** @var rex_addon $this */
+
// make addon-parameters available
-include_once ( 'lib/effect_focuspoint.php' );
+include_once 'lib/effect_focuspoint.php';
$sql = rex_sql::factory();
// remove default-meta-field
-rex_metainfo_delete_field( rex_effect_abstract_focuspoint::MED_DEFAULT );
+rex_metainfo_delete_field(rex_effect_abstract_focuspoint::MED_DEFAULT);
// remove meta-type
$qry = 'SELECT id FROM ' . rex::getTable('metainfo_type') . ' WHERE label=:label LIMIT 1';
-$typeId = $sql->getArray( $qry, [':label' => rex_effect_abstract_focuspoint::META_FIELD_TYPE] );
+$typeId = $sql->getArray($qry, [':label' => rex_effect_abstract_focuspoint::META_FIELD_TYPE]);
-if( count( $typeId ) )
-{
- rex_metainfo_delete_field_type( (int)$typeId[0]['id'] );
+if (0 < count($typeId)) {
+ rex_metainfo_delete_field_type($typeId[0]['id']);
}
// remove media-manager-type
-$sql->setQuery('select id from '.rex::getTable('media_manager_type').' where name="'.rex_effect_abstract_focuspoint::MM_TYPE.'" LIMIT 1');
-if( $sql->getRows() ) {
- $id = $sql->getValue( 'id' );
- $sql->setTable( rex::getTable('media_manager_type') );
- $sql->setWhere( 'id='.$id );
+$sql->setQuery('select id from ' . rex::getTable('media_manager_type') . ' where name="' . rex_effect_abstract_focuspoint::MM_TYPE . '" LIMIT 1');
+if (0 < (int) $sql->getRows()) {
+ $id = $sql->getValue('id');
+ $sql->setTable(rex::getTable('media_manager_type'));
+ $sql->setWhere('id=' . $id);
$sql->delete();
- $sql->setTable( rex::getTable('media_manager_type_effect') );
- $sql->setWhere( 'type_id='.$id );
+ $sql->setTable(rex::getTable('media_manager_type_effect'));
+ $sql->setWhere('type_id=' . $id);
$sql->delete();
}
// ... delete corresponding cache files
-rex_media_manager::deleteCache( null, rex_effect_abstract_focuspoint::MM_TYPE );
+rex_media_manager::deleteCache(null, rex_effect_abstract_focuspoint::MM_TYPE);
diff --git a/update.php b/update.php
index 4da4629..bfa15bc 100644
--- a/update.php
+++ b/update.php
@@ -3,7 +3,7 @@
* This file is part of the REDAXO-AddOn "focuspoint".
*
* @author FriendsOfREDAXO @ GitHub
- * @version 4.0.2
+ * @version 4.1.0
* @copyright FriendsOfREDAXO
*
* For the full copyright and license information, please view the LICENSE
@@ -14,88 +14,108 @@
* only necessary for updates from versions pre 2.0
*
* SQL-transaction is rolled back in case of update-errors
- *
- * @var rex_addon $this
*/
-if (rex_string::versionCompare($this->getVersion(), '2.0', '<'))
-{
+namespace FriendsOfRedaxo\Focuspoint;
+
+use Exception;
+
+use PDO;
+use rex;
+use rex_addon;
+use rex_effect_abstract_focuspoint;
+use rex_i18n;
+use rex_sql;
+use rex_sql_column;
+use rex_sql_table;
+use rex_version;
+
+use function count;
+use function is_string;
+
+/** @var rex_addon $this */
+
+if (rex_version::compare($this->getVersion(), '2.0', '<')) {
// activate .lang-files currently in a temporary directory
- rex_i18n::addDirectory( __DIR__.'/lang' );
+ rex_i18n::addDirectory(__DIR__ . '/lang');
// prerequisites, to fetch predefined strings
- include_once( 'lib/effect_focuspoint.php' );
+ include_once 'lib/effect_focuspoint.php';
$sql = rex_sql::factory();
+ /**
+ * STAN: Calling rex_sql::beginTransaction() is forbidden, handling transactions manually is error prone.
+ * Nee, das bleibt erstmal so.
+ * @phpstan-ignore-next-line
+ */
$sql->beginTransaction();
$message = '';
// Add or identify meta_type for focuspoint-fields
$qry = 'SELECT id FROM ' . rex::getTable('metainfo_type') . ' WHERE label=:label LIMIT 1';
- $type_id = $sql->getArray($qry, [':label' => rex_effect_abstract_focuspoint::META_FIELD_TYPE]);
+ $result = $sql->getArray($qry, [':label' => rex_effect_abstract_focuspoint::META_FIELD_TYPE]);
- $type_id = $type_id
- ? $type_id[0]['id']
+ $type_id = 0 < count($result)
+ ? $result[0]['id']
: rex_metainfo_add_field_type(rex_effect_abstract_focuspoint::META_FIELD_TYPE, 'string', 20);
// if valid type_id add default-field
- if( is_numeric($type_id) )
- {
+ if (is_numeric($type_id)) {
+
+ // TODO: entfernen
+ /** @ var int|numeric-string $type_id */
// Identify existing metafield by name and read current type_id
$qry = 'SELECT type_id FROM ' . rex::getTable('metainfo_field') . ' WHERE name=:name LIMIT 1';
$field = $sql->getArray($qry, [':name' => rex_effect_abstract_focuspoint::MED_DEFAULT]);
- if( $field )
- {
- if( $field[0]['type_id'] != $type_id )
- {
- $message = rex_i18n::msg( 'focuspoint_install_field_exists', rex_effect_abstract_focuspoint::MED_DEFAULT,rex_effect_abstract_focuspoint::META_FIELD_TYPE );
+ if (0 < count($field)) {
+ if ($field[0]['type_id'] !== $type_id) {
+ $message = rex_i18n::msg('focuspoint_install_field_exists', rex_effect_abstract_focuspoint::MED_DEFAULT, rex_effect_abstract_focuspoint::META_FIELD_TYPE);
}
- }
- else
- {
+ } else {
// field does not exist. Add field
$result = rex_metainfo_add_field('translate:focuspoint_field_label', rex_effect_abstract_focuspoint::MED_DEFAULT, 3, '', $type_id, '', '', '', '');
- if( $result !== true )
- {
- $message = rex_i18n::msg( 'focuspoint_install_field_error', rex_effect_abstract_focuspoint::MED_DEFAULT, "$result" );
+ if (true !== $result) {
+ $message = rex_i18n::msg('focuspoint_install_field_error', rex_effect_abstract_focuspoint::MED_DEFAULT, "$result");
}
// for unknown reason in "update.php" rex_metainfo_add_field does not add the new field to rex_media, additional measure required
else {
rex_sql_table::get(rex::getTable('media'))
- ->ensureColumn(new rex_sql_column(rex_effect_abstract_focuspoint::MED_DEFAULT, 'varchar(20)', true, ''),'revision')
+ ->ensureColumn(new rex_sql_column(rex_effect_abstract_focuspoint::MED_DEFAULT, 'varchar(20)', true, ''), 'revision')
->ensure();
}
}
// Field prepared
- if( !$message )
- {
+ if ('' === $message) {
try {
// transfer coordinates from old data_field "med_focuspoint_data" to new default-field
- $tab = rex::getTable( 'media' );
- $qry = 'SHOW COLUMNS FROM '.$tab.' WHERE Field = "med_focuspoint_data"';
- if( $sql->getArray( $qry) )
- {
+ $tab = rex::getTable('media');
+ $qry = 'SHOW COLUMNS FROM ' . $tab . ' WHERE Field = "med_focuspoint_data"';
+ if (0 < count($sql->getArray($qry))) {
- $qry = 'SELECT id,med_focuspoint_data FROM '.$tab.' WHERE med_focuspoint_data > ""';
+ $qry = 'SELECT id,med_focuspoint_data FROM ' . $tab . ' WHERE med_focuspoint_data > ""';
/** @var array $liste */
- $liste = $sql->getArray( $qry, [], PDO::FETCH_KEY_PAIR );
- foreach( $liste as $k=>$v )
- {
- if( preg_match_all( '/(?[+-]?[0-1][.][0-9]{2}),(?[+-]?[0-1][.][0-9]{2})/', $v, $tags ) )
- {
+ /**
+ * STAN: Query error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'med_focuspoint_data' in 'field list' (42S22).
+ * Die Spalte wird hier als Metafeld hinzugefügt und wird damit eine Spalte der Tabelle.
+ * Das kann RexStan verm. nicht wissen/verstehen. Daher zur Fehlermeldungsunterdrückung.
+ * @phpstan-ignore-next-line
+ */
+ $liste = $sql->getArray($qry, [], PDO::FETCH_KEY_PAIR);
+ foreach ($liste as $k => $v) {
+ if (0 < preg_match_all('/(?[+-]?[0-1][.][0-9]{2}),(?[+-]?[0-1][.][0-9]{2})/', $v, $tags)) {
$x = ($tags['x'][0] + 1) * 50;
$y = (1 - $tags['y'][0]) * 50;
- $x = max( 0, min( 100,$x ) );
- $y = max( 0, min( 100,$y ) );
- $sql->setTable( $tab );
- $sql->setValue( rex_effect_abstract_focuspoint::MED_DEFAULT, sprintf( rex_effect_abstract_focuspoint::STRING, $x, $y ) );
- $sql->setWhere( 'id = :id', [':id'=>$k] );
+ $x = max(0, min(100, $x));
+ $y = max(0, min(100, $y));
+ $sql->setTable($tab);
+ $sql->setValue(rex_effect_abstract_focuspoint::MED_DEFAULT, sprintf(rex_effect_abstract_focuspoint::STRING, $x, $y));
+ $sql->setWhere('id = :id', [':id' => $k]);
$sql->update();
}
}
@@ -109,115 +129,123 @@
// update parameter-set per field "focuspoint-fit" and "focuspoint-resize" to new structure"
$tab = rex::getTable('media_manager_type_effect');
- $mitte = sprintf( rex_effect_abstract_focuspoint::STRING, rex_effect_abstract_focuspoint::$mitte[0], rex_effect_abstract_focuspoint::$mitte[1] );
+ $mitte = sprintf(rex_effect_abstract_focuspoint::STRING, rex_effect_abstract_focuspoint::$mitte[0], rex_effect_abstract_focuspoint::$mitte[1]);
$qry = "SELECT id,parameters FROM $tab";
/** @var array */
- $liste = $sql->getArray( $qry, [], PDO::FETCH_KEY_PAIR );
- foreach( $liste as $k=>$v )
- {
- $v = json_decode( $v, true );
- if( isset($v['rex_effect_focuspoint_fit'] ) )
- {
- if( !isset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_focus']) )
- {
+ $liste = $sql->getArray($qry, [], PDO::FETCH_KEY_PAIR);
+ foreach ($liste as $k => $v) {
+ $v = json_decode($v, true);
+ if (isset($v['rex_effect_focuspoint_fit'])) {
+ if (!isset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_focus'])) {
$v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_focus'] = sprintf(
rex_effect_abstract_focuspoint::STRING,
- fpUpdateNumParaOk( $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_hpos'], 0, 50, 100 ),
- fpUpdateNumParaOk( $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_vpos'], 0, 50, 100 )
+ fpUpdateNumParaOk($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_hpos'], 0, 50, 100),
+ fpUpdateNumParaOk($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_vpos'], 0, 50, 100),
);
- unset( $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_hpos'] );
- unset( $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_vpos'] );
+ unset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_hpos']);
+ unset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_vpos']);
}
- if( !isset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_meta']) )
- {
+ if (!isset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_meta'])) {
$v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_meta'] =
- $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_fp'] == rex_i18n::msg('media_manager_effekt_focuspointfit_fp_inherit')
- ? 'default ('.rex_i18n::msg('focuspoint_edit_label_focus').')'
+ $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_fp'] === rex_i18n::msg('media_manager_effekt_focuspointfit_fp_inherit')
+ ? 'default (' . rex_i18n::msg('focuspoint_edit_label_focus') . ')'
: rex_effect_abstract_focuspoint::MED_DEFAULT;
- unset( $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_fp'] );
+ unset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_fp']);
}
- if( isset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_zoom']) &&
- preg_match( '(0%|25%|50%|75%|100%)', $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_zoom'], $match ) &&
- count($match) > 0 )
- {
+ if (isset($v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_zoom']) &&
+ 0 < preg_match('(0%|25%|50%|75%|100%)', $v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_zoom'], $match) &&
+ 0 < count($match)) {
$v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_zoom'] = $match[0];
} else {
$v['rex_effect_focuspoint_fit']['rex_effect_focuspoint_fit_zoom'] = '0%';
}
}
- if( isset($v['rex_effect_focuspoint_resize'] ) )
- {
- if( !isset($v['rex_effect_focuspoint_resize']['rex_effect_focuspoint_resize_focus']) )
- {
+ if (isset($v['rex_effect_focuspoint_resize'])) {
+ if (!isset($v['rex_effect_focuspoint_resize']['rex_effect_focuspoint_resize_focus'])) {
$v['rex_effect_focuspoint_resize']['rex_effect_focuspoint_resize_focus'] = $mitte;
}
- if( !isset($v['rex_effect_focuspoint_resize']['rex_effect_focuspoint_resize_meta']) )
- {
+ if (!isset($v['rex_effect_focuspoint_resize']['rex_effect_focuspoint_resize_meta'])) {
$v['rex_effect_focuspoint_resize']['rex_effect_focuspoint_resize_meta'] = rex_effect_abstract_focuspoint::MED_DEFAULT;
}
}
- $sql->setTable( $tab );
- $sql->setValue( 'parameters', json_encode( $v ) );
- $sql->setWhere( 'id=:id', [':id'=>$k] );
+ $sql->setTable($tab);
+ $sql->setValue('parameters', json_encode($v));
+ $sql->setWhere('id=:id', [':id' => $k]);
$sql->update();
}
// add media-manager-type for interactiv focuspoint-selection
// don't check existance of effect "resize"; just setup.
- $sql->setQuery('select id, name from '.rex::getTable('media_manager_type').' where name="'.rex_effect_abstract_focuspoint::MM_TYPE.'" LIMIT 1');
- if( $sql->getRows() ) {
+ $sql->setQuery('select id, name from ' . rex::getTable('media_manager_type') . ' where name="' . rex_effect_abstract_focuspoint::MM_TYPE . '" LIMIT 1');
+ if (0 < $sql->getRows()) {
$id = $sql->getValue('id');
} else {
- $sql->setTable( rex::getTable('media_manager_type') );
- $sql->setValue( 'name', rex_effect_abstract_focuspoint::MM_TYPE );
+ $sql->setTable(rex::getTable('media_manager_type'));
+ $sql->setValue('name', rex_effect_abstract_focuspoint::MM_TYPE);
$sql->insert();
$id = $sql->getLastId();
}
- $sql->setTable( rex::getTable('media_manager_type_effect') );
- $sql->setWhere( 'type_id='.$id );
+ $sql->setTable(rex::getTable('media_manager_type_effect'));
+ $sql->setWhere('type_id=' . $id);
$sql->delete();
- $sql->setTable( rex::getTable('media_manager_type_effect') );
- $sql->setValue( 'type_id', $id );
- $sql->setValue( 'effect', 'resize' );
- $sql->setValue( 'parameters', '{"rex_effect_resize":{"rex_effect_resize_width":"1024","rex_effect_resize_height":"1024","rex_effect_resize_style":"maximum","rex_effect_resize_allow_enlarge":"enlarge"}}' );
+ $sql->setTable(rex::getTable('media_manager_type_effect'));
+ /**
+ * STAN: Value 'type_id' does not exist in table selected via setTable().
+ * Falsch.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('type_id', $id);
+ /**
+ * STAN: Value 'effect' does not exist in table selected via setTable().
+ * Falsch.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('effect', 'resize');
+ /**
+ * STAN: Value 'parameters' does not exist in table selected via setTable().
+ * Falsch.
+ * @phpstan-ignore-next-line
+ */
+ $sql->setValue('parameters', '{"rex_effect_resize":{"rex_effect_resize_width":"1024","rex_effect_resize_height":"1024","rex_effect_resize_style":"maximum","rex_effect_resize_allow_enlarge":"enlarge"}}');
$sql->addGlobalUpdateFields();
$sql->addGlobalCreateFields();
$sql->insert();
} catch (Exception $e) {
- $message = rex_i18n::msg( 'focuspoint_update_error' ) . ' ' . $e->getMessage();
+ $message = rex_i18n::msg('focuspoint_update_error') . ' ' . $e->getMessage();
}
}
}
// no valid type_id
- else
- {
- $message = rex_i18n::msg( 'focuspoint_install_type_error', rex_effect_abstract_focuspoint::META_FIELD_TYPE, "$type_id" );
+ else {
+ $message = rex_i18n::msg('focuspoint_install_type_error', rex_effect_abstract_focuspoint::META_FIELD_TYPE, "$type_id");
}
- if( $message )
- {
+ if ('' < $message) {
$sql->rollBack();
- $this->setProperty('updatemsg', $message );
- }
- else
- {
+ $this->setProperty('updatemsg', $message);
+ } else {
$sql->commit();
}
}
-
/**
- * @param string|integer|float $para
+ * @param string|int|float $para
* @param int|float $low
* @param int|float $default
* @param int|float $high
* @return int|float
*/
-function fpUpdateNumParaOk( $para, $low=0, $default=0, $high=0 )
+function fpUpdateNumParaOk($para, $low = 0, $default = 0, $high = 0)
{
- $para = trim( $para );
- return ( empty($para) || !is_numeric($para) || $para < $low || $para > $high ) ? $default : (int)$para;
+ if (!is_numeric($para)) {
+ return $default;
+ }
+ if (is_string($para)) {
+ $para = trim($para);
+ }
+ // TODO: Warum wird (int)$para zurückgegeben? Relikt aus der Zeit der nur ganzzahligen %-Sätze?
+ return $para < $low || $para > $high ? $default : (int) $para;
}