Commit d7f7b4c6 authored by Laurent's avatar Laurent

Merge branch 'master' into sandbox_author_page_ina

Conflicts:
	cosmogramme/sql/patch/patch_362.php
	tests/db/UpgradeDBTest.php
parents 46a59377 c9f84563
'69586' =>
['Label' => $this->_('Inclure des articles dans les lettres d/'information'),
'Desc' => $this->_('Bokeh permet d\'envoyer des articles dans les lettres d\'information.'),
'Image' => '',
'Video' => '',
'Category' => $this->_('Rédaction'),
'Right' => function($feature_description, $user) {return true;},
'Wiki' => 'http://wiki.bokeh-library-portal.org/index.php?title=Lettre_d\'information',
'Test' => '',
'Date' => '2018-01-10'],
\ No newline at end of file
'80658' =>
['Label' => $this->_('Facettes dynamiques sur des sous-chaînes de champs unimarc'),
'Desc' => $this->_('Vous pouvez créer des facettes sur des portions d\'un champ unimarc. Par exemple, sur un champ 993$w formatté comme ceci: 2018-05-04, vous pouvez créer trois facettes sur l\'année, le mois et le jour.')',
'Image' => 'http://wiki.bokeh-library-portal.org/images/4/41/Dynamic_facet_public.png',
'Video' => 'https://youtu.be/KYYN22dqhnM',
'Category' => '',
'Right' => function($feature_description, $user) {return true;},
'Wiki' => 'http://wiki.bokeh-library-portal.org/index.php?title=Facettes_dynamiques#A_partir_d.27une_partie_du_libell.C3.A9_d.27un_champ_unimarc',
'Test' => '',
'Date' => '2019-01-18'],
\ No newline at end of file
28/01/2019 - v7.12.56
- ticket #85532 : Administration : Les tickets d'assistance au statut "Réaliser à tester" sont comptabilisés dans le menu haut "Assistance"
- ticket #84896 : SIGB Nanook : activation de la réinitialisation des mots de passe par courriel
21/01/2019 - v7.12.55
- ticket #83545 : Administration, contrôle des URLS : corrections de la prise en charge des URLs contenant des caractères spéciaux
- ticket #84158 : Boite agenda : correction de l'affichage des articles avec des jours récurrents sélectionnés.
- ticket #84810 : Intégration Cosmogramme : augmentation de la taille maximale des code-barres.
- ticket #84064 : Boîte bibliothèque / ouvertures: lorsqu'une journée est fermée dans une plage exceptionnelle, affiche explicitement "fermé" pour cette journée
10/01/2019 - v7.12.54
- ticket #82189 : Connecteur LeKiosk : correction de la mise à jour lors du moissonage
- ticket #78084 : Administration des albums : correction du chargement d'une feuille de style incorrecte lors de l'ajout de médias
- ticket #82201 : Intégrations : optimisation de l'indexation des ressources numériques
08/01/2019 - v7.12.53
- ticket #84476 : SIGB Orphee correction authentification avec WS configuré en authentification SIGB uniquement
......
- ticket #82189 : Connecteur LeKiosk : correction de la mise à jour lors du moissonage
\ No newline at end of file
- ticket #69586 : Newsletter : Ajout de la possibilité d'inclure des articles dans les newsletters
\ No newline at end of file
- ticket #80658 : Facettes dynamiques : possibilité de créer des facettes dynamiques sur des dates
\ No newline at end of file
- ticket #80876 : Abonnés : Ajout de la possibilité d'utiliser la fonction mot de passe oublié même si l'usager ne s'est encore jamais connecté sur Bokeh
\ No newline at end of file
- ticket #81435 : Catalogue : Affichage basique d'une notice autorité
\ No newline at end of file
- ticket #83983 : Amélioration de l'ergonomie de la navigation dans l'administration des bibliothèques
\ No newline at end of file
- ticket #84280 : Cosmogramme : correction de la détection des fichiers en attente composés avec une date
\ No newline at end of file
- ticket #85632 : Administration : Variables : ajout de la colonne niveau d'accès et ouverture de certaines variables au rôle administrateur.
\ No newline at end of file
- ticket #85637 : Administration : maintenance des entrées de menu gauche et ajout de liens vers la documentation.
\ No newline at end of file
- ticket #85748 : Administration : activation des fonctionnalités de la version 8.0 Suricate Semantic.
\ No newline at end of file
- ticket #85822 : Maintenance : Retrait d'un lien obsolète vers les composants Flash non supportés
\ No newline at end of file
- ticket #86010 : Administration : activation des fonctionnalités de la version 8.0 .
\ No newline at end of file
......@@ -51,18 +51,6 @@ class Admin_BibController extends ZendAfi_Controller_Action {
}
public function localisationsAction() {
$cls_loc = new Class_Localisation();
$id_bib = (int)$this->_request->getParam('id_bib');
$this->view->id_bib = $id_bib;
if (!$bib=Class_Bib::find($id_bib))
return $this->_redirect('admin/bib/index');
$this->view->nom_bib = $bib->getLibelle();
$this->view->localisations = $bib->getLocalisations();
$this->view->titre = $this->view->_("Localisations de la bibliothèque: %s",
$this->view->nom_bib);
}
protected function _checkPost($localisation) {
$this->view->localisation = $localisation;
......@@ -186,19 +174,6 @@ class Admin_BibController extends ZendAfi_Controller_Action {
}
public function plansAction() {
$cls_loc = new Class_Localisation();
$id_bib = (int)$this->_request->getParam('id_bib');
if (!$bib= Class_Bib::find($id_bib))
return $this->_redirect('admin/');
$this->view->id_bib = $id_bib;
$this->view->nom_bib = $bib->getLibelle();
$this->view->plans = $bib->getPlans();
$this->view->titre = $this->view->_('Plans de la bibliothèque: %s', $this->view->nom_bib);
}
public function addplanAction() {
if (!$bib = $this->getBib())
return;
......
......@@ -65,12 +65,20 @@ class Admin_OuverturesController extends ZendAfi_Controller_Action {
}
public function indexAction() {
$this->_forward('list');
}
public function listAction() {
parent::indexAction();
if ($this->_response->isRedirect())
return;
$this->view->multimedia = $this->_is_multimedia;
$this->view->model_name = 'library';
$this->view->library = $this->_library;
$form =
$this->_newHolidaysForm()
......
......@@ -46,8 +46,7 @@ $(document).ready(function () {
});");
$this->view->headLink()
->appendStylesheet(URL_CSS . 'global.css')
->appendStylesheet(URL_ADMIN_JS . 'multi_upload/fileuploader.css');
->appendStylesheet(URL_ADMIN_JS . 'multi_upload/fileuploader.css');
$this->_helper->getHelper('viewRenderer')->setLayoutScript('empty.phtml');
}
......
<?php
Class_ScriptLoader::getInstance()->addSearchInputToContent($this->_('Filtrer les variables'));
?>
Class_ScriptLoader::getInstance()
->addSearchInputToContent($this->_('Filtrer les variables'))
->addFontAwesome();
<table id="adminvars">
<thead>
<tr class="soustitre">
<th><?php echo $this->_('Clef'); ?></th>
<th><?php echo $this->_('Valeur'); ?></th>
<th><?php echo $this->_('action'); ?></th>
</tr>
</thead>
<tbody>
<?php
$ligne = 0;
foreach($this->vars as $var) {
$ligne ++ ;
$edit_url = $this->url(['controller' => 'index',
'action' => 'adminvaredit',
'cle' => $var->getClef()]);
?>
<tr data-adminvar= "<?php echo $var->getClef(); ?>" class="<?php echo ($ligne & 1) ? "first" : "second";?>">
<td style="vertical-align:top;" >
<?php echo $var->getDescription();?>
<br><sub><a data-popup="true" href="<?php echo $edit_url; ?>">
<?php echo $var->getClef();?></a></sub>
</td>
<td>
<?php
echo ($renderer = $var->getRenderer())
? $renderer($var->getValeur(), $this)
: $this->adminVar($var);
?>
</td>
<td style="width:2%;text-align:center">
<a data-popup="true" href="<?php echo $edit_url; ?>"><?php echo $this->boutonIco("type=edit");?></a>
</td>
</tr>
<?php } ?>
</tbody>
</table>
$description = new Class_TableDescription('adminvars');
$description
->addColumn($this->_('Variable'),
['attribute' => 'id',
'callback' => function($var)
{
$private = $var->getMeta()->isPrivate();
return $this->tag('div', $var->getDescription())
. $this->tag('sub', str_replace('_', ' ', $var->getId()))
. $this->tag('div',
$this->tag('i',
' '
. $this->tag('span', $private ? $this->_('Privée') : $this->_('Publique')),
['class' => 'fa fa-' . ($private ? 'lock': 'unlock')]))
;
},
'options' => ['row_params' => function ($var)
{
return ['data-adminvar' => $var->getId()];
}]])
->addColumn($this->_('Valeur'), function($var)
{
return ($renderer = $var->getRenderer())
? $renderer($var->getValeur(), $this)
: $this->adminVar($var);
})
->addRowAction(['label' => function($var)
{
return $this->_('Modifier la variable %s', $var->getId());
},
'icon' => 'edit',
'url' => '/admin/index/adminvaredit/cle/%s',
'anchorOptions' => ['data-popup' => 'true']
])
;
echo $this->renderTable($description, $this->vars);
......@@ -301,6 +301,9 @@ class RechercheController extends ZendAfi_Controller_Action {
public function viewnoticeAction() {
if ($authority_record = $this->_authorityFromParams())
return $this->_redirect('/opac/recherche/viewnotice/id/' . $authority_record->getId());
$id_notice = (int)$this->_getParam('id');
$clef_alpha = (string)$this->_getParam('clef');
......@@ -401,6 +404,29 @@ class RechercheController extends ZendAfi_Controller_Action {
}
protected function _authorityFromParams() {
if ((!$authority_id = $this->_getParam('authority_id'))
|| (!$thesaurus_id = $this->_getParam('thesaurus_id')))
return;
$items = Class_Exemplaire::findAllBy(['type' => Class_Notice::TYPE_AUTHORITY,
'id_origine' => $authority_id]);
foreach($items as $item)
if ($record = $this->_recordWithThesaurusFacet($thesaurus_id, $item))
return $record;
}
protected function _recordWithThesaurusFacet($thesaurus_id, $item) {
if (!$record = $item->getNotice())
return;
return in_array(Class_CodifThesaurus::CODE_FACETTE . $thesaurus_id, $record->getFacetCodes())
? $record
: null;
}
public function jsonRecordAction() {
$this->_helper->getHelper('viewRenderer')->setNoRender();
......
......@@ -24,4 +24,8 @@ sed -i "s/integration_pwd=root/integration_pwd=$DBPASS/g" config.php
sed -i "s/integration_base=opac3/integration_base=$DBNAME/g" config.php
cd ..
phpunit -c tests/phpunit.xml --exclude-group no-ci && phpunit -c tests/phpunit_db.xml --exclude-group no-ci && phpunit -c tests/phpunit_js.xml --exclude-group no-ci && cd cosmogramme/tests && phpunit --exclude-group no-ci && cd ../cosmozend/tests && phpunit --exclude-group no-ci
phpunit -c tests/phpunit.xml --list-suites && phpunit -c tests/phpunit.xml --exclude-group no-ci \
&& phpunit -c tests/phpunit_db.xml --list-suites && phpunit -c tests/phpunit_db.xml --exclude-group no-ci \
&& phpunit -c tests/phpunit_js.xml --list-suites && phpunit -c tests/phpunit_js.xml --exclude-group no-ci \
&& cd cosmogramme/tests && phpunit --list-suites && phpunit --exclude-group no-ci \
&& cd ../cosmozend/tests && phpunit --list-suites && phpunit --exclude-group no-ci
......@@ -20,93 +20,9 @@
*/
class Cosmo_FacetsController extends Zend_Controller_Action {
use Trait_Translator;
public function preDispatch() {
$this->cosmoPath = $this->view->cosmoPath = new CosmoPaths();
}
public function indexAction() {
$this->view->models = Class_CodifThesaurus::findAllBy(['rules not' => null,
'order' => 'libelle']);
$this->view->currentId = $this->_getParam('id');
}
public function addAction() {
$this->view->model = Class_CodifThesaurus::newInstance([
'libelle_facette' => '** nouvelle facette **',
'rules' => json_encode(['label' => $this->_getParam('rules')])]);
}
public function validateAction() {
if (!$this->_request->isPost()) {
$this->_gotoIndex();
return;
}
if (!$model = Class_CodifThesaurus::find($this->_getParam('id')))
$model = Class_CodifThesaurus::newInstance();
$model
->setLibelle($this->_getParam('libelle_facette'))
->setLibelleFacette($this->_getParam('libelle_facette'))
->setRules(json_encode(['label' => $this->_getParam('rules')]));
if (!$model->isValid()) {
$this->view->model = $model;
$this->view->errors = $model->getErrors();
$this->render('add');
return;
}
if (!$model->getIdThesaurus()) {
$libelle = preg_replace('/[^a-zA-Z0-9]/', '', $this->_getParam('libelle_facette'));
$id_thesaurus = $this->generateNewIdThesaurusForLabel($libelle);
$model->setIdThesaurus($id_thesaurus);
$model->setCode($id_thesaurus);
}
$model->save();
$this->_gotoIndex($model->getId());
}
protected function generateNewIdThesaurusForLabel($label) {
$id = substr(strtoupper($label), 0, 4);
if (strlen($id) == 4 && !Class_CodifThesaurus::findFirstBy(['id_thesaurus' => $id]))
return $id;
$label = substr(strtoupper($label), 0, 3);
$suffixes = array_merge(range(0, 9), range('a', 'z'));
while(!empty($suffixes)) {
$suffix = strtoupper(array_shift($suffixes));;
$id = sprintf("%'".$suffix."-4s", $label);
if (!Class_CodifThesaurus::findFirstBy(['id_thesaurus' => $id]))
return $id;
}
}
public function deleteAction() {
if ($model = Class_CodifThesaurus::find($this->_getParam('id')))
$model->delete();
$this->_gotoIndex();
}
protected function _gotoIndex($id=null) {
$this->_redirect($this->view->url([
'module' => 'cosmo',
'controller' => 'facets',
'action' => 'index',
'id' => $id
], null, true),
['prependBase' => false]);
}
class Cosmo_FacetsController extends ZendAfi_Controller_Action {
public function getPlugins() {
return ['ZendAfi_Controller_Plugin_ResourceDefinition_DynamicFacet',
'ZendAfi_Controller_Plugin_Manager_DynamicFacet'];
}
}
?>
......@@ -20,43 +20,43 @@
*/
class Cosmo_IntegrationController extends Zend_Controller_Action{
use Trait_Translator;
class Cosmo_IntegrationController extends ZendAfi_Controller_Action{
public function preDispatch() {
$this->cosmoPath = $this->view->cosmoPath = new CosmoPaths();
}
public function preDispatch() {
parent::preDispatch();
$this->cosmoPath = $this->view->cosmoPath = new CosmoPaths();
}
public function controlAction() {
if (!$bib = Class_IntBib::find($this->_getParam('id', 0)))
$bib = Class_IntBib::newInstance(['nom_court' => 'Bibliothèque inconnue']);
public function controlAction() {
if (!$bib = Class_IntBib::find($this->_getParam('id', 0)))
$bib = Class_IntBib::newInstance(['nom_court' => 'Bibliothèque inconnue']);
$this->view->bib = $bib;
$this->view->integrations = $bib->getIntegrations();
}
$this->view->bib = $bib;
$this->view->integrations = $bib->getIntegrations();
}
public function testAction() {
public function testAction() {
if ($layout = Zend_Layout::getMvcInstance())
$layout->disableLayout();
if (!($type = $this->_getParam('type'))
|| !($options = $this->_getParam('options'))) {
$this->view->response = 'Paramètres insuffisants';
return;
}
if (!($type = $this->_getParam('type'))
|| !($options = $this->_getParam('options'))) {
$this->view->response = 'Paramètres insuffisants';
return;
}
if (!$service_name = Class_IntBib::detectService($type)) {
$this->view->response = 'Service de type ' . $type . ' inconnu';
return;
}
if (!$service_name = Class_IntBib::detectService($type)) {
$this->view->response = 'Service de type ' . $type . ' inconnu';
return;
}
$service = call_user_func([$service_name, 'getService'], $options);
$this->view->response = $service->test();
if (!$this->view->response)
$this->view->response = 'Impossible de contacter le service';
}
$service = call_user_func([$service_name, 'getService'], $options);
$this->view->response = $service->test();
if (!$this->view->response)
$this->view->response = 'Impossible de contacter le service';
}
public function generateAction() {
......@@ -78,4 +78,50 @@ class Cosmo_IntegrationController extends Zend_Controller_Action{
$this->render('generate-log');
}
public function waitingFilesAction() {
$this->view->titre = $this->_('Fichiers en attente d\'intégration');
$this->view->files = (new Class_Cosmogramme_Integration_WaitingFiles())->getCollection();
}
public function waitingFilesDeleteAction() {
if (!$item_path = $this->_getParam('id')) {
$this->_helper->notify($this->_('La suppression n\'a pas fonctionné car il n\'y a pas de chemin à supprimer.'));
return $this->_redirectClose($this->_getReferer());
}
Class_FileManager::beOpenBar();
if(!$item = Class_FileManager::find($item_path)) {
$this->_helper->notify($this->_('La suppression n\'a pas fonctionné car le chemin est invalide.'));
return $this->_redirectClose($this->_getReferer());
}
$success = Class_FileManager::delete($item);
$message = $success
? $this->_('"%s" supprimé.', $item->getPath())
: $this->_('Impossible de supprimer "%s".', $item->getPath());
$this->_helper->notify($message);
return $this->_redirectClose($this->_getReferer());
}
public function waitingFilesDownloadAction() {
if (!$item_path = $this->_getParam('id')) {
$this->_helper->notify($this->_('Le téléchargement n\'a pas fonctionné car il n\'y a pas de chemin à télécharger.'));
return $this->_redirectClose($this->_getReferer());
}
Class_FileManager::beOpenBar();
if(!$item = Class_FileManager::find($item_path)) {
$this->_helper->notify($this->_('Le téléchargement n\'a pas fonctionné car le chemin est invalide.'));
return $this->_redirectClose($this->_getReferer());
}
$this->_helper->fileManagerDownload($item);
}
}
\ No newline at end of file
<?php $model = $this->model; ?>
<h1>Codification des facettes dynamiques</h1>
<div class="liste">
<?php if ($this->errors) { ?>
<ul style="color:red;font-weight:bolder;">
<?php foreach ($this->errors as $error) { ?>
<li><?php echo $this->escape($error);?></li>
<?php } ?>
</ul>
<?php } ?>
<?php echo $this->cosmoFacets($this->model, true); ?>
</div>
<br/><br/>
<?php
echo $this->cosmoButton('Retour',
$this->url(['module' => 'cosmo', 'controller' => 'facets'],
null, true));
?>
echo $this->tag('h1', $this->titre);
echo $this->renderForm($this->form);
<?php
echo $this->tag('h1', $this->titre);
echo $this->renderForm($this->form);
<h1>Facettes dynamiques</h1>
<div class="liste">
<?php
foreach($this->models as $model) {
$img = 'plus.gif';
$display = false;
if ($model->getId() == $this->currentId) {
$img = 'moins.gif';
$display = true;
}
?>
<div class="liste_img">
<?php echo $this->tagImg($this->cosmoPath->getCosmoBaseUrl() . 'images/'.$img,
['id' => 'Ifacet' . $model->getId(),
'style' => 'cursor:pointer',
'onclick' => 'contracter_bloc(\'facet'.$model->getId().'\')']);?>
</div>
<div class="liste_titre"><?php echo $model->getLibelleFacette();?></div>
<?php echo $this->cosmoFacets($model, $display); ?>
<?php } ?>
</div>
<br/><br/>
<?php
echo $this->cosmoButton('Ajouter une facette dynamique',
$this->url(['module' => 'cosmo',
'controller' => 'facets',
'action' => 'add'], null, true));
?>
echo $this->tag('h1', $this->titre);
echo $this->Button_New((new Class_Entity())
->setText($this->_('Ajouter une facette dynamique')));
$description = (new Class_TableDescription('facets'))
->addColumn($this->_('Libellé'), 'libelle')
->addRowAction(function($batch)
{
return $this->renderPluginsActions($batch);
})
;
echo $this->renderTable($description, $this->thesauris);
<?php
echo
$this->tag('h1', $this->titre)
. ($this->files
? $this->renderTable((new Class_TableDescription_CosmoWaitingFiles('waiting-files'))
->setView($this)
->read(), $this->files)
: $this->tagNotice($this->_('Il n\'y a aucun fichier en attente d\'intégration')));
\ No newline at end of file