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
<?php
namespace 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 methods

	public 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;
    }

}