openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit faf0e2b34a3ec6038669ddd3396ce3b215cb3402
parent bd22152bda94fc1791b7c103a854fda85448cb50
Author: Jan Dankert <devnull@localhost>
Date:   Tue, 14 Aug 2018 22:08:19 +0200

Methoden 'filename()' vereinheitlicht und etwas aufgeräumt.

Diffstat:
modules/cms-core/action/FileAction.class.php | 2+-
modules/cms-core/action/FolderAction.class.php | 2+-
modules/cms-core/action/WebdavAction.class.php | 2+-
modules/cms-core/model/BaseObject.class.php | 32+++++++++-----------------------
modules/cms-core/model/File.class.php | 34++++++++++++++++++----------------
modules/cms-core/model/Folder.class.php | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
modules/cms-core/model/Page.class.php | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++------
7 files changed, 141 insertions(+), 48 deletions(-)

diff --git a/modules/cms-core/action/FileAction.class.php b/modules/cms-core/action/FileAction.class.php @@ -159,7 +159,7 @@ class FileAction extends ObjectAction // Angabe Content-Disposition // - Bild soll "inline" gezeigt werden // - Dateiname wird benutzt, wenn der Browser das Bild speichern moechte - header('Content-Disposition: inline; filename='.$this->file->filenameWithExtension() ); + header('Content-Disposition: inline; filename='.$this->file->filename() ); header('Content-Transfer-Encoding: binary' ); header('Content-Description: '.$this->file->name ); diff --git a/modules/cms-core/action/FolderAction.class.php b/modules/cms-core/action/FolderAction.class.php @@ -656,7 +656,7 @@ class FolderAction extends ObjectAction // Datei dem Archiv hinzufügen. $info = array(); - $info['name'] = $file->filenameWithExtension(); + $info['name'] = $file->filename(); $info['file'] = $file->loadValue(); $info['mode'] = 0600; $info['size'] = $file->size; diff --git a/modules/cms-core/action/WebdavAction.class.php b/modules/cms-core/action/WebdavAction.class.php @@ -411,7 +411,7 @@ class WebdavAction extends Action // Angabe Content-Disposition // - Bild soll "inline" gezeigt werden // - Dateiname wird benutzt, wenn der Browser das Bild speichern moechte - header('Content-Disposition: inline; filename='.$file->filenameWithExtension() ); + header('Content-Disposition: inline; filename='.$file->filename() ); header('Content-Transfer-Encoding: binary' ); header('Content-Description: '.$file->name ); diff --git a/modules/cms-core/model/BaseObject.class.php b/modules/cms-core/model/BaseObject.class.php @@ -369,19 +369,6 @@ SQL /** - * Ueberpruft einen Dateinamen auf Gueltigkeit. - */ - function goodFilename( $filename ) - { - // Dateiname muss gueltig sein, - // ungueltige Zeichen werden entfernt - $gueltig = 'abcdefghijklmnopqrstuvwxyz0123456789.-_'; - $tmp = strtr($filename, $gueltig, str_repeat('#', strlen($gueltig))); - return( strtr($this->filename, $tmp, str_repeat('-', strlen($tmp))) ); - } - - - /** * Creates a slug url out of the filename. * * @param $filename String Name @@ -404,14 +391,13 @@ SQL * Ermitteln des Dateinamens und Rueckgabe desselben * @return String Dateiname */ - function filename() + public function filename() { - global $conf; if ( $conf['filename']['edit'] && $this->filename != '' && $this->filename != $this->objectid ) { - $this->filename = $this->goodFilename(trim(strtolower($this->name))); + $this->filename = BaseObject::urlify($this->name); return $this->filename; } @@ -427,6 +413,7 @@ SQL } else { + // Filename is not edited, so we are generating a pleasant filename. switch( $conf['filename']['style'] ) { case 'longid': @@ -434,11 +421,6 @@ SQL $this->filename = base_convert(str_pad($this->objectid,6,'a'),11,10); break; - case 'id': - // Einfach die Objekt-Id als Dateinamen verwenden. - $this->filename = $this->objectid; - break; - case 'short': // So kurz wie moeglich: Erhoehen der Basis vom 10 auf 36. // Beispiele: @@ -464,12 +446,16 @@ SQL case 'title': // Achtung: Kollisionen sind möglich. - $this->filename = $this->goodFilename(trim(strtolower($this->name))); + // COLLISION ALARM! THIS IS NOT A GOOD IDEA! + $this->filename = BaseObject::urlify($this->name); break; + case 'id': default: - // Als Fallback die Objekt-Id als Dateinamen verwenden. + // Einfach die Objekt-Id als Dateinamen verwenden. $this->filename = $this->objectid; + break; + } } diff --git a/modules/cms-core/model/File.class.php b/modules/cms-core/model/File.class.php @@ -98,27 +98,29 @@ class File extends BaseObject $this->fullFilename = $filename; return $filename; } - - - - /** - * Ermitteln des Dateinamens dieser Datei (ohne Pfadangabe) - * - * @return String Kompletter Dateiname, z.B. '/pfad/datei.jpeg' - */ - function filenameWithExtension() - { - if ( $this->extension != '' ) - return $this->filename.'.'.$this->extension; - else return $this->filename; - } + + + + /** + * Ermitteln des Dateinamens dieser Datei (ohne Pfadangabe) + * + * @return String Kompletter Dateiname, z.B. '/pfad/datei.jpeg' + */ + public function filename() + { + if ( !empty( $this->extension ) ) + return parent::filename().'.'.$this->extension; + else + return parent::filename(); + + } /** - * Ermitteln aller Eigenschaften + * Ermitteln aller Eigenschaften. * - * @return Array + * @return array */ function getProperties() { diff --git a/modules/cms-core/model/Folder.class.php b/modules/cms-core/model/Folder.class.php @@ -645,6 +645,62 @@ class Folder extends BaseObject } } + /** + * Ermitteln des Dateinamens. + * @return String Dateiname + */ + public function filename() + { + $filenameConfig = config('filename'); + + if ( $filenameConfig['edit'] ) + { + if ( $this->filename == '' ) + // Filename ist eigentlich ein Pflichtfeld, daher kann dies nahezu nie auftreten. + // Rein technisch kann der Filename aber leer sein. + return $this->objectid; + else + return BaseObject::urlify($this->name); + } + else + { + // Filename is not edited, so we are generating a pleasant filename. + switch( $filenameConfig['style'] ) + { + case 'longid': + // Eine etwas laengere ID als Dateinamen benutzen + return base_convert(str_pad($this->objectid,6,'a'),11,10); + + case 'short': + // So kurz wie moeglich: Erhoehen der Basis vom 10 auf 36. + // Beispiele: + // 1 -> 1 + // 10 -> a + return base_convert($this->objectid,10,36); + + case 'md5': + // MD5-Summe als Dateinamen verwenden + // Achtung: Kollisionen sind unwahrscheinlich, aber theoretisch möglich. + return md5(md5($this->objectid)); + + case 'ss': + // Imitieren von "StoryServer" URLs. Wers braucht. + return $this->objectid; + + case 'title': + // Achtung: Kollisionen sind möglich. + // COLLISION ALARM! THIS IS NOT A GOOD IDEA! + return BaseObject::urlify($this->name); + + case 'id': + default: + // Einfach die Objekt-Id als Dateinamen verwenden. + return $this->objectid; + + } + } + } + /** * Liefert alle übergeordneten Ordner. diff --git a/modules/cms-core/model/Page.class.php b/modules/cms-core/model/Page.class.php @@ -402,11 +402,9 @@ class Page extends BaseObject */ function getFilename() { - $filename = ''; - if ( $this->cut_index && $this->filename == config('publish','default') ) { - // Link auf Index-Datei, der Dateiname bleibt leer. + return ''; // Link auf Index-Datei, der Dateiname bleibt leer. } else { @@ -439,13 +437,64 @@ class Page extends BaseObject $format = str_replace('{type}' ,$t->extension ,$format ); $format = str_replace('{type_sep}',config('publish','type_sep'),$format ); } - $filename .= $format; + return $format; } - - return $filename; } + + /** + * Ermitteln des Dateinamens dieser Seite. + * + * Wenn '$this->content_negotiation' auf 'true' steht, wird der Dateiname ggf. gekürzt, + * so wie er für HTML-Links verwendet wird. Sonst wird immer der echte Dateiname + * ermittelt. + * + * @return String Kompletter Dateiname, z.B. '/pfad/seite.en.html' + */ + function filename() + { + if ( $this->cut_index && $this->filename == config('publish','default') ) + { + return ''; // Link auf Index-Datei, der Dateiname bleibt leer. + } + else + { + $format = config('publish','format'); + $format = str_replace('{filename}',$this->filename(),$format ); + + if ( !$this->withLanguage || $this->content_negotiation && config('publish','negotiation','page_negotiate_language' ) ) + { + $format = str_replace('{language}' ,'',$format ); + $format = str_replace('{language_sep}','',$format ); + } + else + { + $l = new Language( $this->languageid ); + $l->load(); + $format = str_replace('{language}' ,$l->isoCode ,$format ); + $format = str_replace('{language_sep}',config('publish','language_sep'),$format ); + } + + if ( !$this->withModel || $this->content_negotiation && config('publish','negotiation','page_negotiate_type' ) ) + { + $format = str_replace('{type}' ,'',$format ); + $format = str_replace('{type_sep}','',$format ); + } + else + { + $t = new Template( $this->templateid ); + $t->modelid = $this->modelid; + $t->load(); + $format = str_replace('{type}' ,$t->extension ,$format ); + $format = str_replace('{type_sep}',config('publish','type_sep'),$format ); + } + return $format; + } + } + + + // function language_filename() // { // global $SESS;