/** * Load product data and create instances of ProductRow to assign to bundle * * @param BundleProxy $bundle * * @return array */ public function getProductRows(BundleProxy $bundle) { $result = $this->_queryBuilderFactory->getQueryBuilder()->select($this->_columns)->from('p', self::PRODUCT_TABLE)->leftJoin('o', 'p.product_row_id = o.product_row_id', self::OPTION_TABLE)->where('p.bundle_id = ?i', [$bundle->getID()])->orderBy('p.product_row_id ASC')->getQuery()->run(); $productRowData = []; $productRows = []; // Reorganise data into mutlidimensional array split into product rows to allow for multiple options per row foreach ($result as $row) { if (!array_key_exists($row->id, $productRowData)) { $productRowData[$row->id] = ['product_id' => $row->product_id, 'options' => $this->_getRowOptionsArray($row->option_name, $row->option_value), 'quantity' => $row->quantity]; } $productRowData[$row->id]['options'] = $productRowData[$row->id]['options'] + $this->_getRowOptionsArray($row->option_name, $row->option_value); } foreach ($productRowData as $id => $data) { $productRow = new ProductRow($data['product_id'], $data['options'], $data['quantity']); $productRow->setID($id); $productRows[] = $productRow; } return $productRows; }
/** * Check if an item matches the criteria set by the product row * * @param Order\Entity\Item\Item $item * @param ProductRow $row * * @return bool */ public function itemIsApplicable(Order\Entity\Item\Item $item, ProductRow $row) { if (in_array($item->id, $this->_alreadyInBundle)) { return false; } if ((int) $item->getProduct()->id !== $row->getProductID()) { return false; } if (count($row->getOptions()) <= 0) { return true; } $unit = $item->getUnit(); foreach ($row->getOptions() as $name => $value) { if (!($unit->hasOption($name) && $unit->getOption($name) === $value)) { return false; } } return true; }
/** * Add a row of product information to the bundle, determining a requirement for the bundle to be deemed as valid * * @param ProductRow $row */ public function addProductRow(ProductRow $row) { $key = md5(serialize([$row->getProductID(), $row->getOptions()])); if (array_key_exists($key, $this->_productRows)) { $this->_productRows[$key]->increaseQuantity($row->getQuantity()); } else { $this->_productRows[$key] = $row; } }