travi/php-framework

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

Summary

Maintainability
A
25 mins
Test Coverage
<?php

namespace travi\framework\components\Forms;

use travi\framework\components\Forms\FormElementGroup,
    travi\framework\components\Forms\inputs\Input,
    travi\framework\components\Forms\FieldSet;
use travi\framework\DependantObject;

class Form extends FormElementGroup
{
    const FORMS_NAMESPACE = "travi\\framework\\components\\Forms\\";
    /** @var string */
    private $name;
    /** @var string */
    private $method;
    /** @var string */
    private $action;
    /** @var string */
    private $encodingType;

    private $actions = array();
    public $key;

    public function __construct($options = array())
    {
        if (isset($options['name'])) {
            $this->name = $options['name'];
        }
        if (!empty($options['method'])) {
            $this->setMethod($options['method']);
        } else {
            $this->method = 'post';
        }
        if (!empty($options['action'])) {
            $this->action = $options['action'];
        }

        $this->addStyleSheet('/resources/thirdparty/travi-styles/dist/css/form/travi-form.css');
    }

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

    public function getMethod()
    {
        return $this->method;
    }

    public function setMethod($method)
    {
        $this->method = $method;
    }

    public function getAction()
    {
        return $this->action;
    }

    public function getEncType()
    {
        if ($this->containsFormElementType(self::FORMS_NAMESPACE . 'inputs\\FileInput')) {
            $this->encodingType = "multipart/form-data";
        }
        return $this->encodingType;
    }

    public function getDependencies()
    {
        foreach ($this->actions as $action) {
            /** @var DependantObject $action */
            $this->addDependencies($action->getDependencies());
        }

        $validations = $this->getValidations();

        $dependencies = parent::getDependencies();

        $dependencies['validations'] = $validations;

        return $dependencies;
    }

    public function getValidations()
    {
        $validations = parent::getValidations();

        if (!empty($validations)) {
            $this->addJavaScript('validation');
        }

        return $validations;
    }

    public function hasErrors()
    {
        return !$this->isValid();
    }

    /**
     * @param string $action
     */
    public function setAction($action)
    {
        $this->action = $action;
    }

    public function getActions()
    {
        return $this->actions;
    }


    public function addAction($action)
    {
        array_push($this->actions, $action);
    }

    public function mapErrorMessagesToFields($errors = array())
    {
        foreach ($errors as $fieldName => $error) {
            if ('name' === $fieldName) {
                $fieldName = $fieldName . '_value';
            }
            $this->getFieldByName($fieldName)->setValidationError($error);
        }
    }

    public function getFieldByName($fieldName)
    {
        $field = parent::getFieldByName($fieldName);

        if (!isset($field)) {
            /** @var Field $action */
            foreach ($this->actions as $action) {
                if ($this->fieldIsNamed($action, $fieldName)) {
                    $field = $action;
                }
            }
        }

        return $field;
    }

    /**
     * @param $action Field
     * @param $fieldName
     * @return bool
     */
    private function fieldIsNamed($action, $fieldName)
    {
        return is_a($action, 'travi\\framework\\components\\Forms\\Field')
            && $fieldName === $action->getName();
    }
}