Loading CHANGELOG.md +16 −0 Original line number Diff line number Diff line CHANGELOG ========= 5.1.5 ----- - Nouvel élément de formulaire SearchAndSelect2 (basé sur le widget js Select2). 5.1.4 ----- - 5.1.3 ----- - 5.1.2 ----- - 5.1.1 ----- - Suppression du fix pour bootstrap-select-1.14.0-beta2 donc nécessaité de passer à bootstrap-select-1.14.0-beta3 dans vos applis. Loading config/module.config.php +5 −0 Original line number Diff line number Diff line Loading @@ -2,12 +2,15 @@ namespace UnicaenApp; use Laminas\ServiceManager\Factory\InvokableFactory; use UnicaenApp\Controller\CacheControllerFactory; use UnicaenApp\Controller\ConsoleController; use UnicaenApp\Controller\ConsoleControllerFactory; use UnicaenApp\Controller\InstadiaControllerFactory; use UnicaenApp\Form\Element\SearchAndSelect2; use UnicaenApp\Form\View\Helper\FormControlGroup; use UnicaenApp\Form\View\Helper\FormControlGroupFactory; use UnicaenApp\Form\View\Helper\FormSearchAndSelect2; use UnicaenApp\HostLocalization\HostLocalization; use UnicaenApp\HostLocalization\HostLocalizationFactory; use UnicaenApp\Message\View\Helper\MessageHelper; Loading Loading @@ -366,6 +369,7 @@ return [ 'form_elements' => [ 'invokables' => [ 'UploadForm' => 'UnicaenApp\Controller\Plugin\Upload\UploadForm', SearchAndSelect2::class => InvokableFactory::class, ], 'initializers' => [ 'UnicaenApp\Service\EntityManagerAwareInitializer', Loading Loading @@ -426,6 +430,7 @@ return [ 'formDateInfSup' => 'UnicaenApp\Form\View\Helper\FormDateInfSup', 'formRowDateInfSup' => 'UnicaenApp\Form\View\Helper\FormRowDateInfSup', 'formSearchAndSelect' => 'UnicaenApp\Form\View\Helper\FormSearchAndSelect', 'formSearchAndSelect2' => FormSearchAndSelect2::class, 'formLdapPeople' => 'UnicaenApp\Form\View\Helper\FormLdapPeople', 'formErrors' => 'UnicaenApp\Form\View\Helper\FormErrors', 'form' => 'UnicaenApp\Form\View\Helper\Form', Loading src/UnicaenApp/Filter/SearchAndSelect2Filter.php 0 → 100644 +17 −0 Original line number Diff line number Diff line <?php namespace UnicaenApp\Filter; use Laminas\Filter\AbstractFilter; class SearchAndSelect2Filter extends AbstractFilter { /** * @inheritDoc */ public function filter($value) { // TODO: Implement filter() method. } } No newline at end of file src/UnicaenApp/Form/Element/SearchAndSelect2.php 0 → 100644 +116 −0 Original line number Diff line number Diff line <?php namespace UnicaenApp\Form\Element; use InvalidArgumentException; use Laminas\Form\Element\Select; /** * Elément de formulaire permettant de sélectionner un ou plusieurs items recherchés dans une source de * données distante (via ajax). * * NB: Il faut utiliser l'aide de vue 'FormSearchAndSelect2' pour dessiner cet élément. * * @see \UnicaenApp\Form\View\Helper\FormSearchAndSelect * @author Unicaen */ class SearchAndSelect2 extends Select { const SEPARATOR = '|'; protected bool $selectionRequired = false; protected ?string $autocompleteSource = null; /** * Spécifie la source de données dans laquelle est effectuée la recherche. */ public function setAutocompleteSource(string $autocompleteSource): self { $this->autocompleteSource = $autocompleteSource; return $this; } /** * Retourne la source de données dans laquelle est effectuée la recherche. */ public function getAutocompleteSource(): ?string { return $this->autocompleteSource; } public function setValue($value): self { if ($value) { if (!is_string($value)) { throw new InvalidArgumentException( "Cet élément de formulaire n'accepte que les chaînes de caractères" ); } if (!str_contains($value, $sep = self::SEPARATOR)) { throw new InvalidArgumentException( "Cet élément de formulaire n'accepte que les valeurs de la forme 'id{$sep}label'" ); } } $valueOptions = $this->extractValueOptionsFromValue($value); $this->setValueOptions($valueOptions); return parent::setValue($value); } // public function getValue() // { // if ($this->isMultiple()) { // return array_keys($this->getValueOptions()); // } else { // return key($this->getValueOptions()) ?: null; // } // } // /** // * @return string|int|array // */ // public function getValueIds() // { // if ($this->isMultiple()) { // return array_keys($this->getValueOptions()); // } else { // return key($this->getValueOptions()) ?: null; // } // } protected function extractValueOptionsFromValue($value): array { if (!$value) { return []; } $valueOptions = []; if ($this->isMultiple()) { foreach ($value as $item) { $valueOptions[$item] = self::extractLabelFromValue($item); } } else { $valueOptions[$value] = self::extractLabelFromValue($value); } return $valueOptions; } static public function createValueFromIdAndLabel($id, string $label): string { return implode(self::SEPARATOR, [$id, $label]); } static public function extractIdFromValue(string $value): string { return explode(self::SEPARATOR, $value)[0]; } static public function extractLabelFromValue(string $value): string { return explode(self::SEPARATOR, $value)[1]; } } No newline at end of file src/UnicaenApp/Form/View/Helper/FormControlGroup.php +27 −24 Original line number Diff line number Diff line Loading @@ -2,19 +2,18 @@ namespace UnicaenApp\Form\View\Helper; use UnicaenApp\Exception\LogicException; use UnicaenApp\Form\Element\Date; use UnicaenApp\Form\Element\DateInfSup; use UnicaenApp\Form\Element\SearchAndSelect; use Laminas\Form\Element\Button; use Laminas\Form\Element\Checkbox; use Laminas\Form\Element\DateTime; use Laminas\Form\Element\MultiCheckbox; use Laminas\Form\Element\Radio; use Laminas\Form\Element\Select; use Laminas\Form\ElementInterface; use Laminas\Form\View\Helper\AbstractHelper; use Laminas\Form\View\Helper\FormElementErrors; use UnicaenApp\Exception\LogicException; use UnicaenApp\Form\Element\Date; use UnicaenApp\Form\Element\DateInfSup; use UnicaenApp\Form\Element\SearchAndSelect; use UnicaenApp\Form\Element\SearchAndSelect2; /** * Aide de vue générant un élément de fomulaire à la mode Bootsrap 5. Loading Loading @@ -66,11 +65,11 @@ class FormControlGroup extends AbstractHelper * Appel de l'objet comme une fonction. * * @param \Laminas\Form\ElementInterface|null $element Élément de formulaire * @param string|null $pluginClass Plugin * @param string|AbstractHelper $pluginClass Plugin * * @return string|FormControlGroup */ public function __invoke(ElementInterface $element = null, $pluginClass = 'formElement') public function __invoke(ElementInterface $element = null, $pluginClass = null) { if (null === $element) { return $this; Loading @@ -85,11 +84,11 @@ class FormControlGroup extends AbstractHelper * Génère le code HTML. * * @param ElementInterface $element * @param string|null $pluginClass * @param string|AbstractHelper $pluginClass * * @return string */ public function render(ElementInterface $element, $pluginClass = 'formElement'): string public function render(ElementInterface $element, $pluginClass = null): string { $this->normalizeElement($element); $this->customFromOptions($element); Loading Loading @@ -236,13 +235,23 @@ class FormControlGroup extends AbstractHelper return $helpContentAfter; } private function inputHtml(ElementInterface $element, $pluginClass = 'formElement') private function inputHtml(ElementInterface $element, $pluginClass = null) { if (!$pluginClass) { $pluginClass = 'formElement'; if ($pluginClass) { if (is_string($pluginClass)) { $helper = $this->getView()->plugin($pluginClass); $html = $helper($element); } elseif ($pluginClass instanceof AbstractHelper) { $html = $pluginClass->__invoke($element); } else { throw new LogicException('Argument $pluginClass incorrect'); } if ($element instanceof SearchAndSelect) { } elseif ($element instanceof SearchAndSelect2) { /** @var \UnicaenApp\Form\View\Helper\FormSearchAndSelect2 $helper */ $helper = $this->getView()->plugin('formSearchAndSelect2'); $helper->setAutocompleteMinLength(2); $html = $helper($element); } elseif ($element instanceof SearchAndSelect) { /** @var FormSearchAndSelect $helper */ $helper = $this->getView()->plugin('formSearchAndSelect'); $helper->setAutocompleteMinLength(2); Loading @@ -257,14 +266,8 @@ class FormControlGroup extends AbstractHelper $helper = $this->getView()->plugin('formDateTime'); $html = $helper($element); } else { if (is_string($pluginClass)) { $helper = $this->getView()->plugin($pluginClass); $helper = $this->getView()->plugin('formElement'); $html = $helper($element); } elseif ($pluginClass instanceof \Laminas\Form\View\Helper\AbstractHelper) { $html = $pluginClass($element); } else { throw new LogicException('Argument $pluginClass incorrect'); } } if ($element instanceof MultiCheckbox) { Loading Loading
CHANGELOG.md +16 −0 Original line number Diff line number Diff line CHANGELOG ========= 5.1.5 ----- - Nouvel élément de formulaire SearchAndSelect2 (basé sur le widget js Select2). 5.1.4 ----- - 5.1.3 ----- - 5.1.2 ----- - 5.1.1 ----- - Suppression du fix pour bootstrap-select-1.14.0-beta2 donc nécessaité de passer à bootstrap-select-1.14.0-beta3 dans vos applis. Loading
config/module.config.php +5 −0 Original line number Diff line number Diff line Loading @@ -2,12 +2,15 @@ namespace UnicaenApp; use Laminas\ServiceManager\Factory\InvokableFactory; use UnicaenApp\Controller\CacheControllerFactory; use UnicaenApp\Controller\ConsoleController; use UnicaenApp\Controller\ConsoleControllerFactory; use UnicaenApp\Controller\InstadiaControllerFactory; use UnicaenApp\Form\Element\SearchAndSelect2; use UnicaenApp\Form\View\Helper\FormControlGroup; use UnicaenApp\Form\View\Helper\FormControlGroupFactory; use UnicaenApp\Form\View\Helper\FormSearchAndSelect2; use UnicaenApp\HostLocalization\HostLocalization; use UnicaenApp\HostLocalization\HostLocalizationFactory; use UnicaenApp\Message\View\Helper\MessageHelper; Loading Loading @@ -366,6 +369,7 @@ return [ 'form_elements' => [ 'invokables' => [ 'UploadForm' => 'UnicaenApp\Controller\Plugin\Upload\UploadForm', SearchAndSelect2::class => InvokableFactory::class, ], 'initializers' => [ 'UnicaenApp\Service\EntityManagerAwareInitializer', Loading Loading @@ -426,6 +430,7 @@ return [ 'formDateInfSup' => 'UnicaenApp\Form\View\Helper\FormDateInfSup', 'formRowDateInfSup' => 'UnicaenApp\Form\View\Helper\FormRowDateInfSup', 'formSearchAndSelect' => 'UnicaenApp\Form\View\Helper\FormSearchAndSelect', 'formSearchAndSelect2' => FormSearchAndSelect2::class, 'formLdapPeople' => 'UnicaenApp\Form\View\Helper\FormLdapPeople', 'formErrors' => 'UnicaenApp\Form\View\Helper\FormErrors', 'form' => 'UnicaenApp\Form\View\Helper\Form', Loading
src/UnicaenApp/Filter/SearchAndSelect2Filter.php 0 → 100644 +17 −0 Original line number Diff line number Diff line <?php namespace UnicaenApp\Filter; use Laminas\Filter\AbstractFilter; class SearchAndSelect2Filter extends AbstractFilter { /** * @inheritDoc */ public function filter($value) { // TODO: Implement filter() method. } } No newline at end of file
src/UnicaenApp/Form/Element/SearchAndSelect2.php 0 → 100644 +116 −0 Original line number Diff line number Diff line <?php namespace UnicaenApp\Form\Element; use InvalidArgumentException; use Laminas\Form\Element\Select; /** * Elément de formulaire permettant de sélectionner un ou plusieurs items recherchés dans une source de * données distante (via ajax). * * NB: Il faut utiliser l'aide de vue 'FormSearchAndSelect2' pour dessiner cet élément. * * @see \UnicaenApp\Form\View\Helper\FormSearchAndSelect * @author Unicaen */ class SearchAndSelect2 extends Select { const SEPARATOR = '|'; protected bool $selectionRequired = false; protected ?string $autocompleteSource = null; /** * Spécifie la source de données dans laquelle est effectuée la recherche. */ public function setAutocompleteSource(string $autocompleteSource): self { $this->autocompleteSource = $autocompleteSource; return $this; } /** * Retourne la source de données dans laquelle est effectuée la recherche. */ public function getAutocompleteSource(): ?string { return $this->autocompleteSource; } public function setValue($value): self { if ($value) { if (!is_string($value)) { throw new InvalidArgumentException( "Cet élément de formulaire n'accepte que les chaînes de caractères" ); } if (!str_contains($value, $sep = self::SEPARATOR)) { throw new InvalidArgumentException( "Cet élément de formulaire n'accepte que les valeurs de la forme 'id{$sep}label'" ); } } $valueOptions = $this->extractValueOptionsFromValue($value); $this->setValueOptions($valueOptions); return parent::setValue($value); } // public function getValue() // { // if ($this->isMultiple()) { // return array_keys($this->getValueOptions()); // } else { // return key($this->getValueOptions()) ?: null; // } // } // /** // * @return string|int|array // */ // public function getValueIds() // { // if ($this->isMultiple()) { // return array_keys($this->getValueOptions()); // } else { // return key($this->getValueOptions()) ?: null; // } // } protected function extractValueOptionsFromValue($value): array { if (!$value) { return []; } $valueOptions = []; if ($this->isMultiple()) { foreach ($value as $item) { $valueOptions[$item] = self::extractLabelFromValue($item); } } else { $valueOptions[$value] = self::extractLabelFromValue($value); } return $valueOptions; } static public function createValueFromIdAndLabel($id, string $label): string { return implode(self::SEPARATOR, [$id, $label]); } static public function extractIdFromValue(string $value): string { return explode(self::SEPARATOR, $value)[0]; } static public function extractLabelFromValue(string $value): string { return explode(self::SEPARATOR, $value)[1]; } } No newline at end of file
src/UnicaenApp/Form/View/Helper/FormControlGroup.php +27 −24 Original line number Diff line number Diff line Loading @@ -2,19 +2,18 @@ namespace UnicaenApp\Form\View\Helper; use UnicaenApp\Exception\LogicException; use UnicaenApp\Form\Element\Date; use UnicaenApp\Form\Element\DateInfSup; use UnicaenApp\Form\Element\SearchAndSelect; use Laminas\Form\Element\Button; use Laminas\Form\Element\Checkbox; use Laminas\Form\Element\DateTime; use Laminas\Form\Element\MultiCheckbox; use Laminas\Form\Element\Radio; use Laminas\Form\Element\Select; use Laminas\Form\ElementInterface; use Laminas\Form\View\Helper\AbstractHelper; use Laminas\Form\View\Helper\FormElementErrors; use UnicaenApp\Exception\LogicException; use UnicaenApp\Form\Element\Date; use UnicaenApp\Form\Element\DateInfSup; use UnicaenApp\Form\Element\SearchAndSelect; use UnicaenApp\Form\Element\SearchAndSelect2; /** * Aide de vue générant un élément de fomulaire à la mode Bootsrap 5. Loading Loading @@ -66,11 +65,11 @@ class FormControlGroup extends AbstractHelper * Appel de l'objet comme une fonction. * * @param \Laminas\Form\ElementInterface|null $element Élément de formulaire * @param string|null $pluginClass Plugin * @param string|AbstractHelper $pluginClass Plugin * * @return string|FormControlGroup */ public function __invoke(ElementInterface $element = null, $pluginClass = 'formElement') public function __invoke(ElementInterface $element = null, $pluginClass = null) { if (null === $element) { return $this; Loading @@ -85,11 +84,11 @@ class FormControlGroup extends AbstractHelper * Génère le code HTML. * * @param ElementInterface $element * @param string|null $pluginClass * @param string|AbstractHelper $pluginClass * * @return string */ public function render(ElementInterface $element, $pluginClass = 'formElement'): string public function render(ElementInterface $element, $pluginClass = null): string { $this->normalizeElement($element); $this->customFromOptions($element); Loading Loading @@ -236,13 +235,23 @@ class FormControlGroup extends AbstractHelper return $helpContentAfter; } private function inputHtml(ElementInterface $element, $pluginClass = 'formElement') private function inputHtml(ElementInterface $element, $pluginClass = null) { if (!$pluginClass) { $pluginClass = 'formElement'; if ($pluginClass) { if (is_string($pluginClass)) { $helper = $this->getView()->plugin($pluginClass); $html = $helper($element); } elseif ($pluginClass instanceof AbstractHelper) { $html = $pluginClass->__invoke($element); } else { throw new LogicException('Argument $pluginClass incorrect'); } if ($element instanceof SearchAndSelect) { } elseif ($element instanceof SearchAndSelect2) { /** @var \UnicaenApp\Form\View\Helper\FormSearchAndSelect2 $helper */ $helper = $this->getView()->plugin('formSearchAndSelect2'); $helper->setAutocompleteMinLength(2); $html = $helper($element); } elseif ($element instanceof SearchAndSelect) { /** @var FormSearchAndSelect $helper */ $helper = $this->getView()->plugin('formSearchAndSelect'); $helper->setAutocompleteMinLength(2); Loading @@ -257,14 +266,8 @@ class FormControlGroup extends AbstractHelper $helper = $this->getView()->plugin('formDateTime'); $html = $helper($element); } else { if (is_string($pluginClass)) { $helper = $this->getView()->plugin($pluginClass); $helper = $this->getView()->plugin('formElement'); $html = $helper($element); } elseif ($pluginClass instanceof \Laminas\Form\View\Helper\AbstractHelper) { $html = $pluginClass($element); } else { throw new LogicException('Argument $pluginClass incorrect'); } } if ($element instanceof MultiCheckbox) { Loading