Beispiel #1
0
 /**
  * Import 'attributes' value
  *
  * @param \XLite\Model\Product $model  Product
  * @param array                $value  Value
  * @param array                $column Column info
  *
  * @return void
  */
 protected function importAttributesColumn(\XLite\Model\Product $model, array $value, array $column)
 {
     parent::importAttributesColumn($model, $value, $column);
     if ($this->multAttributes) {
         \XLite\Core\Database::getEM()->flush();
         $variantsAttributes = array();
         foreach ($this->multAttributes as $id => $values) {
             foreach ($values as $k => $v) {
                 if (1 === count($v)) {
                     $variantsAttributes[$k][$id] = array_shift($v);
                 } else {
                     unset($this->multAttributes[$id]);
                     break;
                 }
             }
         }
         if ($variantsAttributes) {
             $tmp = array();
             foreach ($variantsAttributes as $k => $v) {
                 $tmp[$k] = implode('::', $v);
             }
             if (count($tmp) === count($variantsAttributes)) {
                 foreach ($variantsAttributes as $rowIndex => $values) {
                     foreach ($values as $id => $value) {
                         if (!isset($this->variantsAttributes[$id])) {
                             $this->variantsAttributes[$id] = \XLite\Core\Database::getRepo('XLite\\Model\\Attribute')->find($id);
                         }
                         $attribute = $this->variantsAttributes[$id];
                         $repo = \XLite\Core\Database::getRepo($attribute->getAttributeValueClass($attribute->getType()));
                         if ($attribute::TYPE_CHECKBOX == $attribute->getType()) {
                             $values[$id] = $repo->findOneBy(array('attribute' => $attribute, 'product' => $model, 'value' => $this->normalizeValueAsBoolean($value)));
                         } else {
                             $attributeOption = \XLite\Core\Database::getRepo('XLite\\Model\\AttributeOption')->findOneByNameAndAttribute($value, $attribute);
                             $values[$id] = $repo->findOneBy(array('attribute' => $attribute, 'product' => $model, 'attribute_option' => $attributeOption));
                         }
                     }
                     $variant = $model->getVariantByAttributeValues($values);
                     if (!$variant) {
                         $variant = new \XLite\Module\XC\ProductVariants\Model\ProductVariant();
                         foreach ($values as $attributeValue) {
                             $method = 'addAttributeValue' . $attributeValue->getAttribute()->getType();
                             $variant->{$method}($attributeValue);
                             $attributeValue->addVariants($variant);
                         }
                         $variant->setProduct($model);
                         $model->addVariants($variant);
                         \XLite\Core\Database::getEM()->persist($variant);
                     }
                     $this->variants[$rowIndex] = $variant;
                 }
             }
             foreach ($model->getVariantsAttributes() as $va) {
                 $model->getVariantsAttributes()->removeElement($va);
                 $va->getVariantsProducts()->removeElement($model);
             }
             foreach ($this->variantsAttributes as $va) {
                 $model->addVariantsAttributes($va);
                 $va->addVariantsProducts($model);
             }
         }
         $model->assignDefaultVariant();
     }
 }