Die Klasse rex_media erweitern

Seit REDAXO Version 5.3 kann die Klasse rex_media erweitert werden. Damit ist es möglich, fehlende Funktionen über eine Kind-Klasse nachzurüsten.

Beispiel

Erweitern der Klasse rex_media um eine Methode, die eine Datei-URL mit Medientyp ausgibt

// Das in REX_MEDIA[1] gespeicherte Bild wird mit dem Medientyp 'bootstrap_jumbotron' ausgegeben
// da die Ausgabe wahrscheinlich recht groß für das Backend ist, wird das Bild im Backend als Thumbnail ausgegeben
$media = new my_media(REX_MEDIA[1]); 
$url = $media->getMediaUrl('bootstrap_jumbotron', true)

Erweitern der Klasse rex_media um eine Methode, um mehrsprachige Medien-Metadaten abzufragen

$media = new my_media(REX_MEDIA[1]); 
// Das Feld 'metafield_1' wird ausgegeben
$metafield = $media->getValueTranslated('metafield', 1);  

// Das Feld 'metafield' wird abhängig von der aktuellen Sprache zurückgegeben
// Ist die Sprach-ID 1, also 'metafield_1', ist die Sprach-ID 2, 'metafield_2',
// ist die Sprach-ID 1 und 'metafield_1' existiert nicht, wird 'metafield' zurückgegeben,
// so kann die Methode auch mit nachträglich mehrsprachig erweiterten Websites arbeiten
$media = new my_media(REX_MEDIA[1]); 
$metafield = $media->getValueTranslated('metafield'); 

// Falls das Metafeld 'metafield_*' leer ist, wird ein Default-Wert zurückgegeben
$media = new my_media(REX_MEDIA[1]);  
$metafield = $media->getValueTranslated('metafield',, 'Das Feld ist leer'); 
class my_media extends rex_media
{
    /**
     * Necessary for PHP 5.6
     */
    public function __construct()
    {
    }
    
    /**
     * Extended getUrl method, that allows the passing of a mediatype into the method,
     * as well as into the extension point. The Url will be prettyfied if yrewrite is available.
     * In addition it is possible to force a thumbnail-sized output in the backend.
     *
     * @param string $media_type  The desired mediatype as 
     * @param bool $backend_thumbnail  True, if the image shall be output as thumbnail in the backend
     * @return string
     */
    public function getMediaUrl($media_type = '', $backend_thumbnail = false)
    {
        // Resize to thumbnail in backend
        if ($backend_thumbnail) {
            $media_type = 'rex_mediapool_preview';
        }

        // Same EP as in url method, but media_type is passed in addition
        $url = rex_extension::registerPoint(new \rex_extension_point('MEDIA_URL_REWRITE', '', [
            'media' => $this,
            'media_type' => $media_type,
        ]));

        // Beautify url
        if (!$url && $media_type) {
            if (rex_addon::get('yrewrite')->isAvailable() && !rex::isBackend()) {
                $url = rex_url::frontend('images/'.$media_type.'/'.$this->getFileName());
            } else {
                $url = rex_url::frontend('index.php?rex_media_type='.$media_type.'&rex_media_file='.$this->getFileName());
            }
        }

        return $url ?: rex_url::media($this->getFileName());
    }

    /**
     * The accepted way to allow multilanguage metadata on media files is to 
     * append the clang id with an underscore to meta value names.
     * You simply hav to pass the meta value name to this method and it tries 
     * to get the appropriate value from metadata. If the metafield does not exist, 
     * it gradually falls back to a non-suffixed name and finally apassed default value.    
     *
     * @param string $value  The name of the meta value
     * @param int $clang_id  The optional clang id, if none is passed, the current id is used
     * @param string|null $default  An optional default value
     * @return string
     */
    public function getValueTranslated($value, $clang_id = 0, $default = null)
    {
        $return = '';

        // Normalize
        if ($clang_id < 1) {
            $clang_id = rex_clang::getCurrentId();
        }

        if ($clang_id >= 1) {
            $return = $this->getValue($value.'_'.$clang_id);
        }

        // Fallback
        if (!$return && $clang_id == 1) {
            $return = $this->getValue($value);
        }

        if (!$return) {
            $return = $default;
        }

        return $return;
    }
}