imagecms/ImageCMS

View on GitHub
application/modules/CMSFactory/PropelBaseModelClass.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

namespace CMSFactory;

use CMSFactory\DependencyInjection\DependencyInjectionProvider;
use Currency\Currency;
use CustomFieldsData;
use CustomFieldsDataQuery;
use CustomFieldsQuery;
use Doctrine\Common\Cache\CacheProvider;
use MY_Controller;
use MY_Form_validation;
use Propel\Runtime\Connection\ConnectionInterface;

class PropelBaseModelClass implements \Serializable
{

    public $customFields;

    public $customData;

    public $hasCustomData = false;

    public $entityId;

    private $entities_locale = [
                                'product',
                                'category',
                                'brand',
                               ];

    /**
     * @param MY_Form_validation $validator
     * @return mixed
     */
    public function validateCustomData($validator) {
        if (!empty($this->entityName)) {
            $this->collectCustomData($this->entityName, $this->getId());

            if ($this->hasCustomData !== false) {
                foreach ($_POST['custom_field'] as $key_post => $value_post) {
                    foreach ($this->customFields as $key => $value) {
                        if ((int) $key_post == $value['Id']) {

                            $validator_str = '';
                            if ($value['IsRequired'] && $this->curentPostEntitySave($key)) {
                                $validator_str = 'required';
                            }
                            if ($value['Validators'] && $this->curentPostEntitySave($key)) {
                                $validator_str .= '|' . $value['Validators'];
                            }
                            $name = array_shift($value['CustomFieldsI18ns'])['FieldLabel'];
                            $validator->set_rules("custom_field[$key]", $name, $validator_str);
                        }
                    }
                }
            }
        }
        return $validator;
    }

    /**
     * @param string $entityName
     * @param int $id
     * @return bool
     */
    public function collectCustomData($entityName, $id) {
        $this->entityId = $id;
        $this->customFields = CustomFieldsQuery::create()
            ->joinWithI18n(MY_Controller::defaultLocale())
            ->filterByIsActive(1)
            ->filterByEntity($entityName)
            ->find()
            ->toArray($keyColumn = 'id');

        if (count($this->customFields)) {
            $this->hasCustomData = true;
        } else {
            return false;
        }
    }

    /**
     * @param int $key
     * @return bool
     */
    public function curentPostEntitySave($key) {
        $entity = CustomFieldsQuery::create()->findPk($key);
        if ($entity) {
            return $entity->getEntity() == $this->entityName;
        }
    }

    public function saveCustomData() {

        $locale = in_array($this->entityName, $this->entities_locale, true) ? chose_language() : MY_Controller::defaultLocale();

        if ($this->hasCustomData === false) {
            $this->collectCustomData($this->entityName, $this->getId());
        }
        $data = $_POST['custom_field'];

        if (!$data) {
            return;
        }

        $newFields = [];
        foreach ($this->customFields as $fieldObject) {
            if (!array_key_exists($fieldObject['Id'], $data)) {
                $data[$fieldObject['Id']] = '';
                $newFields[] = $fieldObject['Id'];
            }

            foreach ($data as $key => $value) {
                if ((int) $key == $fieldObject['Id']) {

                    $objCustomData = CustomFieldsDataQuery::create()
                                                          ->filterByentityId($this->entityId)
                                                          ->filterByfieldId($key)
                                                          ->filterByLocale($locale)
                                                          ->findOne();
                    if ($objCustomData) {
                        if (!in_array($key, $newFields)) {
                            $objCustomData->setdata($value);
                            $objCustomData->save();
                        }
                        break;
                    } else {
                        $fieldObject = new CustomFieldsData();
                        $fieldObject->setentityId($this->entityId);
                        $fieldObject->setfieldId($key);
                        $fieldObject->setdata($value);
                        $fieldObject->setLocale($locale);
                        $fieldObject->save();
                        break;
                    }
                }
            }
        }
    }

    /**
     * @param $attributeName
     * @return mixed
     */
    public function getLabel($attributeName) {
        if (method_exists($this, 'attributeLabels')) {
            $labels = $this->attributeLabels();

            if (isset($labels[$attributeName])) {
                return $labels[$attributeName];
            } else {
                return $attributeName;
            }
        }
    }

    /**
     * @param string $column
     * @return bool
     */
    public function getVirtual($column) {
        $column = strtolower($column);
        return $this->getVirtualColumn($column);
    }

    /**
     * @param string $name
     * @return bool
     */
    public function getVirtualColumn($name) {
        $name = strtolower($name);

        if (!$this->hasVirtualColumn($name)) {
            return false;
        }
        return parent::getVirtualColumn($name);
    }

    /**
     * Convert model attribute(by default Price). e.g. "99.99 $"
     *
     * @param string $attributeName Optional. Attribute name to convert.
     * @access public
     * @return string
     */
    public function toCurrency($attributeName = 'Price', $cId = null, $convertForTemplate = false) {
        $attributeName = strtolower($attributeName);
        $get = 'get' . $attributeName;

        if (!$convertForTemplate) {
            if ($attributeName == 'origprice') {
                return Currency::create()->convert($this->getVirtualColumn('origprice'), $cId);
            }
            return Currency::create()->convert($this->$get(), $cId);
        } else {
            if ($attributeName == 'origprice') {
                return Currency::create()->convertForTemplate($this->getVirtualColumn('origprice'), $cId);
            }
            return Currency::create()->convertForTemplate($this->$get(), $cId);
        }
    }

    /**
     * Simple getter.
     *
     * @param  $name
     * @return
     */
    public function __get($name) {
        if (isset($this->$name)) {
            return $this->$name;
        }

        $call = 'get' . $name;
        if (method_exists($this, $call)) {
            return $this->$call();
        }
    }

    /**
     * @return CacheProvider
     */
    public function getCache() {

        return DependencyInjectionProvider::getContainer()->get('cache');
    }

    public function __call($name, $param) {

        if (preg_match('/get(\w+)/', $name, $matches)) {
            $virtualColumn = $matches[1];
            $virtualColumn = strtolower($virtualColumn);
            if ($this->hasVirtualColumn($virtualColumn)) {
                return $this->getVirtualColumn($virtualColumn);
            }
            // no lcfirst in php<5.3...
            $virtualColumn[0] = strtolower($virtualColumn[0]);
            if ($this->hasVirtualColumn($virtualColumn)) {
                return $this->getVirtualColumn($virtualColumn);
            }
        }
    }

    public function setVirtualColumn($name, $value) {

        $name = strtolower($name);

        parent::setVirtualColumn($name, $value);
    }

    public function preSave(ConnectionInterface $con = null) {
        return true;
    }

    public function postSave(ConnectionInterface $con = null) {
        return true;
    }

    public function preInsert(ConnectionInterface $con = null) {
        return true;
    }

    public function postInsert(ConnectionInterface $con = null) {
        return true;
    }

    public function preUpdate(ConnectionInterface $con = null) {
        return true;
    }

    public function postUpdate(ConnectionInterface $con = null) {
        return true;
    }

    public function postDelete(ConnectionInterface $con = null) {
        return true;
    }

    public function preDelete(ConnectionInterface $con = null) {
        return true;
    }

    /**
     * String representation of object
     * @link http://php.net/manual/en/serializable.serialize.php
     * @return string the string representation of the object or null
     * @since 5.1.0
     */
    public function serialize() {
        $this->prepareToSleep();

        $cls = new \ReflectionClass($this);
        $propertyNames = [];
        $serializableProperties = array_diff($cls->getProperties(), $cls->getProperties(\ReflectionProperty::IS_STATIC));

        foreach ($serializableProperties as $property) {

            $propertyName = $property->getName();
            $propertyValue = $this->$propertyName;

            if ($propertyValue !== null) {
                $propertyNames[$propertyName] = $propertyValue;

            }

        }

        return serialize($propertyNames);
    }

    private function prepareToSleep() {
        $this->collSCategoriesRelatedById = null;
        $this->collSCategoryI18ns = null;
        $this->collSProductss = null;
        $this->collShopProductCategoriess = null;
        $this->collShopProductPropertiesCategoriess = null;
        $this->collProducts = null;
        $this->collProperties = null;
        $this->aSCategory = null;
    }

    /**
     * Constructs the object
     * @link http://php.net/manual/en/serializable.unserialize.php
     * @param string $serialized <p>
     * The string representation of the object.
     * </p>
     * @return void
     * @since 5.1.0
     */
    public function unserialize($serialized) {
        $serialized = unserialize($serialized);

        foreach ($serialized as $key => $item) {

            $this->$key = $item;

        }

    }

}