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