]> git.agnieray.net Git - galette.git/commitdiff
Handle old filenames for non members dynamic files; refs #1697
authorJohan Cwiklinski <johan@x-tnd.be>
Wed, 11 Oct 2023 17:07:35 +0000 (19:07 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Thu, 12 Oct 2023 16:42:41 +0000 (18:42 +0200)
galette/lib/Galette/Controllers/Crud/DynamicFieldsController.php
galette/lib/Galette/DynamicFields/File.php
galette/lib/Galette/Features/Dynamics.php

index 757d91d344ec19dc4a0e62cc0e340080ed2b3baf..367d3138e0291e949e17d0ca690c1ec92bdadadd 100644 (file)
@@ -307,10 +307,11 @@ class DynamicFieldsController extends CrudController
             ->disableAllDeps()
             ->enableDep('dynamics')
             ->load($id);
+        $fields = $object->getDynamicFields()->getFields();
+        $field = $fields[$fid] ?? null;
 
         $denied = null;
         if (!$object->canShow($this->login)) {
-            $fields = $object->getDynamicFields()->getFields();
             if (!isset($fields[$fid])) {
                 //field does not exist or access is forbidden
                 $denied = true;
@@ -341,42 +342,11 @@ class DynamicFieldsController extends CrudController
                 );
         }
 
-        if ($form_name === 'adh') {
-            $form_name = 'member'; //for compatibility with existing files
-        }
-        $filename = str_replace(
-            [
-                '%form',
-                '%oid',
-                '%fid',
-                '%pos'
-            ],
-            [
-                $form_name,
-                $id,
-                $fid,
-                $pos
-            ],
-            '%form_%oid_field_%fid_value_%pos'
-        );
+        $filename = $field->getFileName($id, $pos);
 
         if ($form_name !== 'member' && !file_exists(GALETTE_FILES_PATH . $filename)) {
             //handle old names for non adh dynamic files
-            $test_filename = str_replace(
-                [
-                    '%form',
-                    '%oid',
-                    '%fid',
-                    '%pos'
-                ],
-                [
-                    'member',
-                    $id,
-                    $fid,
-                    $pos
-                ],
-                '%form_%oid_field_%fid_value_%pos'
-            );
+            $test_filename = $field->getFileName($id, $pos, 'member');
             if (file_exists(GALETTE_FILES_PATH . $test_filename)) {
                 //rename old file to new name
                 rename(GALETTE_FILES_PATH . $test_filename, GALETTE_FILES_PATH . $filename);
index 2bddce820a7319b7037b9193ca7e5dfddd36516b..f80459566a92a935eb1fa371b784735cb1f722ba 100644 (file)
@@ -76,4 +76,39 @@ class File extends DynamicField
     {
         return self::FILE;
     }
+
+    /**
+     * Get file name on disk
+     *
+     * @param int         $id     Object (member, contribution, ...) ID
+     * @param int         $pos    Position in the list of values  (0-based)
+     * @param string|null $prefix Forced file prefix; if null (defaults) form_name wil be used verbatim
+     *
+     * @return string
+     */
+    public function getFileName(int $id, int $pos, string $prefix = null): string
+    {
+        $form_name = $this->form;
+        if ($form_name === 'adh') {
+            $form_name = 'member'; //fix expected filename
+        }
+
+        $filename = str_replace(
+            [
+                '%form',
+                '%oid',
+                '%fid',
+                '%pos'
+            ],
+            [
+                $prefix ?? $form_name,
+                $id,
+                $this->id,
+                $pos
+            ],
+            '%form_%oid_field_%fid_value_%pos'
+        );
+
+        return $filename;
+    }
 }
index f3ad505788c634f980e512d031a25a4d5e134f3e..607e7d4bd9af70685849a2f314be2abe39d7e240 100644 (file)
@@ -36,6 +36,7 @@
 
 namespace Galette\Features;
 
+use Galette\Entity\Adherent;
 use Galette\Repository\DynamicFieldsSet;
 use Throwable;
 use Analog\Analog;
@@ -164,14 +165,14 @@ trait Dynamics
                 } else {
                     if ($fields[$field_id] instanceof File) {
                         //delete checkbox
-                        $filename = sprintf(
-                            'member_%d_field_%d_value_%d',
-                            $this->id,
-                            $field_id,
-                            $val_index
-                        );
+                        $filename = $fields[$field_id]->getFileName($this->id, $val_index);
                         if (file_exists(GALETTE_FILES_PATH . $filename)) {
                             unlink(GALETTE_FILES_PATH . $filename);
+                        } elseif (!$this instanceof Adherent) {
+                            $test_filename = $fields[$field_id]->getFileName($this->id, $val_index, 'member');
+                            if (file_exists(GALETTE_FILES_PATH . $test_filename)) {
+                                unlink(GALETTE_FILES_PATH . $test_filename);
+                            }
                         }
                         $this->dynamics->setValue($this->id, $field_id, $val_index, '');
                     } else {