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

	public 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 capacities

	protected $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;
    }
}