datatable.directory codebase
				https://datatable.directory/
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							115 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
	
	
							115 lines
						
					
					
						
							2.9 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
 | 
						|
namespace App\Utils;
 | 
						|
 | 
						|
 | 
						|
use JsonSerializable;
 | 
						|
use MightyPork\Exceptions\NotApplicableException;
 | 
						|
use MightyPork\Utils\Utils;
 | 
						|
 | 
						|
/**
 | 
						|
 * Helper class representing one column in a data table.
 | 
						|
 *
 | 
						|
 * @property-read string $name
 | 
						|
 * @property-read string $title
 | 
						|
 * @property-read string $type
 | 
						|
 */
 | 
						|
class Column implements JsonSerializable
 | 
						|
{
 | 
						|
    const colTypes = [
 | 
						|
        'int', 'bool', 'float', 'string'
 | 
						|
    ];
 | 
						|
 | 
						|
    private $name;
 | 
						|
    private $title;
 | 
						|
    private $type;
 | 
						|
 | 
						|
    public static function columnsFromJson($columns)
 | 
						|
    {
 | 
						|
        return array_map(function ($x) {
 | 
						|
            return new Column($x);
 | 
						|
        }, $columns);
 | 
						|
    }
 | 
						|
 | 
						|
    public function __get($name)
 | 
						|
    {
 | 
						|
        if (property_exists($this, $name)) {
 | 
						|
            return $this->$name;
 | 
						|
        }
 | 
						|
 | 
						|
        throw new NotApplicableException("No such column property");
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create from object or array
 | 
						|
     *
 | 
						|
     * @param $obj
 | 
						|
     */
 | 
						|
    public function __construct($obj)
 | 
						|
    {
 | 
						|
        $b = new \objBag($obj);
 | 
						|
        $this->name = $b->name;
 | 
						|
        $this->title = $b->title;
 | 
						|
        $this->type = $b->type;
 | 
						|
 | 
						|
        if (!in_array($this->type, self::colTypes)) {
 | 
						|
            throw new NotApplicableException("\"$this->type\" is not a valid column type.");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array with keys {name, title, type}
 | 
						|
     */
 | 
						|
    public function toArray()
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'name' => $this->name,
 | 
						|
            'title' => $this->title,
 | 
						|
            'type' => $this->type,
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Convert a value to the target type, validating it in the process
 | 
						|
     *
 | 
						|
     * @param mixed $value
 | 
						|
     * @return bool|float|int|string
 | 
						|
     */
 | 
						|
    public function cast($value)
 | 
						|
    {
 | 
						|
        switch ($this->type) {
 | 
						|
            case 'int':
 | 
						|
                if (is_int($value)) return $value;
 | 
						|
                if (is_float($value)) return round($value);
 | 
						|
                if (is_numeric($value)) return intval($value);
 | 
						|
                throw new NotApplicableException("Could not convert value \"$value\" to int!");
 | 
						|
 | 
						|
            case 'float':
 | 
						|
                if (is_int($value) || is_float($value)) return (float)$value;
 | 
						|
                if (is_numeric($value)) return floatval($value);
 | 
						|
                throw new NotApplicableException("Could not convert value \"$value\" to float!");
 | 
						|
 | 
						|
            case 'bool':
 | 
						|
                return Utils::parseBool($value);
 | 
						|
 | 
						|
            case 'string':
 | 
						|
                return "$value";
 | 
						|
 | 
						|
            default:
 | 
						|
                throw new \LogicException("Illegal column type: \"$this->type\"");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Specify data which should be serialized to JSON
 | 
						|
     * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
 | 
						|
     * @return mixed data which can be serialized by <b>json_encode</b>,
 | 
						|
     * which is a value of any type other than a resource.
 | 
						|
     * @since 5.4.0
 | 
						|
     */
 | 
						|
    public function jsonSerialize()
 | 
						|
    {
 | 
						|
        return $this->toArray();
 | 
						|
    }
 | 
						|
}
 | 
						|
 |