Source of file ListInfo.php
Size: 13,695 Bytes - Last Modified: 2023-11-16T22:56:03+01:00
/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/list-bundle/src/Entity/ListInfo.php
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 | <?phpnamespace TIC\ListBundle\Entity; use TIC\DormBundle\Base\TICEntity as BaseEntity; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Event\PreFlushEventArgs; use Symfony\Component\Validator\Constraints as Assert; use TIC\DormBundle\Traits\EntityTimestampable; use TIC\DormBundle\Traits\EntityEnabled; use TIC\DormBundle\Traits\EntityBlameable; use TIC\ListBundle\Repository\ListInfoRepository as EntityRepo; /** * Entité représentant une liste administrable (conteneur d'éléments avec capacités). * @ORM\Table(name="tic_list_listinfo") * @ORM\Entity(repositoryClass=EntityRepo::class) * @ORM\HasLifecycleCallbacks() */class ListInfo extends BaseEntity {use EntityTimestampable; use EntityEnabled; use EntityBlameable; /** * @ORM\Column(type="string", length=100, unique=true) * @ORM\Id * @Assert\NotBlank() * @var string */protected $ref; /** * @ORM\Column(type="string", length=250) * @Assert\NotBlank() * @var string */protected $title; /** * @ORM\Column(type="text", nullable=true) * @var string */protected $description; /** * Gestion des élements possible par l'interface web (sinon lecture seule pour sync par import/export) ? * @ORM\Column(type="boolean", options={"default"=true}) * @var boolean */protected $editable; /** * Utilisation des champs 'value' des éléments (clé des options, par défaut index auto) ? * @ORM\Column(type="boolean", options={"default"=true}) * @var boolean */protected $valuable; /** * Utilisation des champs 'ref' des éléments (fixe pour import/export, par défaut slug du label) ? * @ORM\Column(type="boolean") * @var boolean */protected $referable; /** * Utilisation des champs 'enabled' des éléments (activation/désactivation) ? * @ORM\Column(type="boolean", options={"default"=true}) * @var boolean */protected $deactivatable; /** * Utilisation des champs 'ranking' des éléments (tri pondéré modifiable) ? * @ORM\Column(type="boolean") * @var boolean */protected $sortable; /** * Utilisation des champs 'icon' des éléments (référence glyphicon/font-awesome) ? * @ORM\Column(type="boolean") * @var boolean */protected $iconable; /** * @ORM\OneToMany(targetEntity="ListItem", mappedBy="info", cascade={"persist","remove"}, orphanRemoval=true) , indexBy="ref" * @ORM\OrderBy({"ranking" = "ASC", "label" = "ASC"}) * @var ArrayCollection */protected $items; // --------------------------------------------------------------------- Custom methodspublic function __construct($nbItems = 0, $ref = null) { $this->enabled = true; $this->ref = $ref; $this->editable = true; $this->valuable = true; $this->referable = false; $this->deactivatable = true; $this->sortable = false; $this->iconable = false; $this->items = new \Doctrine\Common\Collections\ArrayCollection(); // ajout de nouveaux éléments vierges pour commencer à peupler la liste for ($n = 0; $n < $nbItems; $n++) new ListItem($this); } public function __toString() { return $this->title; } public function export($withItems = false) { $data = array( 'ref' => $this->ref, 'title' => $this->title, 'description' => $this->description, 'capacities' => $this->getCapacities(), ); if ($withItems) $data['items'] = $this->exportItems(); return $data; } public function exportItems() { $fields = array('label'); foreach ($this->getCapacities() as $capacity) switch ($capacity) { case 'valuable' : $fields[] = 'value'; break; case 'referable' : $fields[] = 'ref'; break; case 'deactivatable' : $fields[] = 'enabled'; break; case 'sortable' : $fields[] = 'ranking'; break; case 'iconable' : $fields[] = 'icon'; break; } $data = array(); foreach ($this->items as $item) { $data[ $item->getId() ] = array_filter($item->export(), function($field) use($fields){ return in_array($field, $fields); }, ARRAY_FILTER_USE_KEY); }; return $data; } public function import($data) { foreach ($data as $field => $value) switch ($field) { case 'title' : $this->setTitle( $value ); break; case 'description' : $this->setDescription( $value ); break; case 'capacities' : $this->setCapacities( $value ); break; case 'items' : $this->importItems( $value ); break; } } public function importItems($data) { foreach ($data as $id => $values) { $item = $this->getItemById($id); if (! $item) { if (isset($values['ref'] )) $item = $this->getItemByRef( $values['ref'], true); elseif (isset($values['value'])) $item = $this->getItemByValue( $values['value'], true); elseif (isset($values['label'])) $item = $this->getItemByLabel( $values['label'], true); } if (! $item) $item = new ListItem($this); $item->import($values); } $this->generateDefaultItemsData(); } // --------------------------------------------------------------------- Events methods/** * A déclencher manuellement avant d'enregistrer les éléments de la liste. * @TODO pour automatiser le déclenchement, plutôt que d'utiliser les events doctrine * pourquoi pas utiliser le validator du formulaire (Assert sur hasRef et hasValue) */public function generateDefaultItemsData() { $changeItems = array(); foreach ($this->items as $item) { // @TODO: possibilité ici d'optimiser les boucles sur les éléments // en récupérant toutes les refs et toutes les values existantes // puis en effectuant les générations d'ici directement if ($item->generateDefaultData()) $changeItems[] = $item; } return $changeItems; } // --------------------------------------------------------------------- Virtual capacitiesprotected $capacities = array('editable', 'valuable', 'referable', 'deactivatable', 'sortable', 'iconable'); /** * Retourne les choix d'options sélectionnables dans la propriété virtuelle des capacités */public function getCapacityChoices() { $choices = array(); foreach ($this->capacities as $field) { $choices['ticlist.list.label.' . $field] = $field; } return $choices; } /** * Getter de la propriété virtuelle pour regrouper l'édition des capacités dans le formulaire */public function getCapacities() { $capacities = array(); foreach ($this->capacities as $field) { if ($this->{$field}) $capacities[] = $field; } return $capacities; } /** * Setter de la propriété virtuelle pour regrouper l'édition des capacités dans le formulaire */public function setCapacities($capacities) { foreach ($this->capacities as $field) { $this->{$field} = in_array($field, $capacities); } return $this; } // --------------------------------------------------------------------- Shortcut methods/** * Get id * @return string */public function getId() { return $this->ref; } /** * Retourne le nombre d'éléments dans la liste (avec filtre d'activation optionnel). * @param bool|null $enabled Filtre sur l'état activé si true, sur l'état désactivé si false * @return integer Nombre d'éléments total ou activés ou désactivés */public function countItems($enabled = null){ if ($enabled === null ) return $this->items->count(); if ($enabled === true ) return $this->items->filter( function($item){ return $item->getEnabled(); })->count(); if ($enabled === false) return $this->items->filter( function($item){ return !$item->getEnabled(); })->count(); } /** * Retourne la liste des éléments activés (filtrage sur la collection). */public function getActiveItems(){ return $this->items->filter( function($item){ return $item->getEnabled(); }); } /** * Get the item by his generated id. * @return ListItem|null */public function getItemById($id) { foreach ($this->items as $item) if ("$id" === $item->getId()) return $item; } /** * Get the item by his internal value. * @return ListItem|null */public function getItemByRef($ref, $createIt = false) { foreach ($this->items as $item) if ("$ref" === $item->getRef()) return $item; if ($createIt) return new ListItem($this, null, null, $ref); } /** * Get the item by his external value. * @return ListItem|null */public function getItemByValue($value, $createIt = false) { foreach ($this->items as $item) if ("$value" === $item->getValue()) return $item; if ($createIt) return new ListItem($this, $value, $value); } /** * Get the item by his default label. * @return ListItem|null */public function getItemByLabel($label, $createIt = false) { foreach ($this->items as $item) if ("$label" === $item->getLabel()) return $item; if ($createIt) return new ListItem($this, $label); } // --------------------------------------------------------------------- Tweaked methods/** * Set ref * Note: format forcé avec transformation automatique des caractères non autorisés * @param string $ref * @return ListInfo */public function setRef($ref) { if ($this->title === null) $this->setTitle($ref); $ref = strtolower(strtr($ref, ' ', '_')); $ref = preg_replace('/[^a-z0-9\-_]/', '', $ref); $this->ref = $ref; return $this; } /** * Set title * Note: si valeur vide, composition d'un titre par défaut à partir de la référence. * @param string $title * @return ListInfo */public function setTitle($title) { if ($title === null || ! strlen($title)) $title = $this->ref; $title = ucfirst(strtr($title, '_', ' ')); $this->title = $title; return $this; } /** * Add item * @param \TIC\ListBundle\Entity\ListItem $item * @return ListInfo */public function addItem(\TIC\ListBundle\Entity\ListItem $item) { # if ($this->items->contains($item)) return $this;$item->setInfo($this); $this->items[] = $item; return $this; } /** * Set items * @param \TIC\ListBundle\Entity\ListItem[] $items Liste des éléments (array ou ArrayCollection) * @return ListInfo */public function setItems($items) { $this->updateCollection('items', $items, 'setInfo'); return $this; } // --------------------------------------------------------------------- Auto-generated/** * Get ref * * @return string */public function getRef() { return $this->ref; } /** * Get title * * @return string */public function getTitle() { return $this->title; } /** * Set description * * @param string $description * * @return ListInfo */public function setDescription($description) { $this->description = $description; return $this; } /** * Get description * * @return string */public function getDescription() { return $this->description; } /** * Set editable * * @param boolean $editable * * @return ListInfo */public function setEditable($editable) { $this->editable = $editable; return $this; } /** * Get editable * * @return boolean */public function getEditable() { return $this->editable; } /** * Set valuable * * @param boolean $valuable * * @return ListInfo */public function setValuable($valuable) { $this->valuable = $valuable; return $this; } /** * Get valuable * * @return boolean */public function getValuable() { return $this->valuable; } /** * Set referable * * @param boolean $referable * * @return ListInfo */public function setReferable($referable) { $this->referable = $referable; return $this; } /** * Get referable * * @return boolean */public function getReferable() { return $this->referable; } /** * Set deactivatable * * @param boolean $deactivatable * * @return ListInfo */public function setDeactivatable($deactivatable) { $this->deactivatable = $deactivatable; return $this; } /** * Get deactivatable * * @return boolean */public function getDeactivatable() { return $this->deactivatable; } /** * Set sortable * * @param boolean $sortable * * @return ListInfo */public function setSortable($sortable) { $this->sortable = $sortable; return $this; } /** * Get sortable * * @return boolean */public function getSortable() { return $this->sortable; } /** * Set iconable * * @param boolean $iconable * * @return ListInfo */public function setIconable($iconable) { $this->iconable = $iconable; return $this; } /** * Get iconable * * @return boolean */public function getIconable() { return $this->iconable; } /** * Remove item * * @param \TIC\ListBundle\Entity\ListItem $item */public function removeItem(\TIC\ListBundle\Entity\ListItem $item) { $this->items->removeElement($item); } /** * Get items * * @return \Doctrine\Common\Collections\Collection */public function getItems() { return $this->items; } } |