diff --git a/VERSIONS_HOTLINE/95190 b/VERSIONS_HOTLINE/95190 new file mode 100644 index 0000000000000000000000000000000000000000..cbf5ca4b528b2f2ad21ea7a7e7e4b9bf81f4d4f9 --- /dev/null +++ b/VERSIONS_HOTLINE/95190 @@ -0,0 +1 @@ +hotline #95190 : Administration : Export CSV des medias \ No newline at end of file diff --git a/application/modules/admin/controllers/AlbumController.php b/application/modules/admin/controllers/AlbumController.php index 4d972393113e1900243bee4479d5374bddb21a40..9dbf72058adabdabc10be8d5aae05d9e67615e5c 100644 --- a/application/modules/admin/controllers/AlbumController.php +++ b/application/modules/admin/controllers/AlbumController.php @@ -119,7 +119,8 @@ class Admin_AlbumController extends ZendAfi_Controller_Action { $form = $this->_formImportEAD(); $this->view->form_import_ead = $form; - $this->view->form_export_ead = $this->_formExportEad(); + $this->view->form_export_ead = $this->_formExport(); + $this->view->form_export_csv = $this->_formExport('csv'); if (!$this->_request->isPost()) return; @@ -159,12 +160,12 @@ class Admin_AlbumController extends ZendAfi_Controller_Action { } - protected function _formExportEAD() { + protected function _formExport($type='ead') { return $this->view ->newForm(['id' => 'export_ead', 'class' => 'form']) ->setMethod('post') ->setAttrib('enctype', 'multipart/form-data') - ->setAction($this->view->url(['action' => 'export-ead'])) + ->setAction($this->view->url(['action' => 'export-'.$type])) ->addElement('select', 'cat_id', ['style' => 'max-width:445px;', @@ -172,12 +173,34 @@ class Admin_AlbumController extends ZendAfi_Controller_Action { 'required' => true, 'multiOptions' => ['' => $this->_('Choisissez une catégorie')] + Class_AlbumCategorie::getAllLibelles()]) - ->addElement('submit', 'submit', ['label' => 'Exporter en EAD']); + ->addElement('submit', 'submit', ['label' => 'Exporter en ' . strtoupper($type)]); + } + + + public function exportCsvAction() { + $description = (new Class_TableDescription('ressources')) + ->addColumn($this->_('Categorie'), 'album_category_absolute_path') + ->addColumn($this->_('Titre Album'), 'titre_album') + ->addColumn($this->_('Description Album'), 'description_album') + ->addColumn($this->_('Date'), 'annee') + ->addColumn($this->_('Créateur'), 'auteur') + ->addColumn($this->_('Editeur'), 'editeur') + ->addColumn($this->_('Titre'), 'titre') + ->addColumn($this->_('Description'), 'description') + ->addColumn($this->_('Ressource'), 'play_ressource_url'); + $categories = [Class_AlbumCategorie::find($this->_getParam('cat_id',1))]; + + $datas = []; + foreach(Class_AlbumCategorie::getAlbumsFromCategories([$this->_getParam('cat_id',1)]) as $album) + $datas = array_merge($album->getRessources(),$datas); + return $this->_helper->csv('export.csv', + $this->view->renderCsv($description, $datas)); + } public function exportEadAction() { - $form = $this->_formExportEAD(); + $form = $this->_formExport(); if ($form->isValid($this->_request->getPost())) { $this->getHelper('ViewRenderer')->setNoRender(); $response = $this->_response; diff --git a/application/modules/admin/views/scripts/album/import-ead.phtml b/application/modules/admin/views/scripts/album/import-ead.phtml index cdc4995e225ee44e3917f7099031f4fdfd589197..7985bb47262e4f52597171ccfea3d5973f1f4afe 100644 --- a/application/modules/admin/views/scripts/album/import-ead.phtml +++ b/application/modules/admin/views/scripts/album/import-ead.phtml @@ -3,4 +3,5 @@ echo $this->tag('h2', $this->_('Import')); echo $this->renderForm($this->form_import_ead); echo $this->tag('h2', $this->_('Export')); echo $this->renderForm($this->form_export_ead); +echo $this->renderForm($this->form_export_csv); ?> diff --git a/library/Class/AlbumRessource.php b/library/Class/AlbumRessource.php index 9912bf5c92cd594f381af9bc2b1c5a405f221e4f..58fe6b96890be587a1c7ae8c27551a6db0d4f04a 100644 --- a/library/Class/AlbumRessource.php +++ b/library/Class/AlbumRessource.php @@ -138,6 +138,14 @@ class Class_AlbumRessource extends Storm_Model_Abstract { } + /** + * @return String + */ + public function getDescriptionAlbum() { + return $this->getAlbum()->getDescription(); + } + + /** * @return string */ @@ -146,6 +154,14 @@ class Class_AlbumRessource extends Storm_Model_Abstract { } + /** + * @return string + */ + public function getAlbumCategoryAbsolutePath() { + return $this->getAlbum()->getCategorie()->getAbsolutePath(); + } + + /** * @return String */ diff --git a/library/ZendAfi/View/Helper/RenderCsv.php b/library/ZendAfi/View/Helper/RenderCsv.php index 35bbeb21b5ac20ee6e16208f4a7c0086c755322f..3069bbc315660c3bd6ae7aad3560cc837757eaf7 100644 --- a/library/ZendAfi/View/Helper/RenderCsv.php +++ b/library/ZendAfi/View/Helper/RenderCsv.php @@ -73,7 +73,7 @@ class ZendAfi_View_Helper_RenderCsv extends ZendAfi_View_Helper_BaseHelper { ->_description ->columnsCollect(function($column) use ($model) { - return $column->renderModelOn($model, $this); + return $column->renderModelOn($model,$this); }); return $this->_values; } @@ -91,4 +91,4 @@ class ZendAfi_View_Helper_RenderCsv extends ZendAfi_View_Helper_BaseHelper { public function renderModelAction($model, $description) { } } -?> \ No newline at end of file +?> diff --git a/scripts/export_csv_category.php b/scripts/export_csv_category.php new file mode 100755 index 0000000000000000000000000000000000000000..bf988c1d4bdfc8056509822a2abe4bedebe9ce81 --- /dev/null +++ b/scripts/export_csv_category.php @@ -0,0 +1,45 @@ +<?php +error_reporting(E_ERROR | E_PARSE); +require(__DIR__.'/../console.php'); + +class Scripts_ExportCsvCategory extends ZendAfi_Controller_Action{ + + public function __construct($cat_id, $filename){ + $usage = "usage : php export_category_csv.php catid filename.csv + + catid = id category à utiliser pour l'export + + filename = nom du fichier à générer +"; + +if (!isset($cat_id) || !($categories = Class_AlbumCategorie::find($cat_id))){ + print $usage; +} + + +$description = (new Class_TableDescription('ressources')) + ->addColumn($this->_('Categorie'), 'album_category_absolute_path') + ->addColumn($this->_('Titre Album'), 'titre_album') + ->addColumn($this->_('Description Album'), 'description_album') + ->addColumn($this->_('Date'), 'annee') + ->addColumn($this->_('Créateur'), 'auteur') + ->addColumn($this->_('Editeur'), 'editeur') + ->addColumn($this->_('Titre'), 'titre') + ->addColumn($this->_('Description'), 'description') + ->addColumn($this->_('Ressource'), 'play_ressource_url'); + +$datas = []; +foreach(Class_AlbumCategorie::getAlbumsFromCategories([$cat_id]) as $album) + $datas = array_merge( $album->getRessources(),$datas); + + +$handle = fopen($filename?$filename:'export.csv','w'); + +$zf_render_csv = new ZendAfi_View_Helper_RenderCsv(); +fwrite($handle, $zf_render_csv->renderCsv($description, $datas)); +fclose($handle); + +} +} +new Scripts_ExportCsvCategory($argv[1], $argv[2]); +?> diff --git a/tests/application/modules/admin/controllers/AlbumControllerTest.php b/tests/application/modules/admin/controllers/AlbumControllerTest.php index 385cc9044c1f45376b881bcd583b81a90fc06622..79ff16ab2cf39ff3e87aa469ad6068cf5b05a7f5 100644 --- a/tests/application/modules/admin/controllers/AlbumControllerTest.php +++ b/tests/application/modules/admin/controllers/AlbumControllerTest.php @@ -2956,6 +2956,78 @@ abstract class ControllerAlbumMultiMediasTestCase extends Admin_AlbumControllerT +class AlbumControllerMultiMediasExportCSV extends ControllerAlbumMultiMediasTestCase { + protected $_csv = []; + + public function setUp() { + parent::setUp(); + + $this->fixture('Class_AlbumCategorie', + ['id' => '34', + 'libelle' => 'Jeunesse']); + + Class_AlbumCategorie::find(33) + ->setParentCategorie(Class_AlbumCategorie::find(34)) + ->save(); + + Class_Album::find('999') + ->AddEditor('Dargaud') + ->setAnnee('2019'); + + $this->postDispatch('/admin/album/export-csv', + ['cat_id' => 34], + true); + $this->_csv = array_map(function($line) { return str_getcsv($line, ";", '"'); }, + explode("\n", rtrim($this->_response->getBody()))); + } + + + /** @test */ + public function responseBodyShouldBeAttachment() { + $this->assertHeaderContains('Content-Disposition', 'attachment'); + } + + + /** @test */ + public function csvShouldCountFiveLines() { + $this->assertCount(5, $this->_csv); + } + + + /** @test */ + public function firstRowShouldContainsAllHeaders() { + // cannot assertEquals entire row due to array sort diff between php5 and php7 + foreach(['Categorie', "Titre Album", "Description Album", 'Date', 'Créateur', 'Editeur', 'Titre', 'Description', 'Ressource'] + as $header) + $this->assertContains($header, $this->_csv[0]); + } + + + /** @test + */ + public function secondRowShouldContainsValuesForAlbum() { + // cannot assertEquals entire row due to array sort diff between php5 and php7 + foreach(['Jeunesse > Comics', 'Plein de medias', '<p>pour passer la soirée</p>', '2019','Titi','Dargaud'] + as $value) + $this->assertContains($value, $this->_csv[1]); + } + + + /** @test + */ + public function thirdRowShouldContainsValuesForBatmanDarkKnightRessource() { + foreach(['Batman Dark Knight', 'Une nouvelle aventure du justicier noir' ] + as $value) + $this->assertContains($value, $this->_csv[2]); + + $this->assertEquals(1, substr_count($this->_csv[2][8], + '/bib-numerique/play-ressource/id')); + } +} + + + + class AlbumControllerMultiMediasExportEAD extends ControllerAlbumMultiMediasTestCase { public function setUp() { parent::setUp();