/** * Search for currency items. * * @param MW_Common_Criteria_Interface $search Search object * @param integer &$total Number of items that are available in total * * @return array List of items implementing MShop_Locale_Item_Currency_Interface * * @throws MW_DB_Exception On failures with the db object * @throws MShop_Common_Exception On failures with the MW_Common_Criteria_ object * @throws MShop_Locale_Exception On failures with the currency item object */ public function searchItems(MW_Common_Criteria_Interface $search, array $ref = array(), &$total = null) { $context = $this->_getContext(); $config = $context->getConfig(); $dbm = $context->getDatabaseManager(); $dbname = $this->_getResourceName(); $conn = $dbm->acquire($dbname); $items = array(); try { $attributes = $this->getSearchAttributes(); $types = $this->_getSearchTypes($attributes); $translations = $this->_getSearchTranslations($attributes); $find = array(':cond', ':order', ':start', ':size'); $replace = array($search->getConditionString($types, $translations), $search->getSortationString($types, $translations), $search->getSliceStart(), $search->getSliceSize()); $path = 'mshop/locale/manager/currency/default/item/search'; $sql = $config->get($path, $path); $results = $this->_getSearchResults($conn, str_replace($find, $replace, $sql)); try { while (($row = $results->fetch()) !== false) { $items[$row['id']] = $this->_createItem($row); } } catch (Exception $e) { $results->finish(); throw $e; } if ($total !== null) { $path = 'mshop/locale/manager/currency/default/item/count'; $sql = $config->get($path, $path); $results = $this->_getSearchResults($conn, str_replace($find, $replace, $sql)); $row = $results->fetch(); $results->finish(); if ($row === false) { throw new MShop_Locale_Exception('No total results value found.'); } $total = $row['count']; } $dbm->release($conn, $dbname); } catch (Exception $e) { $dbm->release($conn, $dbname); throw $e; } return $items; }
/** * Searches for language items matching the given criteria. * * @param MW_Common_Criteria_Interface $search Search object * @param array $ref List of domains to fetch list items and referenced items for * @param integer &$total Number of items that are available in total * @return array List of items implementing MShop_Locale_Language_Item_Interface */ public function searchItems(MW_Common_Criteria_Interface $search, array $ref = array(), &$total = null) { $items = array(); $context = $this->_getContext(); $config = $context->getConfig(); $dbm = $context->getDatabaseManager(); $dbname = $this->_getResourceName(); $conn = $dbm->acquire($dbname); try { $attributes = $this->getSearchAttributes(); $types = $this->_getSearchTypes($attributes); $translations = $this->_getSearchTranslations($attributes); $find = array(':cond', ':order', ':start', ':size'); $replace = array($search->getConditionString($types, $translations), $search->getSortationString($types, $translations), $search->getSliceStart(), $search->getSliceSize()); /** mshop/locale/manager/language/default/item/search * Retrieves the records matched by the given criteria in the database * * Fetches the records matched by the given criteria from the attribute * database. The records must be from one of the sites that are * configured via the context item. If the current site is part of * a tree of sites, the SELECT statement can retrieve all records * from the current site and the complete sub-tree of sites. * * As the records can normally be limited by criteria from sub-managers, * their tables must be joined in the SQL context. This is done by * using the "internaldeps" property from the definition of the ID * column of the sub-managers. These internal dependencies specify * the JOIN between the tables and the used columns for joining. The * ":joins" placeholder is then replaced by the JOIN strings from * the sub-managers. * * To limit the records matched, conditions can be added to the given * criteria object. It can contain comparisons like column names that * must match specific values which can be combined by AND, OR or NOT * operators. The resulting string of SQL conditions replaces the * ":cond" placeholder before the statement is sent to the database * server. * * If the records that are retrieved should be ordered by one or more * columns, the generated string of column / sort direction pairs * replaces the ":order" placeholder. In case no ordering is required, * the complete ORDER BY part including the "\/*-orderby*\/...\/*orderby-*\/" * markers is removed to speed up retrieving the records. Columns of * sub-managers can also be used for ordering the result set but then * no index can be used. * * The number of returned records can be limited and can start at any * number between the begining and the end of the result set. For that * the ":size" and ":start" placeholders are replaced by the * corresponding values from the criteria object. The default values * are 0 for the start and 100 for the size value. * * The SQL statement should conform to the ANSI standard to be * compatible with most relational database systems. This also * includes using double quotes for table and column names. * * @param string SQL statement for searching items * @since 2014.03 * @category Developer * @see mshop/locale/manager/language/default/item/insert * @see mshop/locale/manager/language/default/item/update * @see mshop/locale/manager/language/default/item/delete * @see mshop/locale/manager/language/default/item/count */ $path = 'mshop/locale/manager/language/default/item/search'; $sql = $config->get($path, $path); $results = $this->_getSearchResults($conn, str_replace($find, $replace, $sql)); try { while (($row = $results->fetch()) !== false) { $items[$row['id']] = $this->_createItem($row); } } catch (Exception $e) { $results->finish(); throw $e; } if ($total !== null) { /** mshop/locale/manager/language/default/item/count * Counts the number of records matched by the given criteria in the database * * Counts all records matched by the given criteria from the attribute * database. The records must be from one of the sites that are * configured via the context item. If the current site is part of * a tree of sites, the statement can count all records from the * current site and the complete sub-tree of sites. * * As the records can normally be limited by criteria from sub-managers, * their tables must be joined in the SQL context. This is done by * using the "internaldeps" property from the definition of the ID * column of the sub-managers. These internal dependencies specify * the JOIN between the tables and the used columns for joining. The * ":joins" placeholder is then replaced by the JOIN strings from * the sub-managers. * * To limit the records matched, conditions can be added to the given * criteria object. It can contain comparisons like column names that * must match specific values which can be combined by AND, OR or NOT * operators. The resulting string of SQL conditions replaces the * ":cond" placeholder before the statement is sent to the database * server. * * Both, the strings for ":joins" and for ":cond" are the same as for * the "search" SQL statement. * * Contrary to the "search" statement, it doesn't return any records * but instead the number of records that have been found. As counting * thousands of records can be a long running task, the maximum number * of counted records is limited for performance reasons. * * The SQL statement should conform to the ANSI standard to be * compatible with most relational database systems. This also * includes using double quotes for table and column names. * * @param string SQL statement for counting items * @since 2014.03 * @category Developer * @see mshop/locale/manager/language/default/item/insert * @see mshop/locale/manager/language/default/item/update * @see mshop/locale/manager/language/default/item/delete * @see mshop/locale/manager/language/default/item/search */ $path = 'mshop/locale/manager/language/default/item/count'; $sql = $config->get($path, $path); $results = $this->_getSearchResults($conn, str_replace($find, $replace, $sql)); $row = $results->fetch(); $results->finish(); if ($row === false) { throw new MShop_Locale_Exception('No total results value found'); } $total = $row['count']; } $dbm->release($conn, $dbname); } catch (Exception $e) { $dbm->release($conn, $dbname); throw $e; } return $items; }
/** * Searches for site items matching the given criteria. * * @param MW_Common_Criteria_Interface $search Search object * @param integer &$total Number of items that are available in total * @return array List of site items implementing MShop_Locale_Item_Site_Interface * * @throws MW_DB_Exception On failures with the db object * @throws MShop_Common_Exception On failures with the MW_Common_Criteria_ object * @throws MShop_Locale_Exception On failures with the site item object */ public function searchItems(MW_Common_Criteria_Interface $search, array $ref = array(), &$total = null) { $items = array(); $context = $this->_getContext(); $dbm = $context->getDatabaseManager(); $dbname = $this->_getResourceName(); $conn = $dbm->acquire($dbname); try { $attributes = $this->getSearchAttributes(); $types = $this->_getSearchTypes($attributes); $translations = $this->_getSearchTranslations($attributes); $find = array(':cond', ':order', ':start', ':size'); $replace = array($search->getConditionString($types, $translations), $search->getSortationString($types, $translations), $search->getSliceStart(), $search->getSliceSize()); $path = 'mshop/locale/manager/site/default/item/search'; $sql = $context->getConfig()->get($path, $path); $results = $this->_getSearchResults($conn, str_replace($find, $replace, $sql)); try { while (($row = $results->fetch()) !== false) { $config = $row['config']; if (($row['config'] = json_decode($row['config'], true)) === null) { $msg = sprintf('Invalid JSON as result of search for ID "%2$s" in "%1$s": %3$s', 'mshop_locale.config', $row['id'], $config); $this->_getContext()->getLogger()->log($msg, MW_Logger_Abstract::WARN); } $items[$row['id']] = $this->_createItem($row); } } catch (Exception $e) { $results->finish(); throw $e; } if ($total !== null) { $path = 'mshop/locale/manager/site/default/item/count'; $sql = $this->_getContext()->getConfig()->get($path, $path); $results = $this->_getSearchResults($conn, str_replace($find, $replace, $sql)); $row = $results->fetch(); $results->finish(); if ($row === false) { throw new MShop_Locale_Exception('No total results value found'); } $total = $row['count']; } $dbm->release($conn, $dbname); } catch (Exception $e) { $dbm->release($conn, $dbname); throw $e; } return $items; }