From e904311d8b5e543c7761f76d9b48d777142dea4f Mon Sep 17 00:00:00 2001
From: gloas <gloas@afi-loas.afi-sa.net>
Date: Thu, 6 Feb 2014 11:41:48 +0100
Subject: [PATCH] rel #8257 we can now add collections to album

---
 library/Class/Album.php                       | 40 ++++++++++++++++++-
 library/Class/Indexation/PseudoNotice.php     | 19 ++++++++-
 library/Class/Notice.php                      |  1 +
 library/ZendAfi/Form/Album.php                | 23 ++++++++++-
 .../admin/controllers/AlbumControllerTest.php | 33 ++++++++++++++-
 5 files changed, 111 insertions(+), 5 deletions(-)

diff --git a/library/Class/Album.php b/library/Class/Album.php
index 046023fc2d5..5b5eb610a7b 100644
--- a/library/Class/Album.php
+++ b/library/Class/Album.php
@@ -78,6 +78,7 @@ class Class_Album extends Storm_Model_Abstract {
 	const URI_TYPE_EXTERNAL_URI = 'external_uri';
 	const AUTHOR_FIELD = '701';
 	const EDITOR_FIELD = '210';
+	const COLLECTION_FIELD = '225';
 	
 	
 	protected static $DEFAULT_THUMBNAIL_VALUES;
@@ -789,11 +790,12 @@ class Class_Album extends Storm_Model_Abstract {
 		$this->updateDateMaj();
 		$this->collectAuthors();
 		$this->collectEditors();
+		$this->collectCollections();
 	}
 
 
 	public function collectAuthors() {
-		$authors = $this->_collect('authors',self::AUTHOR_FIELD);
+		$authors = $this->_collect('authors', self::AUTHOR_FIELD);
 		if(isset($authors['author']))
 			foreach($authors['author'] as $k => $v)
 				$this->addAuthor($v, $authors['fonction'][$k]);
@@ -807,6 +809,14 @@ class Class_Album extends Storm_Model_Abstract {
 				$this->addEditor($v);
 	}
 
+
+	public function collectCollections() {
+		$collections = $this->_collect('collections', self::COLLECTION_FIELD);
+		if(isset($collections['collection']))
+			foreach($collections['collection'] as $k => $v)
+				$this->addCollection($v);
+	}
+
 	
 	protected function _collect($field, $zone) {
 		if (!isset($this->_attributes[$field]))
@@ -1440,6 +1450,22 @@ class Class_Album extends Storm_Model_Abstract {
 	}
 
 
+	/**
+	 * Collection from unimarc container
+	 * @return array
+	 */
+	public function getCollections() {
+		return array_filter(
+			array_map(
+				function($item) {
+					return (!is_array($item) || self::COLLECTION_FIELD !== $item['field']
+									|| !isset($item['data']) || !isset($item['data']['a'])) ? 
+						null : $item['data']['a'];
+				}, 
+				$this->getNotesAsArray()));
+	}
+	
+
 	/**
 	 * add author in unimarc container if not present with the same function
 	 */
@@ -1478,6 +1504,16 @@ class Class_Album extends Storm_Model_Abstract {
 		
 		return $this->addSubField('210', 'c', $name);
 	}
-}
 
+
+	/**
+	 * add collection in unimarc container if not present with the same function
+	 */
+	public function addCollection($name) {
+		if (!$name)
+			return $this;
+		
+		return $this->addZone(self::COLLECTION_FIELD,['a' => $name]);
+	}
+}
 ?>
\ No newline at end of file
diff --git a/library/Class/Indexation/PseudoNotice.php b/library/Class/Indexation/PseudoNotice.php
index 39f2b9c0c62..06ba73e36f2 100644
--- a/library/Class/Indexation/PseudoNotice.php
+++ b/library/Class/Indexation/PseudoNotice.php
@@ -116,6 +116,7 @@ class Class_Indexation_PseudoNotice {
 																	'tags' => '',
 																	'sous_titre' => '',
 																	'editeur' => '',
+																	'collection' => '',
 																	'titre' => '',
 																	'annee' => '',
 																	'id_langue' => '',
@@ -211,6 +212,14 @@ class Class_Indexation_PseudoNotice {
 	}
 
 
+	protected function extractCollections() {
+	  $collections = [];
+		if ($this->_dataExist('collection'))
+			$collections[] = $this->_datas['collection'];
+		return array_filter($collections);
+	}
+
+
 	protected function extractTitles() {
 		return $this->_datas['titre'];
 	}
@@ -272,6 +281,7 @@ class Class_Indexation_PseudoNotice {
 			->visitSubTitle($this->_datas['sous_titre'])
 			->visitTitle($this->_datas['titre'])
 			->visitEditors($this->extractEditors())
+			->visitCollection($this->extractCollections())
 			->visitYear($this->_datas['annee'])
 			->visitLanguageId($this->_datas['id_langue'])
 			->visitDescription($this->_datas['description'])
@@ -342,13 +352,20 @@ class Class_Indexation_PseudoNotice_Album extends Class_Indexation_PseudoNotice{
 		return array_unique($authors);
 	}
 
-
+	
 	protected function extractEditors() {
 		return array_unique(array_merge(parent::extractEditors(), 
 																		$this->_model->getEditors()));
 	}
 
 
+	/** @return array */
+	protected function extractCollections() {
+	  return array_unique(array_merge(parent::extractCollections(), 
+																		$this->_model->getCollections()));
+	}
+
+
 	protected function extractTitles() {
 		$titles = [parent::extractTitles()];
 		foreach($this->_model->getRessources() as $ressource) 
diff --git a/library/Class/Notice.php b/library/Class/Notice.php
index e4012dc5d85..f953e52bd86 100644
--- a/library/Class/Notice.php
+++ b/library/Class/Notice.php
@@ -158,6 +158,7 @@ class Class_Notice extends Storm_Model_Abstract {
 																					'titres' => '',
 																					'auteurs' => '',
 																					'editeur' => '',
+																					'collection' => '',
 																					'date_maj' => '',
 																					'collection' => '',
 																					'matieres' => '',
diff --git a/library/ZendAfi/Form/Album.php b/library/ZendAfi/Form/Album.php
index 6a215d3625e..22303c31765 100644
--- a/library/ZendAfi/Form/Album.php
+++ b/library/ZendAfi/Form/Album.php
@@ -30,6 +30,7 @@ class ZendAfi_Form_Album extends ZendAfi_Form {
 			->addDurationFor($album)
 			->addAuthorsFor($album)
 			->addEditorsFor($album)
+			->addCollectionsFor($album)
 			->addRightsFor($album)
 			->addVignetteFor($album)
 			->addFileFor($album)
@@ -55,6 +56,10 @@ class ZendAfi_Form_Album extends ZendAfi_Form {
 			->addDisplayGroup(['editors'], 
 												'editors',
 												['legend' => $form->_('Editors')])
+
+			->addDisplayGroup(['collections'], 
+												'collections',
+												['legend' => $form->_('Collections')])
  
 			->addDisplayGroup(['droits',
 					               'droits_precision',
@@ -119,6 +124,16 @@ class ZendAfi_Form_Album extends ZendAfi_Form {
 		return $this;
 	}
 
+	public function addCollectionsFor($album) {
+		$values = ['collection' => []];
+		$datas=$album->getDatasOfField(Class_Album::COLLECTION_FIELD);
+		foreach($datas as $data) {
+			$values['collection'][] = $data['a'];
+		}
+		$this->collections->setValues($values);
+		return $this;
+	}
+
 
 	public function init() {
 		parent::init();
@@ -205,7 +220,13 @@ class ZendAfi_Form_Album extends ZendAfi_Form {
 									 ['label' => 'Editors',
 										'fields' => [['name' => 'editor', 'label' => 'Name']	],
 									 'values' => ['editor' => []],
-									 'deleteMessage' => ' this editor']);
+									 'deleteMessage' => ' this editor'])
+
+			->addElement('multiInput', 'collections', 
+									 ['label' => 'Collections',
+										'fields' => [['name' => 'collection', 'label' => 'Name']	],
+										'values' => ['collection' => []],
+										'deleteMessage' => ' this collection']);
 	}
 
 
diff --git a/tests/application/modules/admin/controllers/AlbumControllerTest.php b/tests/application/modules/admin/controllers/AlbumControllerTest.php
index c2d477413ea..14b94420ae2 100644
--- a/tests/application/modules/admin/controllers/AlbumControllerTest.php
+++ b/tests/application/modules/admin/controllers/AlbumControllerTest.php
@@ -650,6 +650,12 @@ class Admin_AlbumControllerAddAlbumToPatrimoineTest extends Admin_AlbumControlle
 	public function divMultiInputsEditorsShouldBeBeVisible() {
 		$this->assertXPath('//div[@id="multi_inputs_editors"]');
 	}
+
+
+	/** @test */
+	public function divMultiInputsCollectionsShouldBeBeVisible() {
+		$this->assertXPath('//div[@id="multi_inputs_collections"]');
+	}
 }
 
 
@@ -696,6 +702,7 @@ class Admin_AlbumControllerPostAlbumRenaissanceToPatrimoineTest extends Admin_Al
 												 'author' => ['pba', 'lla'],
 												 'fonction' => ['realisateur', 'bassiste'],
 												 'editor' => ['Glo' , 'Pba'],
+												 'collection' => ['Ratm', 'Soad'],
 												 'duration' => '00:04:08']);
 		$this->new_album = Class_Album::findFirstBy(['order'=>'id desc']);
 		$this->new_notice = $this->new_album->getNotice();
@@ -718,7 +725,7 @@ class Admin_AlbumControllerPostAlbumRenaissanceToPatrimoineTest extends Admin_Al
 	public function newAlbumDescriptionShouldBeOeuvresMajeures() {
 		$this->assertEquals('Oeuvres majeures sous François 1er', $this->new_album->getDescription());
 	}
-
+ 
 
 	/** @test */
 	public function shouldRedirectToEditAlbum() {
@@ -745,12 +752,24 @@ class Admin_AlbumControllerPostAlbumRenaissanceToPatrimoineTest extends Admin_Al
 	}
 
 
+
 	/** @test */
 	public function shouldHaveEditorPba() {
 		$this->assertContains('Pba', $this->new_album->getEditors());
 	}
 
 
+/** @test */
+	public function shouldHaveCollectionRatm() {
+		$this->assertContains('Ratm', $this->new_album->getCollections());
+	}
+
+
+/** @test */
+	public function shouldHaveCollectionSoad() {
+		$this->assertContains('Soad', $this->new_album->getCollections());
+	}
+
 
 	/** @test */
 	public function pseudoNoticeShouldBeIndexed() {
@@ -810,6 +829,12 @@ class Admin_AlbumControllerPostAlbumRenaissanceToPatrimoineTest extends Admin_Al
 	public function shouldHaveEditorGloInNotice() {
 		$this->assertContains('Glo', $this->new_notice->getEditeur());
 	}
+
+
+	/** @test */
+	public function shouldHaveCollectionRatmInCollection() {
+		$this->assertContains('Ratm', $this->new_notice->getCollection());
+	}
 }
 
 
@@ -885,6 +910,7 @@ class Admin_AlbumControllerEditAlbumMesBDTest extends Admin_AlbumControllerTestC
 			->setDuration('00:05:00')
 			->addAuthor('Pba')
 			->addEditor('Glo')
+			->addCollection('Ratm')
 			->save();
 		$this->dispatch('/admin/album/edit_album/id/43', true);
 	}
@@ -1127,6 +1153,11 @@ class Admin_AlbumControllerEditAlbumMesBDTest extends Admin_AlbumControllerTestC
 		$this->assertXPathContentContains('//div[@id="multi_inputs_editors"]/following-sibling::script','Glo',$this->_response->getBody());
 	}
 
+
+	/** @test */
+	public function pageShouldContainsScriptWithCollectionRatm() {
+		$this->assertXPathContentContains('//div[@id="multi_inputs_collections"]/following-sibling::script','Ratm',$this->_response->getBody());
+	}
 }
 
 
-- 
GitLab