lib/Ajde/Crud/Field/Fk.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

class Ajde_Crud_Field_Fk extends Ajde_Crud_Field_Enum
{
    /**
     * @var Ajde_Collection
     */
    private $_collection;

    /**
     * @var Ajde_Model
     */
    private $_model;

    /**
     * @return string
     */
    public function getModelName()
    {
        if ($this->hasModelName()) {
            return $this->get('modelName');
        } else {
            $fieldName = $this->getName();
            $model = $this->getCrud()->getModel();

            return (string) $model->getParentModel($fieldName)->getTable();
        }
    }

    public function getValue()
    {
        $value = parent::getValue();
        if (!$value instanceof Ajde_Model && !empty($value)) {
            $model = $this->getModel();
            $model->loadByPK($value);
            $this->set('value', $model);
        }

        return parent::getValue();
    }

    /**
     * @return Ajde_Collection
     */
    public function getCollection()
    {
        if (!isset($this->_collection)) {
            $collectionName = ucfirst($this->getModelName()).'Collection';
            $this->_collection = new $collectionName();

            $langFilter = false;
            if ($this->hasFilterLang()) {
                $langFilter = $this->getFilterLang();
            }
            $lang = false;

            // Filter lang by parent (model) language
            if ($langFilter == 'parent') {
                $fieldName = $this->getName();
                $parent = $this->getCrud()->getModel();
                if (method_exists($parent, 'getLanguageField')) {
                    $lang = $parent->get($parent->getLanguageField());
                }
            }

            // Filter lang by current (page) language
            if ($langFilter == 'page') {
                $lang = config('i18n.default');
            }

            if ($langFilter && $lang && method_exists($this->_collection, 'getLanguageField')) {
                $languageField = $this->_collection->getLanguageField();
                $this->_collection->addFilter(new Ajde_Filter_Where($languageField, Ajde_Filter::FILTER_EQUALS, $lang));
            }
        }

        return $this->_collection;
    }

    /**
     * @return Ajde_Model
     */
    public function getModel()
    {
        if (!isset($this->_model)) {
            $modelName = ucfirst($this->getModelName()).'Model';
            $this->_model = new $modelName();
        }

        return $this->_model;
    }

    public function getValues()
    {
        if ($this->hasFilter()) {
            $filter = $this->getFilter();
            $group = new Ajde_Filter_WhereGroup();
            foreach ($filter as $rule) {
                $group->addFilter(new Ajde_Filter_Where($this->getModel()->getDisplayField(),
                    Ajde_Filter::FILTER_EQUALS, $rule, Ajde_Query::OP_OR));
            }
            $this->getCollection()->addFilter($group);
        }

        if ($this->hasAdvancedFilter()) {
            $filters = $this->getAdvancedFilter();
            $group = new Ajde_Filter_WhereGroup();
            foreach ($filters as $filter) {
                if ($filter instanceof Ajde_Filter_Where) {
                    $group->addFilter($filter);
                } else {
                    $this->getCollection()->addFilter($filter);
                }
            }
            $this->getCollection()->addFilter($group);
        }

        $this->getCollection()->getQuery()->orderBy = [];
        if ($this->hasOrderBy()) {
            $this->getCollection()->orderBy($this->getOrderBy());
        } else {
            $this->getCollection()->orderBy($this->getModel()->getDisplayField());
        }
        $return = [];
        foreach ($this->getCollection() as $model) {
            $fn = 'get'.ucfirst($model->getDisplayField());
            $return[(string) $model] = $model->{$fn}();
        }

        return $return;
    }
}