From 0b0e405f8fe9e268b5f12fedd7a29014caa3ad4e Mon Sep 17 00:00:00 2001
From: pbarroca <pbarroca@afi-sa.fr>
Date: Thu, 10 Sep 2015 17:12:05 +0200
Subject: [PATCH] rel #21441 : custom fields metas create/delete their
 thesaurus as needed

---
 .../CustomFieldsMetaController.php            |  1 -
 library/Class/CodifThesaurus.php              | 41 +++++++++++---
 library/Class/CustomField/Meta.php            | 48 ++++++++++++++++-
 .../PseudoNotice/FacettesVisitor.php          |  3 +-
 .../CustomFieldsMetaControllerTest.php        | 41 ++++++++++++--
 .../controllers/ModulesControllerTest.php     | 54 +++++++++----------
 6 files changed, 140 insertions(+), 48 deletions(-)

diff --git a/application/modules/admin/controllers/CustomFieldsMetaController.php b/application/modules/admin/controllers/CustomFieldsMetaController.php
index bb40a95e5da..d99c1a5d4cc 100644
--- a/application/modules/admin/controllers/CustomFieldsMetaController.php
+++ b/application/modules/admin/controllers/CustomFieldsMetaController.php
@@ -36,6 +36,5 @@ class Admin_CustomFieldsMetaController extends ZendAfi_Controller_Action {
 
             'form_class_name' => 'ZendAfi_Form_Admin_CustomFields_CustomFieldMeta'];
   }
-
 }
 ?>
\ No newline at end of file
diff --git a/library/Class/CodifThesaurus.php b/library/Class/CodifThesaurus.php
index 372af9692ac..57f08074acf 100644
--- a/library/Class/CodifThesaurus.php
+++ b/library/Class/CodifThesaurus.php
@@ -28,12 +28,28 @@ class Class_CodifThesaurusLoader extends Storm_Model_Loader {
 
 
   public function findForCustomField($field) {
+    return Class_CodifThesaurus::findForCustomFieldMeta($field->getMeta());
+  }
+
+
+  public function getOrCreateForCustomField($field) {
+    return Class_CodifThesaurus::getOrCreateForCustomFieldMeta($field->getMeta());
+  }
+
+
+  public function findForCustomFieldMeta($meta) {
     return Class_CodifThesaurus::getLoader()
-      ->findFirstBy(['id_origine' => $field->getThesaurusIdOrigine(),
+      ->findFirstBy(['id_origine' => $meta->getId(),
                      'code' => Class_CodifThesaurus::CODE_CUSTOMFIELDS]);
   }
 
 
+  public function getOrCreateForCustomFieldMeta($meta) {
+    return Class_CodifThesaurus::findCustomFieldsRoot()
+        ->getOrCreateChild($meta->getId(), $meta->getLabel());
+  }
+
+
   public function findCustomFieldsRoot() {
     return Class_CodifThesaurus::getLoader()
       ->findFirstBy(['id_thesaurus' => Class_CodifThesaurus::ROOT_CUSTOMFIELD_ID]);
@@ -114,13 +130,17 @@ class Class_CodifThesaurusLoader extends Storm_Model_Loader {
   }
 
 
-  public function deleteAllWithIdOrigineAndCode($id_origine,$code_thesaurus) {
-    if ($thesauri = Class_CodifThesaurus::findAllBy(['id_origine' => $id_origine,
-                                                     'code' => $code_thesaurus ]))
-      foreach ($thesauri as $thesaurus) {
-        if ($thesaurus->getIdThesaurus()!='')
-          sqlExecute('delete from codif_thesaurus where id_thesaurus like "'.$thesaurus->getIdThesaurus().'%"');
-      }
+  public function deleteAllWithIdOrigineAndCode($id_origine, $code_thesaurus) {
+    foreach (Class_CodifThesaurus::findAllBy(['id_origine' => $id_origine,
+                                              'code' => $code_thesaurus ])
+             as $thesaurus)
+      Class_CodifThesaurus::deleteAllFrom($thesaurus);
+  }
+
+
+  public function deleteAllFrom($thesaurus) {
+    if ($thesaurus && '' != $thesaurus->getIdThesaurus())
+      sqlExecute('delete from codif_thesaurus where id_thesaurus like "' . $thesaurus->getIdThesaurus() . '%"');
   }
 
 
@@ -296,4 +316,9 @@ class Class_CodifThesaurus extends Storm_Model_Abstract {
                    'La règle n\'est pas de la forme 686$a');
 
   }
+
+
+  public function deleteMeAndMyChildren() {
+    $this->getLoader()->deleteAllFrom($this);
+  }
 }
\ No newline at end of file
diff --git a/library/Class/CustomField/Meta.php b/library/Class/CustomField/Meta.php
index a17d06c4f6d..583f680baa4 100644
--- a/library/Class/CustomField/Meta.php
+++ b/library/Class/CustomField/Meta.php
@@ -34,10 +34,12 @@ class Class_CustomField_Meta extends Storm_Model_Abstract {
 
   protected
     $_table_name = 'custom_field_meta',
+
     $_has_many = ['custom_fields' =>
                   ['model' => 'Class_CustomField',
                    'role' => 'meta',
                    'dependents' => 'delete']],
+
     $_default_attribute_values = ['label' => '',
                                   'field_type' => self::TEXT_INPUT,
                                   'options_list' => '',
@@ -47,6 +49,7 @@ class Class_CustomField_Meta extends Storm_Model_Abstract {
     return $this->getLabel();
   }
 
+
   public function getFieldTypes() {
     return
       [self::TEXT_INPUT => $this->_('Texte'),
@@ -68,7 +71,48 @@ class Class_CustomField_Meta extends Storm_Model_Abstract {
   }
 
 
-  public function getFacetLabel() {
-    return $this->getLabel();
+  public function getThesaurus() {
+    return Class_CodifThesaurus::findForCustomFieldMeta($this);
+  }
+
+
+  public function afterSave() {
+    $this->_instrumentThesaurus();
+  }
+
+
+  public function afterDelete() {
+    if ($thesaurus = $this->getThesaurus())
+      $thesaurus->deleteMeAndMyChildren();
+  }
+
+
+  protected function _instrumentThesaurus() {
+    $thesaurus = $this->getThesaurus();
+
+    if ($this->_thesaurusIsMissing($thesaurus)) {
+      Class_CodifThesaurus::getOrCreateForCustomFieldMeta($this);
+      return;
+    }
+
+    if ($this->_thesaurusShouldNotBeThere($thesaurus)) {
+      $thesaurus->deleteMeAndMyChildren();
+      return;
+    }
+
+    if ($thesaurus)
+      $thesaurus->setLibelle($this->getLabel())
+                ->setLibelleFacette($this->getLabel())
+                ->save();
+  }
+
+
+  protected function _thesaurusIsMissing($thesaurus) {
+    return $this->getIndexable() && !$thesaurus;
+  }
+
+
+  protected function _thesaurusShouldNotBeThere($thesaurus) {
+    return !$this->getIndexable() && $thesaurus;
   }
 }
\ No newline at end of file
diff --git a/library/Class/Indexation/PseudoNotice/FacettesVisitor.php b/library/Class/Indexation/PseudoNotice/FacettesVisitor.php
index b33356d1247..5266b23bfb8 100644
--- a/library/Class/Indexation/PseudoNotice/FacettesVisitor.php
+++ b/library/Class/Indexation/PseudoNotice/FacettesVisitor.php
@@ -160,8 +160,7 @@ class Class_Indexation_PseudoNotice_FacettesVisitor extends Class_Indexation_Pse
 
 
   protected function _ensureThesaurusFor($field) {
-    return Class_CodifThesaurus::findCustomFieldsRoot()
-      ->getOrCreateChild($field->getThesaurusIdOrigine(), $field->getLabel());
+    return Class_CodifThesaurus::createForCustomField($field);
   }
 
 
diff --git a/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php b/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php
index 04e91229d32..82ed5f6c1e8 100644
--- a/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php
+++ b/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php
@@ -25,6 +25,12 @@ abstract class CustomFieldsMetaControllerTestCase extends AbstractControllerTest
   public function setUp() {
     parent::setUp();
 
+    $this->fixture('Class_CodifThesaurus',
+                   ['id' => 34,
+                    'id_thesaurus' => Class_CodifThesaurus::ROOT_CUSTOMFIELD_ID,
+                    'code' => Class_CodifThesaurus::CODE_CUSTOMFIELDS,
+                    'libelle' => 'Champs personnalisés']);
+
     $this->fixture('Class_CustomField_Meta',
                    ['id' => 1,
                     'label' => 'Address',
@@ -182,7 +188,7 @@ class CustomFieldsMetaControllerEditStatusActionTest extends CustomFieldsMetaCon
 class CustomFieldsMetaControllerAddActionTest extends CustomFieldsMetaControllerTestCase {
   public function setUp() {
     parent::setUp();
-    $this->dispatch('admin/custom-fields-meta/add/id/1', true);
+    $this->dispatch('admin/custom-fields-meta/add', true);
   }
 
 
@@ -240,6 +246,15 @@ class CustomFieldsMetaControllerPostEditActionTest extends CustomFieldsMetaContr
   public function shouldBecomeIndexable() {
     $this->assertEquals(1, $this->meta->getIndexable());
   }
+
+
+  /** @test */
+  public function shouldHaveCreatedThesaurus() {
+    $this->assertNotNull(Class_CodifThesaurus::findFirstBy(['id_origine' => $this->meta->getId(),
+                                                            'code' => Class_CodifThesaurus::CODE_CUSTOMFIELDS,
+                                                            'libelle' => 'public',
+                                                            'libelle_facette' => 'public']));
+  }
 }
 
 
@@ -247,20 +262,36 @@ class CustomFieldsMetaControllerPostEditActionTest extends CustomFieldsMetaContr
 class CustomFieldsMetaControllerDeleteAddressFieldTest extends CustomFieldsMetaControllerTestCase {
   public function setUp() {
     parent::setUp();
+    $this->fixture('Class_CodifThesaurus',
+                   ['id' => 42,
+                    'id_origine' => 1,
+                    'id_thesaurus' => 'CFCF0001',
+                    'code' => Class_CodifThesaurus::CODE_CUSTOMFIELDS,
+                    'libelle' => 'public',
+                    'libelle_facette' => 'public']);
+
+    $this->onLoaderOfModel('Class_CodifThesaurus')
+         ->whenCalled('deleteAllFrom')
+         ->answers(true);
+
     $this->dispatch('admin/custom-fields-meta/delete/id/1', true);
-    Class_CustomField_Meta::clearCache();
-    Class_CustomField::clearCache();
   }
 
 
   /** @test */
   public function metaAddressShouldBeDeleted() {
-    $this->assertEmpty(Class_CustomField_Meta::find(1));
+    $this->assertNull(Class_CustomField_Meta::find(1));
   }
 
 
   /** @test */
   public function customFieldAddressShouldBeDeleted() {
-    $this->assertEmpty(Class_CustomField::find(1));
+    $this->assertNull(Class_CustomField::find(1));
+  }
+
+
+  /** @test */
+  public function shouldHaveDeletedThesaurus() {
+    $this->assertTrue(Class_CodifThesaurus::methodHasBeenCalled('deleteAllFrom'));
   }
 }
\ No newline at end of file
diff --git a/tests/application/modules/admin/controllers/ModulesControllerTest.php b/tests/application/modules/admin/controllers/ModulesControllerTest.php
index 091d2a7bdb5..50579d385c5 100644
--- a/tests/application/modules/admin/controllers/ModulesControllerTest.php
+++ b/tests/application/modules/admin/controllers/ModulesControllerTest.php
@@ -524,34 +524,34 @@ class ModulesControllerConfigRechercheResultatWithPreferencesTest
                                            'libelle' => 'Custum Facet ',
                                            'libelle_facette' => 'New Facet']);
 
-
     Class_Profil::getCurrentProfil()
       ->setCfgModules(
-        ['recherche' => ['resultatsimple' => ['suggestion_achat' => 0,
-                                          'zones_titre' => '200$e;200$f',
-                                          'titre' => 'ok',
-                                          'liste_format' => 1,
-                                          'liste_nb_par_page' => 50,
-                                          'liste_codes' => 'TAENR',
-                                          'facettes_actif' => '1',
-                                          'facettes_nombre' => '6',
-                                          'facettes_codes' => 'S;A;M;D;L;HDELF;HNEWF',
-                                          'facettes_message' => 'Affiner le résultat...',
-                                          'tags_actif' => '1',
-                                          'tags_position' => '2',
-                                          'tags_calcul' => '0',
-                                          'tags_nombre' => '30',
-                                          'tags_codes' => 'AMDPZ',
-                                          'tags_message' => 'Elargir la recherche...',
-                                          'cvs_display_position' => '0',
-                                          'cvs_resultat_titre' => 'Ressources numériques CVS',
-                                          'cvs_autres_resultats' => 'Autres documents',
-                                          'cvs_nb_result' => '5',
-                                          'cvs_msg_deco' => 'Vous devez etre connecté',
-                                          'cvs_msg_droit' => 'Merci de contacter la médiathèque pour obtenir un accès.']]]);
+        ['recherche' =>
+         ['resultatsimple' =>
+          ['suggestion_achat' => 0,
+           'zones_titre' => '200$e;200$f',
+           'titre' => 'ok',
+           'liste_format' => 1,
+           'liste_nb_par_page' => 50,
+           'liste_codes' => 'TAENR',
+           'facettes_actif' => '1',
+           'facettes_nombre' => '6',
+           'facettes_codes' => 'S;A;M;D;L;HDELF;HNEWF',
+           'facettes_message' => 'Affiner le résultat...',
+           'tags_actif' => '1',
+           'tags_position' => '2',
+           'tags_calcul' => '0',
+           'tags_nombre' => '30',
+           'tags_codes' => 'AMDPZ',
+           'tags_message' => 'Elargir la recherche...',
+           'cvs_display_position' => '0',
+           'cvs_resultat_titre' => 'Ressources numériques CVS',
+           'cvs_autres_resultats' => 'Autres documents',
+           'cvs_nb_result' => '5',
+           'cvs_msg_deco' => 'Vous devez etre connecté',
+           'cvs_msg_droit' => 'Merci de contacter la médiathèque pour obtenir un accès.']]]);
 
     $this->dispatch('/admin/modules/recherche?config=site&type_module=recherche&id_profil=2&action1=resultat&action2=simple', true);
-
   }
 
 
@@ -567,8 +567,6 @@ class ModulesControllerConfigRechercheResultatWithPreferencesTest
   }
 
 
-
-
   /** @test */
   public function facettesCodesShouldNotContainsDeletedFacet() {
     $this->assertXPath('//input[@name="facettes_codes"][@value="S;A;M;D;L;HNEWF"]',
@@ -606,14 +604,12 @@ class ModulesControllerConfigRechercheResultatWithPreferencesTest
   }
 
 
-
   /** @test */
   public function deletedFacetShouldNotAppearInDragAndDrop() {
     $this->assertNotXPath('//li[@data-code="HDELF"]', $this->_response->getBody());
   }
 
 
-
   /** @test */
   public function customFacetShouldAppearInDragAndDrop() {
     $this->assertXPathContentContains('//li[@data-code="HNEWF"]', 'New Facet', $this->_response->getBody());
@@ -893,12 +889,10 @@ class ModulesControllerRechercheWithCVSActivatePostTest
   }
 
 
-
   /** @test */
   public function afterSaveCvsDisplayPositionShouldBe0() {
     $this->assertEquals(0, $this->saved_preferences['cvs_display_position']);
   }
-
 }
 
 
-- 
GitLab