125 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace FML;
 | 
						|
 | 
						|
use FML\Types\Identifiable;
 | 
						|
 | 
						|
/**
 | 
						|
 * Unique ID Model Class
 | 
						|
 *
 | 
						|
 * @author    steeffeen
 | 
						|
 * @copyright FancyManiaLinks Copyright © 2017 Steffen Schröder
 | 
						|
 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 | 
						|
 */
 | 
						|
class UniqueID
 | 
						|
{
 | 
						|
 | 
						|
    /*
 | 
						|
     * Constants
 | 
						|
     */
 | 
						|
    const PREFIX = 'FML_ID_';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var int $currentIndex Current global id index
 | 
						|
     */
 | 
						|
    protected static $currentIndex = 0;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var int $index Unique id index
 | 
						|
     */
 | 
						|
    protected $index = null;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create a new Unique ID
 | 
						|
     *
 | 
						|
     * @return static
 | 
						|
     */
 | 
						|
    public static function create()
 | 
						|
    {
 | 
						|
        return new static();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check and return the Id of an Identifable Element
 | 
						|
     *
 | 
						|
     * @param Identifiable $element Identifable element
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public static function check(Identifiable $element)
 | 
						|
    {
 | 
						|
        $elementId = $element->getId();
 | 
						|
 | 
						|
        if (!$elementId) {
 | 
						|
            $element->setId(new static());
 | 
						|
            return $element->getId();
 | 
						|
        }
 | 
						|
 | 
						|
        $dangerousCharacters = array(' ', '|', PHP_EOL);
 | 
						|
        $danger              = false;
 | 
						|
        foreach ($dangerousCharacters as $dangerousCharacter) {
 | 
						|
            if (stripos($elementId, $dangerousCharacter) !== false) {
 | 
						|
                $danger = true;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if ($danger) {
 | 
						|
            trigger_error("Don't use special characters in IDs, they might cause problems! Stripping them for you...");
 | 
						|
            $elementId = str_ireplace($dangerousCharacters, '', $elementId);
 | 
						|
            $element->setId($elementId);
 | 
						|
        }
 | 
						|
 | 
						|
        return $element->getId();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get a new global unique index
 | 
						|
     *
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    protected static function newIndex()
 | 
						|
    {
 | 
						|
        self::$currentIndex++;
 | 
						|
        return self::$currentIndex;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Construct a Unique ID
 | 
						|
     */
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
        $this->index = static::newIndex();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the Unique ID index
 | 
						|
     *
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    public function getIndex()
 | 
						|
    {
 | 
						|
        return $this->index;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the Unique ID value
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getValue()
 | 
						|
    {
 | 
						|
        return self::PREFIX . $this->getIndex();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the string representation
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function __toString()
 | 
						|
    {
 | 
						|
        return $this->getValue();
 | 
						|
    }
 | 
						|
 | 
						|
}
 |