Commit 68b89bbd authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

MultipageForm : simplification des clés dans la liste des fieldsets ;...

MultipageForm : simplification des clés dans la liste des fieldsets ; possibilité de retirer un fieldset ; ajout de l'élément de navigation dans prepare().
parent 47e34ecf
......@@ -13,7 +13,6 @@ use Zend\Form\Element\Radio;
use Zend\Form\Element\Select;
use Zend\Form\Fieldset;
use Zend\Form\Form;
use Zend\Form\Element\Submit;
/**
* Classe mère des formulaire multi-pages (saisie en plusieurs étapes).
......@@ -42,12 +41,9 @@ abstract class MultipageForm extends Form
/**
* Liste des noms des fieldsets ajoutés.
* La clé 'first' est utilisée pour le premier fieldset.
* La clé 'next_N' est utilisée pour les fieldsets suivants.
* La clé 'last' est utilisée pour le dernier fieldset.
* @var array
*/
protected $fieldsetNames = array();
protected $fieldsetNames = [];
/**
* Préfixe appliqué aux noms des actions de contrôleur.
......@@ -96,49 +92,47 @@ abstract class MultipageForm extends Form
return parent::add($elementOrFieldset, $flags);
}
/**
* {@inheritdoc}
*/
public function remove($elementOrFieldset)
{
$elementOrFieldset = $this->get($elementOrFieldset);
// traitement particulier pour les fieldsets
if ($elementOrFieldset instanceof Fieldset) {
return $this->_removeFieldset($elementOrFieldset);
}
return parent::remove($elementOrFieldset);
}
/**
* {@inheritdoc}
*/
public function prepare()
{
$this->addNavigationElementToFieldsets();
return parent::prepare();
}
/**
* Ajoute un fieldset d'étape à ce formulaire.
*
* L'élément composite de navigation adapté à cette étape est ajouté au fieldset.
*
* @param Fieldset $fieldset
* @return self
*/
protected function _addFieldset(Fieldset $fieldset)
{
if (empty($this->fieldsetNames)) {
$navigationElement = new MultipageFormNavElement(self::NAME_NAV);
$navigationElement
->setCancelEnabled(true)
->setPreviousEnabled(false)
->setNextEnabled(true)
->setSubmitEnabled(false);
$key = 'first';
}
else {
if (in_array($fieldset->getName(), $this->fieldsetNames)) {
throw new LogicException("Ce fieldset a déjà été ajouté.");
}
$navigationElement = new MultipageFormNavElement(self::NAME_NAV);
$navigationElement
->setCancelEnabled(true)
->setPreviousEnabled(true)
->setNextEnabled(false)
->setSubmitEnabled(true);
// On va ajouter un fieldset, donc le fieldset actuellement dernier dans la liste devient l'avant-dernier.
$this->_updateLastAddedFieldset();
$key = 'last';
}
$name = $fieldset->getName();
$this->fieldsetNames[$key] = $fieldset->getName();
if (in_array($name, $this->fieldsetNames)) {
throw new LogicException("Ce fieldset a déjà été ajouté.");
}
// ajout de l'élément de navigation au fieldset
$fieldset->add($navigationElement);
$this->fieldsetNames[] = $name;
// ajout du fieldset au formulaire
parent::add($fieldset);
......@@ -147,35 +141,60 @@ abstract class MultipageForm extends Form
}
/**
* Le fieldset actuellement dernier dans la liste devient l'avant-dernier.
* Et son élément de navigation est mis à jour.
* Retire un fieldset d'étape de ce formulaire.
*
* @param Fieldset $fieldset
* @return self
*/
protected function _updateLastAddedFieldset()
protected function _removeFieldset(Fieldset $fieldset)
{
$keys = array_keys($this->fieldsetNames);
// exception pour le premier fieldset de la liste : rien à faire
if (end($keys) === 'first') {
return;
$name = $fieldset->getName();
$key = array_search($name, $this->fieldsetNames);
if ($key === false) {
throw new LogicException("Le fieldset '$name' spécifié n'a pas été trouvé dans le formulaire.");
}
// name du dernier fieldset de la liste
$lastInsertedFieldsetName = array_pop($this->fieldsetNames);
unset($this->fieldsetNames[$key]);
// obtention de l'élément de navigation de ce dernier fieldset
/** @var MultipageFormNavElement $lastInsertedFieldsetNavElem */
$lastInsertedFieldsetNavElem = $this->get($lastInsertedFieldsetName)->get(self::NAME_NAV);
// modification de la visibilité/pertinence de ses boutons
$lastInsertedFieldsetNavElem
->setCancelEnabled(true)
->setPreviousEnabled(true)
->setNextEnabled(true)
->setSubmitEnabled(false);
// renumérotation des clés
$this->fieldsetNames = array_values($this->fieldsetNames);
// nouvelle clé (anciennement 'last')
$key = 'next_' . (count($this->fieldsetNames) - 1);
// retrait du fieldset du formulaire
parent::remove($name);
$this->fieldsetNames[$key] = $lastInsertedFieldsetName;
return $this;
}
/**
* Ajout de l'élément de navigation à chaque fieldset du formulaire.
*/
protected function addNavigationElementToFieldsets()
{
$fieldsetCount = count($this->fieldsetNames);
foreach ($this->fieldsetNames as $key => $fieldsetName) {
$navigationElement = new MultipageFormNavElement(self::NAME_NAV);
$navigationElement->setCancelEnabled(true);
if ($key === 0) {
$navigationElement
->setPreviousEnabled(false)
->setNextEnabled(true)
->setSubmitEnabled(false);
} elseif ($key === $fieldsetCount - 1) {
$navigationElement
->setPreviousEnabled(true)
->setNextEnabled(false)
->setSubmitEnabled(true);
} else {
$navigationElement
->setPreviousEnabled(true)
->setNextEnabled(true)
->setSubmitEnabled(false);
}
$this->get($fieldsetName)->add($navigationElement);
}
}
/**
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment