1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
<?php
/* --------------------------------------------------------------
CategoryListProvider.inc.php 2015-11-25
Gambio GmbH
http://www.gambio.de
Copyright (c) 2015 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
--------------------------------------------------------------
*/
/**
* Class CategoryListProvider
*
* This class provides methods for creating a list of flattened categories with just its essential data.
* The list of categories is filtered by its parent category ID and customer status permissions and for simplicity
* it contains language specific data only in one language.
*
* @category System
* @package Category
* @subpackage Providers
*/
class CategoryListProvider implements CategoryListProviderInterface
{
/**
* Language code.
*
* @var LanguageCode
*/
protected $languageCode;
/**
* Array of conditions.
*
* @var array
*/
protected $conditions;
/**
* Database query builder.
*
* @var CI_DB_query_builder
*/
protected $db;
/**
* Category Repository.
*
* @var CategoryRepositoryInterface
*/
protected $categoryRepo;
/**
* CategoryListProvider constructor.
*
* @param LanguageCode $languageCode Two letter language code.
* @param array $conditions Additional data request conditions.
* @param CI_DB_query_builder $db Database connector.
* @param CategoryRepositoryInterface $categoryRepo Category repository.
*/
public function __construct(LanguageCode $languageCode,
array $conditions = array(),
CategoryRepositoryInterface $categoryRepo,
CI_DB_query_builder $db)
{
$this->languageCode = $languageCode;
$this->conditions = $conditions;
$this->db = $db;
$this->categoryRepo = $categoryRepo;
}
/**
* Returns a category list based the parent ID provided.
*
* @param IdType $parentId Category parent ID.
*
* @return CategoryListItemCollection
*/
public function getByParentId(IdType $parentId)
{
// Build select part of query.
$this->_select();
// Add where condition: Select by ID.
$this->db->where('categories.parent_id', $parentId->asInt());
// Get query result and pass to the method which processes the result.
$result = $this->db->get()->result_array();
return $this->_prepareCollection($result);
}
/**
* Build the select part of the query build.
*
* @return CategoryListProvider Same instance for chained method calls.
*/
protected function _select()
{
// Build query.
$this->db->select('categories.*, categories_description.*')
->from('categories, categories_description')
->join('languages', 'languages.languages_id = categories_description.language_id', 'inner')
->where('categories_description.categories_id = categories.categories_id')
->where('languages.code', (string)$this->languageCode);
// Check for additional conditions to be appended to query.
if(count($this->conditions) > 0)
{
$this->db->where($this->conditions);
}
return $this;
}
/**
* Prepares the CategoryListItemCollection object.
*
* @param array $result Query result.
*
* @return CategoryListItemCollection
*/
protected function _prepareCollection(array $result)
{
$listItems = array();
// Iterate over each query result row and
// create a CategoryListItem for each row which
// will be pushed into $listItems array.
foreach($result as $row)
{
$categoryRepo = $this->categoryRepo;
$categoryListProvider = $this;
$categoryId = new IdType((int)$row['categories_id']);
$parentId = new IdType((int)$row['parent_id']);
$isActive = new BoolType((bool)$row['categories_status']);
$name = new StringType((string)$row['categories_name']);
$headingTitle = new StringType((string)$row['categories_heading_title']);
$description = new StringType((string)$row['categories_description']);
$urlKeywords = new StringType((string)$row['categories_meta_keywords']);
$image = new StringType((string)$row['categories_image']);
$imageAltTest = new StringType((string)$row['gm_alt_text']);
$icon = new StringType((string)$row['categories_icon']);
$categoryListItem = MainFactory::create('CategoryListItem', $categoryRepo, $categoryListProvider,
$categoryId, $parentId, $isActive, $name, $headingTitle,
$description, $urlKeywords, $image, $imageAltTest, $icon);
$listItems[] = $categoryListItem;
}
$collection = MainFactory::create('CategoryListItemCollection', $listItems);
return $collection;
}
}