travi/php-framework

View on GitHub
php/framework/src/travi/framework/components/Forms/Field.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

namespace travi\framework\components\Forms;

use travi\framework\content\ContentObject;

abstract class Field extends ContentObject implements FormElement
{
    protected $validations = array();
    protected $name;
    protected $label;
    protected $value;
    protected $error;
    protected $type;
    protected $class;

    public function __construct($options)
    {
        $this->initializeLabel($options);
        $this->initializeName($options);
        $this->initializeValue($options);
        $this->initializeValidations($options);
    }

    public function getValidations()
    {
        return $this->validations;
    }

    public function setName($name)
    {
        $name = str_replace(' ', '_', strtolower($name));

        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getId()
    {
        return $this->name;
    }

    public function setLabel($label)
    {
        $this->label = $label;
    }

    public function getLabel()
    {
        return $this->label;
    }

    public function setType($type)
    {
        $this->type = $type;
    }

    public function getType()
    {
        return $this->type;
    }

    public function setClass($class)
    {
        $this->class = $class;
    }

    public function getClass()
    {
        return $this->class;
    }

    public function addValidation($validation)
    {
        array_push($this->validations, $validation);
    }

    public function getValidationError()
    {
        return $this->error;
    }

    public function setValidationError($message)
    {
        $this->error = $message;
    }

    public function isValid()
    {
        $value = trim($this->value);
        if (in_array('required', $this->getValidations()) && empty($value)) {
            $this->setValidationError($this->label . ' is required');
            return false;
        }

        return true;
    }

    public function setValue($value)
    {
        $this->value = $value;
    }

    public function getValue()
    {
        return $this->value;
    }

    /**
     * @param $options
     */
    protected function initializeValidations($options)
    {
        if (!empty($options['validations'])) {
            foreach ($options['validations'] as $validation) {
                $this->addValidation($validation);
            }
        }
    }

    /**
     * @param $options
     * @return mixed
     */
    protected function initializeLabel($options)
    {
        if (isset($options['label'])) {
            $this->label = $options['label'];
        }
    }

    /**
     * @param $options
     * @return mixed
     */
    protected function initializeName($options)
    {
        if (!empty($options['name'])) {
            $this->setName($options['name']);
        } elseif (isset($this->label)) {
            $this->setName($options['label']);
        }
    }

    /**
     * @param $options
     * @return mixed
     */
    protected function initializeValue($options)
    {
        if (isset($options['value'])) {
            $this->value = $options['value'];
        }
    }
}