Source of file ListItem.php
Size: 9,721 Bytes - Last Modified: 2023-11-16T22:56:03+01:00
/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/list-bundle/src/Entity/ListItem.php
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 | <?phpnamespace TIC\ListBundle\Entity; use TIC\DormBundle\Base\TICEntity as BaseEntity; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping\UniqueConstraint; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Validator\Constraints as Assert; use TIC\CoreBundle\Util\StringHelper as StringHelper; use TIC\ListBundle\Repository\ListItemRepository as EntityRepo; /** * @ORM\Table(name="tic_list_listitem", * uniqueConstraints={ @UniqueConstraint(name="ref_unique", columns={"list_ref", "ref"}) }, * indexes={ @ORM\Index(name="value_search", columns={"list_ref", "value"}) } * ) * @UniqueEntity(fields={"list_ref", "ref"}, errorPath="ref") * @ORM\Entity(repositoryClass=EntityRepo::class) */class ListItem extends BaseEntity {/** * @ORM\Column(type="string", length=201) * @ORM\Id * @ORM\GeneratedValue(strategy="CUSTOM") * @ORM\CustomIdGenerator(class="\TIC\ListBundle\Doctrine\ReferencesIdGenerator") */protected $id; /** * @ORM\ManyToOne(targetEntity="ListInfo", inversedBy="items") * @ORM\JoinColumn(name="list_ref", referencedColumnName="ref") * @var \TIC\ListBundle\Entity\ListInfo */protected $info; /** * Référence fixe de l'élément (par défaut: slug du libellé unique dans la liste). * @ORM\Column(type="string", length=100) * @var string */protected $ref; /** * Valeur/clé à associer au libellé (par défaut: index dans la liste). * @ORM\Column(type="string", length=100) * @var string */protected $value; /** * Libellé de l'élément à afficher (celui de la locale par défaut si translatable). * @ORM\Column(type="string", length=255) * @var string */protected $label; /** * @ORM\Column(type="string", length=50, nullable=true) * @var string */protected $icon; /** * @ORM\Column(type="smallint", options={"default"=0}) * @Assert\NotNull() * @var integer */protected $ranking; /** * @ORM\Column(type="boolean", options={"default"=true}) * @Assert\NotNull() * @var boolean */protected $enabled; // --------------------------------------------------------------------- Custom methodspublic function __construct(ListInfo $info = null, $label = null, $value = null, $ref = null) { $this->info = $info; $this->label = $label; $this->value = $value; $this->ref = $ref; $this->icon = null; $this->ranking = 0; $this->enabled = true; if ($info) $info->addItem($this); } public function __toString() { return $this->label; } public function export() { return array( 'id' => $this->id, 'info' => $this->info->getRef(), 'ref' => $this->ref, 'value' => $this->value, 'label' => $this->label, 'icon' => $this->icon, 'ranking' => $this->ranking, 'enabled' => $this->enabled, 'labels' => $this->getLabels(), ); } public function import($data) { foreach ($data as $field => $value) switch ($field) { case 'id' : $this->id = $value; break; case 'ref' : $this->ref = $value; break; case 'value' : $this->value = $value; break; case 'label' : (is_array($value)) ? $this->setLabels($value) : $this->label = $value; break; case 'icon' : $this->icon = $value; break; case 'ranking' : $this->ranking = $value; break; case 'enabled' : $this->enabled = $value; break; case 'labels' : $this->setLabels($value); break; } } // --------------------------------------------------------------------- Shortcut methods/** * Compatibility */public static function slugify($text) { return StringHelper::slugify($text); } // --------------------------------------------------------------------- Events methods/** * Génération automatique pour les champs vides 'ref' et 'value'. * Note: l'usage d'events prePersist et preUpdate sur les entités ListItem * ne permettrait pas de déterminer l'ordre des éléments traités * (génant pour la génération des incréments et les priorités des slugs) * d'où l'usage d'un event PreFlush au niveau de la liste * ATTENTION: aucun event alors sur une opération d'ajout/édition isolée * d'une entité ListItem (en dehors de l'édition via une liste) ? */public function generateDefaultData() { $nbChanges = 0; if ($this->value === null || ! strlen($this->value)) { $this->value = $this->makeValueAutoIndex(); $nbChanges++; } if ($this->ref === null || ! strlen($this->ref) ) { $this->ref = $this->makeRefFromLabel(); $nbChanges++; } return $nbChanges; } /** * Génération automatique de la référence du noeud (slug unique du label). */public function makeRefFromLabel() { $ref = $slug = StringHelper::slugify($this->label); // vérification de l'unicité (avec suffixe numéroté si besoin) $values = array(); $suffix = 1; foreach ($this->info->getItems() as $item) { // ATTENTION: pas de comparaison sur l'id qui ne distinguerait pas plusieurs nouveaux éléments if ($item !== $this) $values[] = $item->getRef(); } while (in_array($ref, $values)) $ref = $slug . '-' . (++$suffix); return $ref; } /** * Génération automatique de la valeur du noeud (index incrémental dans la liste). */public function makeValueAutoIndex() { // recherche de toutes les valeurs d'index déjà existantes $values = array(0); foreach ($this->info->getItems() as $item) { // ATTENTION: pas de comparaison sur l'id qui ne distinguerait pas plusieurs nouveaux éléments if ($item !== $this) $values[] = intval($item->getValue()); } return max($values) + 1; # $value = 1; while (in_array($value, $values)) $value++; return $value;} // --------------------------------------------------------------------- Translations methods/** * Retourne le libellé par défaut d'une liste de traduction. * (utile pour ListItemTranslation[] => ListItem->label) */protected function getDefaultLabel($labels, $default = '') { return $default; } /** * Retourne la liste des libellés traduits (plutôt qu'une liste des traductions) * Note: si aucune traduction une liste sera initialisée avec le libellé par défaut * @return array Liste des libellés indexés par leur locale */public function getLabels() { return array_fill_keys(array("fr"), $this->label); } /** * Enregistre une liste de libellés traduits dans la collection des translations. * Note: mise à jour au passage du libellé par défaut (stocké dans l'entité hors translations) * @param array $labels Liste des libellés indexés par leur locale */public function setLabels($labels) { $this->setLabel( $this->getDefaultLabel($labels) ); return $this; } /** * Get label * Note: possibilité de spécifier une locale pour interroger la collection de translations * Note: il est sans doute préférable d'éviter la création d'objet depuis une demande en lecture * @param string $locale La locale demandée pour récupérer les traductions * @return string */public function getLabel($locale = null) { return $this->label; } // --------------------------------------------------------------------- Auto-generated/** * Get id * * @return string */public function getId() { return $this->id; } /** * Set ref * * @param string $ref * * @return ListItem */public function setRef($ref) { $this->ref = $ref; return $this; } /** * Get ref * * @return string */public function getRef() { return $this->ref; } /** * Set value * * @param string $value * * @return ListItem */public function setValue($value) { $this->value = $value; return $this; } /** * Get value * * @return string */public function getValue() { return $this->value; } /** * Set label * * @param string $label * * @return ListItem */public function setLabel($label) { $this->label = $label; return $this; } /** * Set icon * * @param string $icon * * @return ListItem */public function setIcon($icon) { $this->icon = $icon; return $this; } /** * Get icon * * @return string */public function getIcon() { return $this->icon; } /** * Set ranking * * @param integer $ranking * * @return ListItem */public function setRanking($ranking) { $this->ranking = $ranking; return $this; } /** * Get ranking * * @return integer */public function getRanking() { return $this->ranking; } /** * Set enabled * * @param boolean $enabled * * @return ListItem */public function setEnabled($enabled) { $this->enabled = $enabled; return $this; } /** * Get enabled * * @return boolean */public function getEnabled() { return $this->enabled; } /** * Set info * * @param \TIC\ListBundle\Entity\ListInfo $info * * @return ListItem */public function setInfo(\TIC\ListBundle\Entity\ListInfo $info = null) { $this->info = $info; return $this; } /** * Get info * * @return \TIC\ListBundle\Entity\ListInfo */public function getInfo() { return $this->info; } } |