public function testCategoryFilters()
 {
     foreach ($this->getCategories() as $expected) {
         $result = $this->module->getCategoryFilters($expected['categoryId'], $expected['activeFilters']);
         $this->checkCategoryFilterResult($expected['result'], $result);
     }
 }
 public function testGetArticles()
 {
     $categories = [5, 6, 8, 12, 13, 14, 15, 31];
     foreach ($categories as $id => $expected) {
         $data = $this->module->sGetArticlesByCategory($id);
         foreach ($data['sArticles'] as $key => $article) {
             $this->assertEquals($key, $article['ordernumber']);
         }
     }
 }
 /**
  * Show also bought articles
  */
 public function boughtAction()
 {
     $articleId = (int) $this->Request()->getParam('articleId');
     $maxPages = (int) $this->config->get('alsoBoughtMaxPages', 10);
     $perPage = (int) $this->config->get('alsoBoughtPerPage', 4);
     $this->marketingModule->sBlacklist[] = $articleId;
     $articles = $this->marketingModule->sGetAlsoBoughtArticles($articleId, $maxPages * $perPage);
     foreach ($articles as $article) {
         $article = $this->articleModule->sGetPromotionById('fix', 0, (int) $article['id']);
         if (!empty($article['articleName'])) {
             $result[] = $article;
         }
     }
     $this->View()->maxPages = $maxPages;
     $this->View()->perPage = $perPage;
     $this->View()->boughtArticles = $result;
 }
Example #4
0
 /**
  * Test case for the frontend top seller selection
  */
 public function testTopSellerSelection()
 {
     $this->removeDemoData();
     $this->insertDemoData();
     $category = $this->getDemoCategory();
     $topSeller = $this->module->sGetArticleCharts($category['id']);
     $this->assertCount(2, $topSeller);
     //the article "2" pseudo sales are set to 1000 so we expect that this will be the first article
     //in the top seller slider.
     $this->assertEquals(2, $topSeller[0]['articleID']);
     $this->assertEquals(3, $topSeller[1]['articleID']);
     $this->removeDemoData();
 }
 /**
  * Get all articles and a table of their properties as an array
  * @return array Associative array with all articles or empty array
  */
 public function sGetComparisonList()
 {
     if (!$this->session->offsetGet('sessionId')) {
         return [];
     }
     $articles = [];
     // Get all comparisons for this user
     $checkForArticle = $this->db->fetchAll("SELECT * FROM s_order_comparisons WHERE sessionID=?", [$this->session->offsetGet('sessionId')]);
     if (!count($checkForArticle)) {
         return [];
     }
     foreach ($checkForArticle as $article) {
         if ($article["articleID"]) {
             $articles[] = $this->articleModule->sGetPromotionById("fix", 0, (int) $article["articleID"]);
         }
     }
     $properties = $this->sGetComparisonProperties($articles);
     $articles = $this->sFillUpComparisonArticles($properties, $articles);
     return ["articles" => $articles, "properties" => $properties];
 }
Example #6
0
 /**
  * Cleaning up testData
  */
 protected function tearDown()
 {
     parent::tearDown();
     $this->module->sDeleteComparisons();
 }
 /**
  * @param      $id
  * @param      $articleData
  * @param bool $recursiveCall
  * @return array
  */
 public function getArticleConfigurator($id, $articleData, $recursiveCall = false)
 {
     $id = intval($id);
     //get posted groups and options
     $selectedItems = $this->sSYSTEM->_POST["group"];
     if (empty($selectedItems)) {
         $selectedItems = array();
     }
     /**@var $repository \Shopware\Models\Article\Repository*/
     $repository = Shopware()->Models()->Article();
     /**@var $article \Shopware\Models\Article\Article*/
     $article = $this->getSingleArticle($id);
     //the data property contains now the configurator set. Set configurator set has the array keys "options" and "groups"
     //where the assigned configurator options and groups are.
     $data = $repository->getArticleConfiguratorSetByArticleIdIndexedByIdsQuery($id)->getArrayResult();
     $data = $data[0]['configuratorSet'];
     $customerGroupKey = $this->sSYSTEM->sUSERGROUP;
     if (empty($customerGroupKey)) {
         $customerGroupKey = 'EK';
     }
     if (empty($data)) {
         return $articleData;
     }
     //first we convert the configurator set settings from the new structure to the old structure.
     $settings = $this->getConfiguratorSettings($data, $article);
     $optionsIds = array();
     $mainDetailOptions = $this->getConfiguratorOptionsForVariantId($article['mainDetailId']);
     //now we iterate all activated options and assign them to the corresponding group.
     foreach ($data['options'] as $option) {
         //the convert functions changes the property names, so we save the ids in internal helper properties.
         $groupId = $option['groupId'];
         $optionId = $option['id'];
         //the groups in the data property indexed by their ids, so we can use "array_key_exists" to check if the group id of the current options exists in our group array.
         if (array_key_exists($groupId, $data['groups'])) {
             //if the group exist, we save the option id into in helper array. This helper array is only used for "configurator - tables".
             $optionsIds[] = $optionId;
             $selected = 0;
             if (empty($selectedItems)) {
                 /**@var $mainDetailOption \Shopware\Models\Article\Configurator\Option*/
                 foreach ($mainDetailOptions as $mainDetailOption) {
                     if ($mainDetailOption['id'] === $optionId) {
                         $selected = 1;
                     }
                 }
             } else {
                 $selected = (int) (array_key_exists($groupId, $selectedItems) && $selectedItems[$groupId] == $optionId);
             }
             //now we convert the configurator option data from the old property structure to new one.
             $option = $this->getConvertedOptionData($option);
             $option = $this->module->sGetTranslation($option, $option['optionID'], 'configuratoroption');
             $option['user_selected'] = $selected;
             $option['selected'] = $selected;
             //now we assign the option into the options array element to corresponding group.
             $data['groups'][$groupId]['options'][$optionId] = $option;
         }
     }
     //now we iterate all groups to convert them from the old property structure to new one.
     $sConfigurator = array();
     foreach ($data['groups'] as $group) {
         $data = $this->getConvertGroupData($group);
         $isSelected = (int) array_key_exists($group['id'], $selectedItems) && !empty($selectedItems[$group['id']]);
         //if the current group id exists in the post data, the group was selected already.
         $data['user_selected'] = $isSelected;
         $data['selected'] = $isSelected;
         $data = $this->module->sGetTranslation($data, $group['id'], 'configuratorgroup');
         $sConfigurator[] = $data;
     }
     /**
      * If the configurator set is configured as a table configurator, we have to create the "table structure array"
      * this array looks like this:
      * ['SIZE XXL']
      *     ['COLOR YELLOW']
      *     ['COLOR GREEN']
      *     ['COLOR RED']
      * ['SIZE L']
      *     ['COLOR YELLOW']
      *     ['COLOR GREEN']
      *     ['COLOR RED']
      * ...
      */
     $sConfiguratorValues = array();
     if ($settings['type'] == self::TYPE_TABLE) {
         $sConfiguratorValues = $this->getTableConfiguratorData($id, $optionsIds, $articleData, $article, $customerGroupKey);
     }
     //now we check if the sQuantity property is set in the post.
     $quantity = 1;
     if (!empty($this->sSYSTEM->_POST["sQuantity"]) && is_numeric($this->sSYSTEM->_POST["sQuantity"])) {
         $quantity = (int) $this->sSYSTEM->_POST["sQuantity"];
     }
     $articleData["quantity"] = $quantity;
     //if the posted quantity is lesser then the min purchase we have to set the min purchase as quantity
     if (empty($articleData["quantity"]) || $articleData["quantity"] < $articleData["minpurchase"]) {
         $articleData["quantity"] = $articleData["minpurchase"];
     }
     $selected = null;
     //if some items was selected from the user, we have to select the first available variant
     if (!empty($selectedItems)) {
         $builder = $this->getSelectionQueryBuilder($selectedItems);
         $builder->setParameter('articleId', $id);
         $builder->setParameter('customerGroup', $customerGroupKey);
         $selected = $builder->getQuery()->getArrayResult();
         if (empty($selected)) {
             $builder = $this->getSelectionQueryBuilder($selectedItems);
             $builder->setParameter('articleId', $id);
             $builder->setParameter('customerGroup', 'EK');
             $selected = $builder->getQuery()->getArrayResult();
         }
         //we can only set one variant as select, so we select the first one
         $detailData = $selected[0];
         if (!empty($detailData)) {
             if ($article['lastStock'] && $detailData['inStock'] < 1) {
                 $detailData['active'] = 0;
             }
             if (empty($detailData['prices'])) {
                 $detailData['prices'] = $this->getDefaultPrices($detailData['id']);
             }
             $detailData['prices'] = $this->getConvertedPrices($detailData['prices'], $articleData["tax"], $articleData["taxID"]);
             $selected = $this->getConvertedDetail($detailData);
             $attributeIndex = 1;
             //at least we creates the old "attr1-X" attributes with the option id as value.
             foreach ($detailData['configuratorOptions'] as $option) {
                 $attribute = 'attr' . $attributeIndex;
                 $selected[$attribute] = $option['id'];
                 $attributeIndex++;
             }
         }
     }
     if (!empty($selectedItems) && empty($selected)) {
         if ($settings['type'] == self::TYPE_STANDARD) {
             unset($this->sSYSTEM->_POST["group"]);
             return $this->getArticleConfigurator($id, $articleData, true);
         } elseif ($settings['type'] == self::TYPE_SELECTION) {
             $group = $this->sSYSTEM->_POST["group"];
             array_pop($group);
             $this->sSYSTEM->_POST["group"] = $group;
             return $this->getArticleConfigurator($id, $articleData, true);
         }
     }
     if (empty($selected)) {
         // Limiting the results with setMaxResults(1) will result in only one price being selected SW-4465
         $query = $repository->getConfiguratorTablePreSelectionItemQuery($id, $customerGroupKey, $article['lastStock'] === 1);
         $query->setFirstResult(0)->setMaxResults(1);
         $detail = $this->getOneOrNullResult($query);
         if ($article['lastStock'] && $detail['inStock'] < 1) {
             $detail['active'] = 0;
         }
         $preSelectedOptions = $detail['configuratorOptions'];
         foreach ($sConfigurator as &$group) {
             $preSelectedOption = $preSelectedOptions[$group['groupID']];
             $id = $preSelectedOption['id'];
             if (array_key_exists($id, $group['values'])) {
                 $group['values'][$preSelectedOption['id']]['user_selected'] = 1;
                 $group['values'][$preSelectedOption['id']]['selected'] = 1;
             }
         }
         if (!empty($detail)) {
             if (empty($detail['prices'])) {
                 $detail['prices'] = $this->getDefaultPrices($detail['id']);
             }
             $detail['prices'] = $this->getConvertedPrices($detail['prices'], $articleData["tax"], $articleData["taxID"]);
             $selected = $this->getConvertedDetail($detail);
         }
     }
     //if one variant are selected we have to calculate the prices and get the price
     if (!empty($selected)) {
         $selectedPrice = $selected['price'][0];
         foreach ($selected['price'] as $price) {
             if (!is_numeric($price['to'])) {
                 $selectedPrice = $price;
                 break;
             } elseif ($quantity < $price['to']) {
                 $selectedPrice = $price;
                 break;
             }
         }
         if (!empty($articleData['pricegroupActive'])) {
             $articleData['sBlockPrices'] = $this->module->sGetPricegroupDiscount($this->sSYSTEM->sUSERGROUP, $articleData["pricegroupID"], $selected['price'][0]['priceNet'], 1, true, $articleData);
         } elseif (count($selected['price']) > 1) {
             $articleData['sBlockPrices'] = $selected['price'];
         } else {
             $articleData['sBlockPrices'] = array();
         }
         if ($selected['kind'] > 1) {
             $articleData = $this->mergeSelectedAndArticleData($articleData, $selected, $selectedPrice);
             $articleData = $this->module->sGetTranslation($articleData, $selected['valueID'], 'variant');
         } else {
             $articleData["active"] = $selected["active"];
         }
         $articleData["sConfiguratorSelection"] = $selected;
     }
     $articleData['sConfiguratorValues'] = $sConfiguratorValues;
     $articleData['sConfigurator'] = $sConfigurator;
     $articleData['sConfiguratorSettings'] = $settings;
     if ($recursiveCall) {
         $articleData['sError']['variantNotAvailable'] = true;
     }
     return $articleData;
 }