vendor/pimcore/customer-management-framework-bundle/src/CustomerProvider/DefaultCustomerProvider.php line 70

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace CustomerManagementFrameworkBundle\CustomerProvider;
  15. use CustomerManagementFrameworkBundle\CustomerProvider\Exception\DuplicateCustomersFoundException;
  16. use CustomerManagementFrameworkBundle\CustomerProvider\ObjectNamingScheme\ObjectNamingSchemeInterface;
  17. use CustomerManagementFrameworkBundle\Model\CustomerInterface;
  18. use Pimcore\Model\Factory;
  19. class DefaultCustomerProvider implements CustomerProviderInterface
  20. {
  21.     /**
  22.      * @var string
  23.      */
  24.     protected $pimcoreClass;
  25.     /**
  26.      * @var string
  27.      */
  28.     protected $parentPath;
  29.     /**
  30.      * @var ObjectNamingSchemeInterface
  31.      */
  32.     protected $namingScheme;
  33.     /**
  34.      * @var Factory
  35.      */
  36.     protected $modelFactory;
  37.     /**
  38.      * @var bool
  39.      */
  40.     protected $usesClassOverride false;
  41.     /**
  42.      * @var null|string
  43.      */
  44.     protected $classNameWithoutNamespace null;
  45.     /**
  46.      * DefaultCustomerProvider constructor.
  47.      *
  48.      * @param string $pimcoreClass
  49.      * @param string $parentPath
  50.      * @param ObjectNamingSchemeInterface $namingScheme
  51.      */
  52.     public function __construct($pimcoreClass$parentPathObjectNamingSchemeInterface $namingSchemeFactory $modelFactory)
  53.     {
  54.         $this->pimcoreClass $pimcoreClass;
  55.         if (empty($this->pimcoreClass)) {
  56.             throw new \RuntimeException('Customer class is not defined');
  57.         }
  58.         if (!class_exists($pimcoreClass)) {
  59.             if (!class_exists('Pimcore\\Model\\DataObject\\' $pimcoreClass)) {
  60.                 throw new \RuntimeException(sprintf('Configured CMF customer data object class "%s" does not exist.'$pimcoreClass));
  61.             }
  62.         } else {
  63.             $this->usesClassOverride true;
  64.             // Get ending of classname for listings.
  65.             $explodedClassName explode('\\'$pimcoreClass);
  66.             $this->classNameWithoutNamespace end($explodedClassName);
  67.         }
  68.         $this->parentPath $parentPath;
  69.         if (empty($this->parentPath)) {
  70.             throw new \RuntimeException('Customer save path is not defined');
  71.         }
  72.         $this->namingScheme $namingScheme;
  73.         $this->modelFactory $modelFactory;
  74.     }
  75.     /**
  76.      * @return string
  77.      */
  78.     protected function getDiClassName()
  79.     {
  80.         if ($this->usesClassOverride) {
  81.             return $this->pimcoreClass;
  82.         }
  83.         return sprintf('Pimcore\Model\DataObject\%s'$this->pimcoreClass);
  84.     }
  85.     /**
  86.      * @return string
  87.      */
  88.     protected function getDiListingClassName()
  89.     {
  90.         if ($this->usesClassOverride) {
  91.             // Check if Listing class exists in default namespace
  92.             return sprintf('Pimcore\Model\DataObject\%s\Listing'$this->classNameWithoutNamespace);
  93.         }
  94.         return sprintf('Pimcore\Model\DataObject\%s\Listing'$this->pimcoreClass);
  95.     }
  96.     /**
  97.      * @return int
  98.      */
  99.     public function getCustomerClassId()
  100.     {
  101.         return $this->callStatic('classId');
  102.     }
  103.     /**
  104.      * @return string
  105.      */
  106.     public function getCustomerClassName()
  107.     {
  108.         $class $this->getDiClassName();
  109.         $customer $this->modelFactory->build($class);
  110.         return get_class($customer);
  111.     }
  112.     /**
  113.      * Get an object listing
  114.      *
  115.      * @return \Pimcore\Model\DataObject\Listing\Concrete
  116.      */
  117.     public function getList()
  118.     {
  119.         $listClass $this->getDiListingClassName();
  120.         /** @var \Pimcore\Model\DataObject\Listing\Concrete $listClass */
  121.         $listClass $this->modelFactory->build($listClass);
  122.         return new $listClass();
  123.     }
  124.     /**
  125.      * Create a customer instance
  126.      *
  127.      * @param array $data
  128.      *
  129.      * @return CustomerInterface
  130.      */
  131.     public function create(array $data = [])
  132.     {
  133.         $customer $this->createCustomerInstance();
  134.         $customer->setValues($data);
  135.         $customer->setPublished(true);
  136.         $this->applyObjectNamingScheme($customer);
  137.         return $customer;
  138.     }
  139.     /**
  140.      * Create a customer instance
  141.      *
  142.      * @return CustomerInterface
  143.      */
  144.     public function createCustomerInstance()
  145.     {
  146.         $className $this->getDiClassName();
  147.         /** @var CustomerInterface $customer */
  148.         $customer $this->modelFactory->build($className);
  149.         return $customer;
  150.     }
  151.     /**
  152.      * @param CustomerInterface $customer
  153.      * @param array $data
  154.      *
  155.      * @return CustomerInterface
  156.      */
  157.     public function update(CustomerInterface $customer, array $data = [])
  158.     {
  159.         // TODO naive version - add validation / settable values
  160.         $customer->setValues($data);
  161.         return $customer;
  162.     }
  163.     /**
  164.      * @param CustomerInterface $customer
  165.      *
  166.      * @return $this
  167.      */
  168.     public function delete(CustomerInterface $customer)
  169.     {
  170.         $customer->delete();
  171.         return $this;
  172.     }
  173.     /**
  174.      * Get customer by ID
  175.      *
  176.      * @param int $id
  177.      * @param bool $force
  178.      *
  179.      * @return CustomerInterface|null
  180.      */
  181.     public function getById($id$force false)
  182.     {
  183.         return $this->callStatic('getById', [$id$force]);
  184.     }
  185.     /**
  186.      * Get active customer by email
  187.      *
  188.      * @param string $email
  189.      *
  190.      * @return CustomerInterface|null
  191.      *
  192.      * @throws DuplicateCustomersFoundException
  193.      */
  194.     public function getActiveCustomerByEmail($email)
  195.     {
  196.         if (!trim($email)) {
  197.             return null;
  198.         }
  199.         $list $this->getList();
  200.         $list->setUnpublished(false);
  201.         $this->addActiveCondition($list);
  202.         $list->addConditionParam('trim(email) like ?', [$list->escapeLike(trim($email))]);
  203.         if ($list->count() > 1) {
  204.             throw new DuplicateCustomersFoundException(sprintf('multiple active and published customers with email %s found'$email));
  205.         }
  206.         /** @var CustomerInterface $customer */
  207.         $customer $list->current();
  208.         return $customer;
  209.     }
  210.     /**
  211.      * Sets the correct parent folder and object key for the given customer.
  212.      *
  213.      * @param CustomerInterface $customer
  214.      *
  215.      * @return void
  216.      */
  217.     public function applyObjectNamingScheme(CustomerInterface $customer)
  218.     {
  219.         $this->namingScheme->apply($customer);
  220.     }
  221.     public function getParentPath()
  222.     {
  223.         return $this->parentPath;
  224.     }
  225.     /**
  226.      * @return string
  227.      *
  228.      * @deprecated use getParentPath() instead.
  229.      */
  230.     public function getParentParentPath()
  231.     {
  232.         trigger_deprecation(
  233.             'pimcore/customer-data-framework',
  234.             '3.3.0',
  235.             'The DefaultCustomerProvider::getParentParentPath() method is deprecated, use DefaultCustomerProvider::getParentPath() instead.'
  236.         );
  237.         return $this->getParentPath();
  238.     }
  239.     public function setParentPath($parentPath)
  240.     {
  241.         $this->parentPath $parentPath;
  242.     }
  243.     /**
  244.      * @param string $method
  245.      * @param array $arguments
  246.      *
  247.      * @return mixed
  248.      */
  249.     protected function callStatic($method, array $arguments = [])
  250.     {
  251.         $className $this->getDiClassName();
  252.         return call_user_func_array([$className$method], $arguments);
  253.     }
  254.     /**
  255.      * @param \Pimcore\Model\DataObject\Listing\Concrete $list
  256.      */
  257.     public function addActiveCondition($list)
  258.     {
  259.         $list->addConditionParam('active = 1');
  260.     }
  261.     /**
  262.      * @param \Pimcore\Model\DataObject\Listing\Concrete $list
  263.      */
  264.     public function addInActiveCondition($list)
  265.     {
  266.         $list->addConditionParam('(active IS NULL OR active != 1)');
  267.     }
  268. }