/** * Returns PayPal's cart items in Nette\ArrayHash or false if there are no items. * * @param $data Data from PayPal response * @return Nette\ArrayHash or boolean */ public function getCartItems() { $patternKeys = ''; $iterator = new CachingIterator($this->CART_ITEM_KEYS); for ($iterator->rewind(); $iterator->valid(); $iterator->next()) { if ($iterator->isFirst()) { $patternKeys .= '('; } $patternKeys .= $iterator->current(); if ($iterator->hasNext()) { $patternKeys .= '|'; } if ($iterator->isLast()) { $patternKeys .= ')'; } } $pattern = '/^' . $patternKeys . '[0-9]+$/'; $itemsData = Utils::array_keys_by_ereg($this->responseData, $pattern); $items = array(); $itemsCount = count($items); if (!empty($itemsData)) { $itemsCount = count($itemsData) / count($this->CART_ITEM_KEYS); } // We must control if the result of division is integer. // Because if not, it means the count of keys in PayPal cart item changed. assert(is_int($itemsCount)); for ($i = 0; $i < $itemsCount; ++$i) { $keys = array(); foreach ($this->CART_ITEM_KEYS as $key) { $keys[] = $key . $i; } if (Utils::array_keys_exist($itemsData, $keys)) { $items[] = array('name' => $itemsData['l_name' . $i], 'quantity' => $itemsData['l_qty' . $i], 'taxAmount' => $itemsData['l_taxamt' . $i], 'amount' => $itemsData['l_amt' . $i], 'description' => $itemsData['l_desc' . $i], 'weightValue' => $itemsData['l_itemweightvalue' . $i], 'lengthValue' => $itemsData['l_itemlengthvalue' . $i], 'widthValue' => $itemsData['l_itemwidthvalue' . $i], 'heightValue' => $itemsData['l_itemheightvalue' . $i]); } } return ArrayHash::from($items); }