WIP allow to place custom-fields in tabs: fix automatic extension and use name not label

name for filename type cf is a relative path, optionally ending in a / to create a directory with all files the user uploads preserving their name
This commit is contained in:
ralf 2024-03-27 14:52:48 +02:00
parent a215015e0e
commit 44db5c68b5
4 changed files with 14 additions and 18 deletions

View File

@ -880,12 +880,6 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
attrs.type = 'vfs-upload'; attrs.type = 'vfs-upload';
delete(attrs.label); delete(attrs.label);
// fix vfs-upload id="$app:$id:$rest" e.g. "infolog:$cont[info_id]:test.pdf"
const vfs_app_id_regexp = /^#([a-z_]+):([@$][^:]+):(.*)$/;
if (attrs.id.match(vfs_app_id_regexp))
{
attrs.id = <string>this.getArrayMgr('content').expandName(attrs.id);
}
// allow to set/pass further et2_file attributes to the vfs-upload // allow to set/pass further et2_file attributes to the vfs-upload
if (field.values && typeof field.values === 'object') if (field.values && typeof field.values === 'object')
{ {

View File

@ -343,7 +343,7 @@ class Customfields extends Transformer
case 'vfs-upload': case 'vfs-upload':
$widget->attrs['path'] = $field['app'] . ':' . $widget->attrs['path'] = $field['app'] . ':' .
self::expand_name('$cont['.Api\Link::get_registry($field['app'],'view_id').']',0,0,0,0,self::$request->content). self::expand_name('$cont['.Api\Link::get_registry($field['app'],'view_id').']',0,0,0,0,self::$request->content).
':'.$field['label']; ':'.(preg_match('/^[a-z_]+:[^:]+:(.+)$/', $field['name'], $matches) ? $matches[1] : $field['name']);
break; break;
case 'link-to': case 'link-to':

View File

@ -39,7 +39,7 @@ class Vfs extends File
{ {
if ($this->type === 'vfs-upload' || !empty($this->attrs['type']) && $this->attrs['type'] === 'vfs-upload') if ($this->type === 'vfs-upload' || !empty($this->attrs['type']) && $this->attrs['type'] === 'vfs-upload')
{ {
$form_name = self::form_name($cname, $this->id, $expand ? $expand : array('cont' => self::$request->content)); $form_name = self::form_name($cname, $this->id, $expand ?: array('cont' => self::$request->content));
if (!empty($this->attrs['path'])) if (!empty($this->attrs['path']))
{ {
$path = self::expand_name($this->attrs['path'], $expand['c'] ?? null, $expand['row'], $expand['c_'] ?? null, $expand['row_'] ?? null, $expand['cont']); $path = self::expand_name($this->attrs['path'], $expand['c'] ?? null, $expand['row'], $expand['c_'] ?? null, $expand['row_'] ?? null, $expand['cont']);
@ -286,21 +286,21 @@ class Vfs extends File
{ {
$name = $_REQUEST['widget_id']; $name = $_REQUEST['widget_id'];
// Find real path // Find real path, could be "$app:$id:$path"
if($path[0] != '/') if($path[0] !== '/')
{ {
$path = self::get_vfs_path($path); $path = self::get_vfs_path($path);
} }
$filename = $file['name']; $filename = $file['name'];
if ($path && substr($path,-1) != '/') if ($path && substr($path,-1) !== '/')
{ {
// add extension to path $parts = explode('.', $filename);
$parts = explode('.',$filename); // check if path already contains a valid extension --> don't add another one
// check if path already contains a valid extension --> dont add an other one $path_parts = explode('.', Api\Vfs::basename($path));
$path_parts = explode('.', $path); if ((!($path_ext = array_pop($path_parts)) || Api\MimeMagic::ext2mime($path_ext) === 'application/octet-stream') &&
if (count($path_parts) > 2 && (!($extension = array_pop($path_parts)) || !Api\MimeMagic::ext2mime($extension)) && ($extension = array_pop($parts) ?: Api\MimeMagic::mime2ext($file['mime'])))
($extension = array_pop($parts)) && Api\MimeMagic::ext2mime($extension)) // really an extension --> add it to path
{ {
// add extension to path
$path .= '.'.$extension; $path .= '.'.$extension;
} }
$file['name'] = Api\Vfs::basename($path); $file['name'] = Api\Vfs::basename($path);

View File

@ -637,7 +637,9 @@ class Customfields implements \IteratorAggregate
protected static function handle_file($entry_id, $field, $value) protected static function handle_file($entry_id, $field, $value)
{ {
$path = Api\Etemplate\Widget\Vfs::get_vfs_path($field['app'].":$entry_id:".$field['label']); $path = Api\Etemplate\Widget\Vfs::get_vfs_path($field['app'].':'.$entry_id.':'.
(preg_match('/^[a-z_]+:[^:]+:(.+)$/', $field['name'], $matches) ? $matches[1] : $field['name']));
if($path) if($path)
{ {
foreach($value as $file) foreach($value as $file)