/** * @param ListProduct $listProduct * @param ListProduct $product */ public function assignProductData(ListProduct $listProduct, ListProduct $product) { $product->setShippingFree($listProduct->isShippingFree()); $product->setMainVariantId($listProduct->getMainVariantId()); $product->setAllowsNotification($listProduct->allowsNotification()); $product->setHighlight($listProduct->highlight()); $product->setUnit($listProduct->getUnit()); $product->setTax($listProduct->getTax()); $product->setPrices($listProduct->getPrices()); $product->setManufacturer($listProduct->getManufacturer()); $product->setCover($listProduct->getCover()); $product->setCheapestPrice($listProduct->getCheapestPrice()); $product->setName($listProduct->getName()); $product->setAdditional($listProduct->getAdditional()); $product->setCloseouts($listProduct->isCloseouts()); $product->setEan($listProduct->getEan()); $product->setHeight($listProduct->getHeight()); $product->setKeywords($listProduct->getKeywords()); $product->setLength($listProduct->getLength()); $product->setLongDescription($listProduct->getLongDescription()); $product->setMinStock($listProduct->getMinStock()); $product->setReleaseDate($listProduct->getReleaseDate()); $product->setShippingTime($listProduct->getShippingTime()); $product->setShortDescription($listProduct->getShortDescription()); $product->setStock($listProduct->getStock()); $product->setWeight($listProduct->getWeight()); $product->setWidth($listProduct->getWidth()); $product->setPriceGroup($listProduct->getPriceGroup()); $product->setCreatedAt($listProduct->getCreatedAt()); $product->setPriceRules($listProduct->getPriceRules()); $product->setCheapestPriceRule($listProduct->getCheapestPriceRule()); $product->setManufacturerNumber($listProduct->getManufacturerNumber()); $product->setMetaTitle($listProduct->getMetaTitle()); $product->setTemplate($listProduct->getTemplate()); $product->setHasConfigurator($listProduct->hasConfigurator()); $product->setSales($listProduct->getSales()); $product->setHasEsd($listProduct->hasEsd()); $product->setEsd($listProduct->getEsd()); $product->setIsPriceGroupActive($listProduct->isPriceGroupActive()); $product->setBlockedCustomerGroupIds($listProduct->getBlockedCustomerGroupIds()); $product->setVoteAverage($listProduct->getVoteAverage()); $product->setHasAvailableVariant($listProduct->hasAvailableVariant()); $product->setCheapestUnitPrice($listProduct->getCheapestUnitPrice()); $product->setFallbackPriceCount($listProduct->getFallbackPriceCount()); $product->setCustomerPriceCount($listProduct->getCustomerPriceCount()); foreach ($listProduct->getAttributes() as $name => $attribute) { $product->addAttribute($name, $attribute); } foreach ($listProduct->getStates() as $state) { $product->addState($state); } }
/** * Add premium products to cart * Used internally in sBasket and in CheckoutController * * @return bool|int */ public function sInsertPremium() { static $lastPremium; $sBasketAmount = $this->sGetAmount(); $sBasketAmount = empty($sBasketAmount["totalAmount"]) ? 0 : $sBasketAmount["totalAmount"]; $sBasketAmount = (double) $sBasketAmount; $addPremium = $this->front->Request()->getQuery('sAddPremium'); if (empty($addPremium)) { $deletePremium = $this->db->fetchCol('SELECT basket.id FROM s_order_basket basket LEFT JOIN s_addon_premiums premium ON premium.ordernumber_export = basket.ordernumber AND premium.startprice <= ? WHERE basket.modus = 1 AND premium.id IS NULL AND basket.sessionID = ?', array($sBasketAmount, $this->session->get('sessionId'))); if (empty($deletePremium)) { return true; } $this->db->delete('s_order_basket', array('id IN (?)' => $deletePremium)); return true; } if (isset($lastPremium) && $lastPremium == $addPremium) { return false; } $lastPremium = $addPremium; $this->db->delete('s_order_basket', array('sessionID = ?' => $this->session->get('sessionId'), 'modus = 1')); $premium = $this->db->fetchRow(' SELECT premium.id, detail.ordernumber, article.id as articleID, article.name as articleName, article.main_detail_id, detail.id as variantID, detail.additionaltext, premium.ordernumber_export, article.configurator_set_id FROM s_addon_premiums premium, s_articles_details detail, s_articles article, s_articles_details detail2 WHERE detail.ordernumber = ? AND premium.startprice <= ? AND premium.ordernumber = detail2.ordernumber AND detail2.articleID = detail.articleID AND detail.articleID = article.id', array($addPremium, $sBasketAmount)); if (!$premium) { return false; } // Load translations for article or variant if ($premium['main_detail_id'] != $premium['variantID']) { $premium = $this->moduleManager->Articles()->sGetTranslation($premium, $premium['variantID'], "variant"); } else { $premium = $this->moduleManager->Articles()->sGetTranslation($premium, $premium['articleID'], "article"); } if ($premium['configurator_set_id'] > 0) { $premium = $this->moduleManager->Articles()->sGetTranslation($premium, $premium["variantID"], "variant"); $product = new StoreFrontBundle\Struct\ListProduct($premium['articleID'], $premium["variantID"], $premium['ordernumber']); $product->setAdditional($premium['additionaltext']); $context = $this->contextService->getShopContext(); $product = $this->additionalTextService->buildAdditionalText($product, $context); $premium['additionaltext'] = $product->getAdditional(); } if (!empty($premium['configurator_set_id'])) { $number = $premium['ordernumber']; } else { $number = $premium['ordernumber_export']; } return $this->db->insert('s_order_basket', array('sessionID' => $this->session->get('sessionId'), 'articlename' => trim($premium["articleName"] . " " . $premium["additionaltext"]), 'articleID' => $premium['articleID'], 'ordernumber' => $number, 'quantity' => 1, 'price' => 0, 'netprice' => 0, 'tax_rate' => 0, 'datum' => new Zend_Date(), 'modus' => 1, 'currencyFactor' => $this->sSYSTEM->sCurrency["factor"])); }
/** * executes the current product export * * @param resource $handleResource used as a file or the stdout to fetch the smarty output */ public function executeExport($handleResource) { fwrite($handleResource, $this->sSmarty->fetch('string:' . $this->sSettings['header'], $this->sFeedID)); $context = $this->contextService->getShopContext(); $sql = $this->sCreateSql(); $result = $this->db->query($sql); if ($result === false) { return; } // Update db with the latest values $count = (int) $result->rowCount(); $this->db->update('s_export', array('last_export' => new Zend_Date(), 'cache_refreshed' => new Zend_Date(), 'count_articles' => $count), array('id = ?' => $this->sFeedID)); // fetches all required data to smarty $rows = array(); for ($rowIndex = 1; $row = $result->fetch(); $rowIndex++) { if (!empty($row['group_ordernumber_2'])) { $row['group_ordernumber'] = $this->_decode_line($row['group_ordernumber_2']); $row['group_pricenet'] = explode(';', $row['group_pricenet_2']); $row['group_price'] = explode(';', $row['group_price_2']); $row['group_instock'] = explode(';', $row['group_instock_2']); $row['group_active'] = explode(';', $row['group_active_2']); unset($row['group_ordernumber_2'], $row['group_pricenet_2']); unset($row['group_price_2'], $row['group_instock_2'], $row['group_active_2']); for ($i = 1; $i <= 10; $i++) { if (!empty($row['group_group' . $i])) { $row['group_group' . $i] = $this->_decode_line($row['group_group' . $i]); } else { unset($row['group_group' . $i]); } if (!empty($row['group_option' . $i])) { $row['group_option' . $i] = $this->_decode_line($row['group_option' . $i]); } else { unset($row['group_option' . $i]); } } unset($row['group_additionaltext']); } elseif (!empty($row['group_ordernumber'])) { $row['group_ordernumber'] = $this->_decode_line($row['group_ordernumber']); $row['group_additionaltext'] = $this->_decode_line($row['group_additionaltext']); $row['group_pricenet'] = explode(';', $row['group_pricenet']); $row['group_price'] = explode(';', $row['group_price']); $row['group_instock'] = explode(';', $row['group_instock']); $row['group_active'] = explode(';', $row['group_active']); } if (!empty($row['article_translation_fallback'])) { $translation = $this->sMapTranslation('article', $row['article_translation_fallback']); if ($row['main_detail_id'] != $row['articledetailsID']) { unset($translation['additionaltext']); } $row = array_merge($row, $translation); } if (!empty($row['article_translation'])) { $translation = $this->sMapTranslation('article', $row['article_translation']); if ($row['main_detail_id'] != $row['articledetailsID']) { unset($translation['additionaltext']); } $row = array_merge($row, $translation); } if (!empty($row['detail_translation_fallback'])) { $translation = $this->sMapTranslation('detail', $row['detail_translation_fallback']); $row = array_merge($row, $translation); } if (!empty($row['detail_translation'])) { $translation = $this->sMapTranslation('detail', $row['detail_translation']); $row = array_merge($row, $translation); } $row['name'] = htmlspecialchars_decode($row['name']); $row['supplier'] = htmlspecialchars_decode($row['supplier']); //cast it to float to prevent the division by zero warning $row['purchaseunit'] = floatval($row['purchaseunit']); $row['referenceunit'] = floatval($row['referenceunit']); if (!empty($row['purchaseunit']) && !empty($row['referenceunit'])) { $row['referenceprice'] = Shopware()->Modules()->Articles()->calculateReferencePrice($row['price'], $row['purchaseunit'], $row['referenceunit']); } if ($row['configurator'] > 0) { if (empty($this->sSettings["variant_export"]) || $this->sSettings["variant_export"] == 1) { $row['group_additionaltext'] = array(); if (!empty($row['group_ordernumber'])) { foreach ($row['group_ordernumber'] as $orderNumber) { $product = new StoreFrontBundle\Struct\ListProduct((int) $row['articleID'], (int) $row["articledetailsID"], $orderNumber); $product->setAdditional($row['additionaltext']); $product = $this->additionalTextService->buildAdditionalText($product, $context); if (array_key_exists($orderNumber, $row['group_additionaltext'])) { $row['group_additionaltext'][$orderNumber] = $product->getAdditional(); } if ($orderNumber == $row['ordernumber']) { $row['additionaltext'] = $product->getAdditional(); } } } } $product = new StoreFrontBundle\Struct\ListProduct((int) $row['articleID'], (int) $row["articledetailsID"], $row['ordernumber']); $product->setAdditional($row['additionaltext']); $product = $this->additionalTextService->buildAdditionalText($product, $context); $row['additionaltext'] = $product->getAdditional(); } $rows[] = $row; if ($rowIndex == $count || count($rows) >= 50) { @set_time_limit(30); $this->sSmarty->assign('sArticles', $rows); $rows = array(); $template = 'string:{foreach $sArticles as $sArticle}' . $this->sSettings['body'] . '{/foreach}'; fwrite($handleResource, $this->sSmarty->fetch($template, $this->sFeedID)); } } fwrite($handleResource, $this->sSmarty->fetch('string:' . $this->sSettings['footer'], $this->sFeedID)); fclose($handleResource); }
/** * Get name from a certain article by order number * @param string $orderNumber * @param bool $returnAll return only name or additional data, too * @return string or array */ public function sGetArticleNameByOrderNumber($orderNumber, $returnAll = false) { $article = $this->db->fetchRow("\n SELECT\n s_articles.id,\n s_articles.main_detail_id,\n s_articles_details.id AS did,\n s_articles.name AS articleName,\n additionaltext,\n s_articles.configurator_set_id\n FROM s_articles_details, s_articles\n WHERE ordernumber = :orderNumber\n AND s_articles.id = s_articles_details.articleID\n ", array('orderNumber' => $orderNumber)); if (!$article) { return false; } // Load translations for article or variant if ($article['did'] != $article['main_detail_id']) { $article = $this->sGetTranslation($article, $article['did'], "variant"); } else { $article = $this->sGetTranslation($article, $article['id'], "article"); } // If article has variants, we need to append the additional text to the name if ($article['configurator_set_id'] > 0) { $product = new StoreFrontBundle\Struct\ListProduct((int) $article['id'], (int) $article["did"], $orderNumber); $product->setAdditional($article['additionaltext']); $context = $this->contextService->getShopContext(); $product = $this->additionalTextService->buildAdditionalText($product, $context); if (!$returnAll) { return $article["articleName"] . ' ' . $product->getAdditional(); } $article['additionaltext'] = $product->getAdditional(); } if (!$returnAll) { return $article["articleName"]; } return $article; }
/** * Get article data for sAddArticle * * @param int $id Article ordernumber * @return array|false Article data, or false if none found */ private function getArticleForAddArticle($id) { $sql = "\n SELECT s_articles.id AS articleID, s_articles.main_detail_id, name AS articleName, taxID,\n additionaltext, s_articles_details.shippingfree, laststock, instock,\n s_articles_details.id as articledetailsID, ordernumber,\n s_articles.configurator_set_id\n FROM s_articles, s_articles_details\n WHERE s_articles_details.ordernumber = ?\n AND s_articles_details.articleID = s_articles.id\n AND s_articles.active = 1\n AND (\n SELECT articleID\n FROM s_articles_avoid_customergroups\n WHERE articleID = s_articles.id AND customergroupID = ?\n ) IS NULL\n "; $article = $this->db->fetchRow($sql, array($id, $this->sSYSTEM->sUSERGROUPDATA["id"])); $article = $this->eventManager->filter('Shopware_Modules_Basket_getArticleForAddArticle_FilterArticle', $article, array("id" => $id, 'subject' => $this, "partner" => $this->sSYSTEM->_SESSION["sPartner"])); if (!$article) { return false; } $article = $this->moduleManager->Articles()->sGetTranslation($article, $article['articleID'], "article"); $article = $this->moduleManager->Articles()->sGetTranslation($article, $article['articledetailsID'], "variant"); if ($article['configurator_set_id'] > 0) { $product = new StoreFrontBundle\Struct\ListProduct((int) $article['articleID'], (int) $article["articledetailsID"], $article['ordernumber']); $product->setAdditional($article['additionaltext']); $context = $this->contextService->getShopContext(); $product = $this->additionalTextService->buildAdditionalText($product, $context); $article['additionaltext'] = $product->getAdditional(); } return $article; }
/** * Helper function which assigns the shopware article * data to the product. (data of s_articles) * * @param Struct\ListProduct $product * @param $data */ private function assignProductData(Struct\ListProduct $product, $data) { $product->setName($data['__product_name']); $product->setShortDescription($data['__product_description']); $product->setLongDescription($data['__product_description_long']); $product->setCloseouts((bool) $data['__product_laststock']); $product->setMetaTitle($data['__product_metaTitle']); $product->setHasProperties($data['__product_filtergroupID'] > 0); $product->setHighlight((bool) $data['__product_topseller']); $product->setAllowsNotification((bool) $data['__product_notification']); $product->setKeywords($data['__product_keywords']); $product->setTemplate($data['__product_template']); $product->setHasConfigurator($data['__product_configurator_set_id'] > 0); $product->setHasEsd((bool) $data['__product_has_esd']); $product->setIsPriceGroupActive((bool) $data['__product_pricegroupActive']); $product->setSales((int) $data['__topSeller_sales']); $product->setShippingFree((bool) $data['__variant_shippingfree']); $product->setStock((int) $data['__variant_instock']); $product->setManufacturerNumber($data['__variant_suppliernumber']); $product->setMainVariantId((int) $data['__product_main_detail_id']); if ($data['__variant_shippingtime']) { $product->setShippingTime($data['__variant_shippingtime']); } elseif ($data['__product_shippingtime']) { $product->setShippingTime($data['__product_shippingtime']); } if ($data['__variant_releasedate']) { $product->setReleaseDate(new \DateTime($data['__variant_releasedate'])); } if ($data['__product_datum']) { $product->setCreatedAt(new \DateTime($data['__product_datum'])); } $product->setAdditional($data['__variant_additionaltext']); $product->setEan($data['__variant_ean']); $product->setHeight((double) $data['__variant_height']); $product->setLength((double) $data['__variant_length']); $product->setMinStock((int) $data['__variant_stockmin']); $product->setWeight((double) $data['__variant_weight']); $product->setWidth((double) $data['__variant_width']); $customerGroups = explode('|', $data['__product_blocked_customer_groups']); $customerGroups = array_filter($customerGroups); $product->setBlockedCustomerGroupIds($customerGroups); $product->setHasAvailableVariant($data['__product_has_available_variants'] > 0); $product->setFallbackPriceCount($data['__product_fallback_price_count']); if (array_key_exists('__product_custom_price_count', $data)) { $product->setCustomerPriceCount($data['__product_custom_price_count']); } else { $product->setCustomerPriceCount($data['__product_fallback_price_count']); } }
/** * @param array $result * @return ListProduct[] */ private function buildListProducts(array $result) { $products = []; foreach ($result as $item) { $number = $item['number']; $product = new ListProduct($item['articleId'], $item['articleDetailId'], $item['number']); if ($item['additionalText']) { $product->setAdditional($item['additionalText']); } $products[$number] = $product; } return $products; }
/** * For the provided article id, returns the associated variant numbers and additional texts * * @param $articleId * @param $mainDetailId * @return array */ private function getVariantDetailsForPremiumArticles($articleId, $mainDetailId) { $context = $this->contextService->getShopContext(); $sql = "SELECT id, ordernumber, additionaltext\n FROM s_articles_details\n WHERE articleID = :articleId AND kind != 3"; $variantsData = Shopware()->Db()->fetchAll($sql, array('articleId' => $articleId)); foreach ($variantsData as $variantData) { $product = new StoreFrontBundle\Struct\ListProduct($articleId, $variantData['id'], $variantData['ordernumber']); if ($variantData['id'] == $mainDetailId) { $variantData = Shopware()->Modules()->Articles()->sGetTranslation($variantData, $articleId, "article"); } else { $variantData = Shopware()->Modules()->Articles()->sGetTranslation($variantData, $variantData['id'], "variant"); } $product->setAdditional($variantData['additionaltext']); $products[$variantData['ordernumber']] = $product; } $products = $this->additionalTextService->buildAdditionalTextLists($products, $context); return array_map(function (StoreFrontBundle\Struct\ListProduct $elem) { return array('ordernumber' => $elem->getNumber(), 'additionaltext' => $elem->getAdditional()); }, $products); }