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 
<?php

/* --------------------------------------------------------------
   CategorySettingsRepositoryWriter.php 2016-06-23
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2016 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]
   --------------------------------------------------------------
*/

/**
 * Class CategorySettingsRepositoryWriter
 *
 * This class provides methods for updating particular columns of specific category records in the database.
 * The category settings are stored in the categories table and are more related to display and visibility modes of
 * category related data.
 *
 * @category   System
 * @package    Category
 * @subpackage Repositories
 */
class CategorySettingsRepositoryWriter implements CategorySettingsRepositoryWriterInterface
{
    /**
     * Database Connection
     * 
     * @var CI_DB_query_builder
     */
    protected $db;
    
    /**
     * Table name
     * 
     * @var string
     */
    protected $table = 'categories';
    
    
    /**
     * Customer Status Provider
     * 
     * @var CustomerStatusProviderInterface
     */
    protected $customerStatusProvider;
    
    
    /**
     * Initialize the category settings repository writer.
     *
     * @param CI_DB_query_builder $dbQueryBuilder Database connector.
     * @param CustomerStatusProviderInterface $customerStatusProvider Customer Status Provider
     */
    public function __construct(CI_DB_query_builder $dbQueryBuilder,
                                CustomerStatusProviderInterface $customerStatusProvider)
    {
        $this->db                     = $dbQueryBuilder;
        $this->customerStatusProvider = $customerStatusProvider;
    }
    
    
    /**
     * Updates a specific category settings entity.
     *
     * @param IdType                    $categoryId Category ID.
     * @param CategorySettingsInterface $settings   Category settings.
     *
     * @return CategorySettingsRepositoryWriter Same instance for chained method calls.
     *                                          
     * @throws UnexpectedValueException
     * @throws InvalidArgumentException
     */
    public function update(IdType $categoryId, CategorySettingsInterface $settings)
    {
        $setArray = array(
            'categories_template'        => $settings->getCategoryListingTemplate(),
            'listing_template'           => $settings->getProductListingTemplate(),
            'products_sorting'           => $settings->getProductSortColumn(),
            'products_sorting2'          => $settings->getProductSortDirection(),
            'gm_sitemap_entry'           => $settings->isSitemapEntry(),
            'gm_priority'                => $settings->getSitemapPriority(),
            'gm_changefreq'              => $settings->getSitemapChangeFreq(),
            'gm_show_attributes'         => $settings->showAttributes(),
            'gm_show_graduated_prices'   => $settings->showGraduatedPrices(),
            'gm_show_qty'                => $settings->showQuantityInput(),
            'gm_show_qty_info'           => $settings->showStock(),
            'show_sub_categories'        => $settings->showSubcategories(),
            'show_sub_categories_images' => $settings->showSubcategoryImages(),
            'show_sub_categories_names'  => $settings->showSubcategoryNames(),
            'show_sub_products'          => $settings->showSubcategoryProducts(),
            'view_mode_tiled'            => $settings->isDefaultViewModeTiled(),
            'show_category_filter'       => $settings->showCategoryFilter(),
            'feature_mode'               => $settings->getFilterSelectionMode(),
            'feature_display_mode'       => $settings->getFilterValueDeactivation()
        );
        
        $customerStatusIds = $this->customerStatusProvider->getCustomerStatusIds();
        
        foreach($customerStatusIds as $customerStatusId)
        {
            $setArray['group_permission_'
                      . $customerStatusId] = (int)$settings->isPermittedCustomerStatus(new IdType($customerStatusId));
        }
        
        $whereArray = array(
            'categories_id' => $categoryId->asInt()
        );
        $this->db->update($this->table, $setArray, $whereArray);
        
        return $this;
    }
}