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:
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;