Jump to content

модификация модуля Category Slider


Recommended Posts

Всем привет. 
Есть модуль Pos Category Slider, поставляемый вместе с темой. По дефолту в админке есть следующие органы управления: выпадающее меню, которое даёт выбрать категорию из которой выбираются товары и поле для загрузки картинки-баннера, которая отображается сбоку от слайдера и ведёт на ту же категорию, что и товары.

Нужно: добавить возможность для баннера задавать любую ссылку из поля ввода.

Что я уже сделал: добавил поле ввода и прописал функцию сохранения значения и возврат значения после обновления страницы при сохранении настроек.

и застрял на том, как получить значение в фронт-офисе.

вожусь с этим вопросом уже несколько дней, хотел бы попросить помощи у более подкованных людей.

заранее благодарен.

 

код модуля ниже

 

// хук для вывода

public function hookDisplayHome($params)
    {
        $arrayCategory = array();
        $id_category = Configuration::get($this->name . '_list_cate');

        //echo $id_category; die;

        $id_lang = (int)Context::getContext()->language->id;
        $id_shop = (int)Context::getContext()->shop->id;
        $categoryParent = new Category((int)$id_category, (int)$id_lang, (int)$id_shop);
        $category_name = $categoryParent->name;
        $category_link_rewrite = $categoryParent->link_rewrite;
        $category_id = $categoryParent->id_category;
        $arrayProductCate = array();
        $cateArray = Category::getChildren((int)$id_category, (int)$id_lang, true, (int)$id_shop);
        //print_r()
        $cate_image_link_1 = Configuration::get('cate_image_link_1');
        if ($cateArray) {
            $subcategories = array();
            foreach ($cateArray as $subcategory) {
                $category = new Category((int)$subcategory['id_category'], (int)$id_lang, (int)$id_shop);
                $subcategories[] = array('id' => $subcategory['id_category'], 'name' => $category->name);
            }
            //print_r($subcategories);die;
            $cate_image_name_1 = 'cate_image_1_' . $id_shop;
            $this->context->smarty->assign('category_name', $category_name);
            $this->smarty->assign(array(
                'category_link_rewrite' => $category_link_rewrite,
                'subcategories' => $subcategories
            ));
        }

        //echo '<pre>'; print_r($cateArray1);die;
        $arrayProductCate = array();
        $manufacturer = array();
        $category = new Category((int)$id_category, (int)$id_lang, (int)$id_shop);
        $categoryProducts = $category->getProducts($this->context->language->id, 0, 15, 'date_add', 'DESC');
        $arrayProductCate['products'] = array('id' => $id_category, 'name' => $category->name, 'product' => $categoryProducts);
        foreach ($categoryProducts as $product) {
            if (!in_array($product['id_manufacturer'], $manufacturer)) {
                $manufacturer[] = $product['id_manufacturer'];
            }
        }

        foreach ($arrayProductCate['products']['product'] as &$item) {
            $dbQuery = Db::getInstance();
            $result = $dbQuery->query('SELECT free_shipping FROM ' . _DB_PREFIX_ . 'product_lang WHERE id_product = ' . $item['id_product']);
            $item['free_shipping'] = $result->fetch(PDO::FETCH_ASSOC)['free_shipping'];
        }
        unset($item);
        //echo '<pre>'; print_r($manufacturer);die;
        $cate_image_name_1 = 'cate_image_1_' . $id_shop;
        $cate_image_link_1 = Configuration::get('cate_image_link_1');
        $this->context->smarty->assign('category_name', $category->name);
        //echo '<pre>'; print_r($arrayProductCate);die;
        $this->smarty->assign(array(
            'manufacturers' => $manufacturer,
            'category_id' => $category_id,
            'productCates' => $arrayProductCate,
            'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
            'cate_image_1' => _PS_BASE_URL_ . __PS_BASE_URI__ . 'modules/' . $this->name . '/img/' . $cate_image_name_1 . '.' . Configuration::get('CATE_IMG_EXT'),
            'cate_image_link_1' => $cate_image_link_1
        ));

        return $this->display(__FILE__, 'poscategorylist1.tpl');
    }
    
// получение контента
    
public function getContent()
    {
        $output = '<h2>' . $this->displayName . '</h2>';
        if (Tools::isSubmit('submitPosTabCate')) {
            if (!sizeof($this->_postErrors))
                $this->_postProcess();
            else {
                foreach ($this->_postErrors AS $err) {
                    $this->_html .= '<div class="alert error">' . $err . '</div>';
                }
            }
        }
        return $output . $this->_displayForm();
    }
    
    
 // постобработка 
 
 private function _postProcess()
    {

        Configuration::updateValue($this->name . '_list_cate', Tools::getValue('list_cate'));
        $cate_image_link_1 = Configuration::updateValue('cate_image_link_1');

        $id_shop = (int)Context::getContext()->shop->id;

        if (Tools::isSubmit('submitPosTabCate')) {


            if (isset($_FILES['p_image_1']) && isset($_FILES['p_image_1']['tmp_name']) && !empty($_FILES['p_image_1']['tmp_name'])) {

                Configuration::updateValue('CATE_IMG_EXT', substr($_FILES['p_image_1']['name'], strrpos($_FILES['p_image_1']['name'], '.') + 1));
                $cate_image_name = 'cate_image_1_' . $id_shop;

                if ($error = ImageManager::validateUpload($_FILES['p_image_1'], Tools::convertBytes(ini_get('upload_max_filesize'))))
                    $errors .= $error;
                else {

                    // Copy the image in the module directory with its new name
                    if (!move_uploaded_file($_FILES['p_image_1']['tmp_name'], _PS_MODULE_DIR_ . $this->name . '/img/' . $cate_image_name . '.' . Configuration::get('CATE_IMG_EXT')))
                        $errors .= $this->l('File upload error.');
                }
            }            
            $cate_image_link_1 = Tools::getValue('cate_image_link_1');


        }


        $this->_html .= '<div class="conf confirm">' . $this->l('Settings updated') . '</div>';
    }
    
    
// вывод формы настроек

private function _displayForm()
    {
        $spacer = str_repeat('&nbsp;', $this->spacer_size);
        $id_shop = (int)Context::getContext()->shop->id;
        $this->_html .= '
		<form action="' . $_SERVER['REQUEST_URI'] . '" method="post" enctype="multipart/form-data">
                  <fieldset>
                    <legend><img src="../img/admin/cog.gif" alt="" class="middle" />' . $this->l('Settings') . '</legend>';
                    // тут подгружается картинка
        $cate_image_name_1 = 'cate_image_1_' . $id_shop;
        $this->_html .= '
				     <label>' . $this->l('Image 1: ') . '</label>
                    <div class="margin-form">
							<img class="img-responsive" src="' . _PS_BASE_URL_ . __PS_BASE_URI__ . 'modules/' . $this->name . '/img/' . $cate_image_name_1 . '.' . Configuration::get('CATE_IMG_EXT') . '" />
							</br>
							<input id="p_image_1" type="file" name="p_image_1" class="hide">
                    </div>';
//тут по-идее указывается ссылка

        $this->_html .='<div class="margin-form">
							<input id="cate_image_link_1" type="text" name="cate_image_link_1" value="'.Tools::getValue('cate_image_link_1').'"/>
							</div>';
                            

        $this->_html .= '<label>' . $this->l('Show Link/Label Category: ') . '</label>';
        $this->_html .= '<div class="margin-form">';
        $this->_html .= '<select name ="list_cate">';
        // BEGIN Categories
        $id_lang = (int)Context::getContext()->language->id;
        $this->getCategoryOption(1, (int)$id_lang, (int)Shop::getContextShopID());
        $this->_html .= '</select>
					</div>';
        $this->_html .= '
                     
                    <input type="submit" name="submitPosTabCate" value="' . $this->l('Update') . '" class="button" />
                     </fieldset>
		</form>';
        return $this->_html;
    }

// выборка категорий
    private function getCategoryOption($id_category = 1, $id_lang = false, $id_shop = false, $recursive = true)
    {
        $cateCurrent = Configuration::get($this->name . '_list_cate');
        $id_lang = $id_lang ? (int)$id_lang : (int)Context::getContext()->language->id;
        $category = new Category((int)$id_category, (int)$id_lang, (int)$id_shop);

        if (is_null($category->id))
            return;

        if ($recursive) {

            $children = Category::getChildren((int)$id_category, (int)$id_lang, true, (int)$id_shop);
            $spacer = str_repeat('&nbsp;', $this->spacer_size * (int)$category->level_depth);
        }
        if ($category->level_depth > 3) return;
        $shop = (object)Shop::getShop((int)$category->getShopID());
        if ((int)$category->id == (int)$cateCurrent) {
            $this->_html .= '<option value="' . (int)$category->id . '" selected ="selected" >' . (isset($spacer) ? $spacer : '') . $category->name . ' (' . $shop->name . ')</option>';
        } else {
            $this->_html .= '<option value="' . (int)$category->id . '">' . (isset($spacer) ? $spacer : '') . $category->name . ' (' . $shop->name . ')</option>';
        }

        if (isset($children) && count($children))
            foreach ($children as $child)
                $this->getCategoryOption((int)$child['id_category'], (int)$id_lang, (int)$child['id_shop']);
    }

 

часть кода шаблона, куда всё выводится:

 

			<div class="col-xs-12 col-sm-4 col-md-3">
				{if isset($cate_image_1) && $cate_image_1 != null}
					<div class="image_block">
						<a href="{$cate_image_link_1}">
							<img src={$cate_image_1} alt="category image" class="img-responsive"/>
						</a>
					</div>
				{/if}
			</div>

 

Share this post


Link to post
Share on other sites

Этод метод отвечает за передачу переменных во фронт в смарти

$this->context->smarty->assign

передайте нужные Вам переменные в нем.

  • Like 1

Share this post


Link to post
Share on other sites

после изменений не забывайте чистить кеш смарти, а также не забудьте, что шаблон модуля может лежать в папке с темой. Поэтому Ваши изменения могут не работать.

  • Like 1

Share this post


Link to post
Share on other sites

спасибо за подсказку.

про шаблон модуля я момент учёл, и код представленный выше как раз из папки темы.

но вот у меня вопрос, а разве в этой части из приведенного выше переменная не назначается?

$this->smarty->assign(array(
            'manufacturers' => $manufacturer,
            'category_id' => $category_id,
            'productCates' => $arrayProductCate,
            'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
            'cate_image_1' => _PS_BASE_URL_ . __PS_BASE_URI__ . 'modules/' . $this->name . '/img/' . $cate_image_name_1 . '.' . Configuration::get('CATE_IMG_EXT'),
            'cate_image_link_1' => $cate_image_link_1
        ));

в последней строке?

если назначается, то получается, что где-то я переменную передаю не верно.

поиск по бд магазина производил, эта переменная пустая.

Share this post


Link to post
Share on other sites

спасибо ещё раз, всё получилось)

передавал так:

public function hookDisplayHome($params)
    {
        // исходный код из примера в начанлом сообщении

        $this->smarty->assign(array(
            'manufacturers' => $manufacturer,
            'category_id' => $category_id,
            'productCates' => $arrayProductCate,
            'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
            'cate_image_1' => _PS_BASE_URL_ . __PS_BASE_URI__ . 'modules/' . $this->name . '/img/' . $cate_image_name_1 . '.' . Configuration::get('CATE_IMG_EXT')
        ));

// передача инпута в фронт тут
        $cate_image_link_1 = Configuration::get('cate_image_link_1');
        $this->context->smarty->assign('cate_image_link_1', $cate_image_link_1);

        return $this->display(__FILE__, 'poscategorylist1.tpl');
    }

 

на случай, если кто искать будет.

  • Like 1

Share this post


Link to post
Share on other sites

  • 2 weeks later...

а вот при задвоении полей ввода и картинок ловится глюк - картинки по одной не заменяются, так же как и контент в полях ввода. хотя вроде всё было сделано корректно, все нужные данные изменены.
Кто может подсказать, в чём там может быть проблема?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More