/** * doActionAddUpselling * * @return void */ protected function doActionAdd() { if (isset(\XLite\Core\Request::getInstance()->select)) { $pids = \XLite\Core\Request::getInstance()->select; $products = \XLite\Core\Database::getRepo('\\XLite\\Model\\Product')->findByIds($pids); $this->id = \XLite\Core\Request::getInstance()->parent_product_id; $parentProduct = \XLite\Core\Database::getRepo('\\XLite\\Model\\Product')->find($this->id); $existingLinksIds = array(); $existingLinks = $this->getUpsellingList(); if ($existingLinks) { foreach ($existingLinks as $k => $v) { $existingLinksIds[] = $v->getProduct()->getProductId(); } } if ($products) { foreach ($products as $product) { if (in_array($product->getProductId(), $existingLinksIds)) { \XLite\Core\TopMessage::addWarning('The product SKU#"X" is already set as Related for the product', array('SKU' => $product->getSku())); } else { $up = new \XLite\Module\XC\Upselling\Model\UpsellingProduct(); $up->setProduct($product); $up->setParentProduct($parentProduct); \XLite\Core\Database::getEM()->persist($up); \XLite\Core\Database::getEM()->flush($up); \XLite\Core\Database::getRepo('XLite\\Module\\XC\\Upselling\\Model\\UpsellingProduct')->addBidirectionalLink($up); } } } } $this->setReturnURL($this->buildURL('product', '', array('page' => 'upselling_products', 'product_id' => $this->id))); }
/** * Import 'relatedProducts' value * * @param \XLite\Model\Product $model Product * @param array $value Value (array of related products SKUs) * @param array $column Column info * * @return void */ protected function importRelatedProductsColumn(\XLite\Model\Product $model, array $value, array $column) { $currentRelations = \XLite\Core\Database::getRepo('XLite\\Module\\XC\\Upselling\\Model\\UpsellingProduct')->getUpsellingProducts($model->getProductId()); $relSku = array(); if ($currentRelations) { // Get SKU cache of currently assigned related products // and remove related products which are not in new values list $toDelete = array(); foreach ($currentRelations as $rel) { $relSku[] = $rel->getProduct()->getSku(); if ($rel->getProduct() && !in_array($rel->getProduct()->getSku(), $value)) { $toDelete[] = $rel; } } if ($toDelete) { \XLite\Core\Database::getRepo('XLite\\Module\\XC\\Upselling\\Model\\UpsellingProduct')->deleteInBatch($toDelete); } } if ($value) { // Add current product SKU to avoid creations of the related product with the same SKU $relSku[] = $model->getSku(); foreach ($value as $relProductSku) { if (!in_array($relProductSku, $relSku)) { // Create new relation $relProduct = \XLite\Core\Database::getRepo('XLite\\Model\\Product')->findOneBySku($relProductSku); if ($relProduct) { $up = new \XLite\Module\XC\Upselling\Model\UpsellingProduct(); $up->setProduct($relProduct); $up->setParentProduct($model); \XLite\Core\Database::getEM()->persist($up); } } } } }
/** * Clone upselling links * * @param \XLite\Model\Product $product Cloned product object * @param boolean $backLinks Flag: true - create back links, false - direct links * * @return void */ protected function cloneUpsellingLinks($product, $backLinks = false) { $upsellingLinks = $backLinks ? $this->getUpsellingParentProducts() : $this->getUpsellingProducts(); foreach ($upsellingLinks as $up) { $newUp = new \XLite\Module\XC\Upselling\Model\UpsellingProduct(); if ($backLinks) { $newUp->setProduct($product); $newUp->setParentProduct($up->getParentProduct()); } else { $newUp->setProduct($up->getProduct()); $newUp->setParentProduct($product); } $newUp->setOrderBy($up->getOrderBy()); \XLite\Core\Database::getEM()->persist($newUp); } }