Автор Тема: Override для blocklayered.php модуля blocklayered PrestaShop 1.6.1.22  (Прочитано 705 раз)

08 Ноябрь 2018, 12:24:41
  • Новичок
  • *
  • Сообщений: 5
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Из коробки формирование заголовка H1 в категории происходит следующим образом:
- если не выбраны фильтры - то в Н1 выводится наименование категории. Например такое Термофутболки
- если выбран хотя бы один фильтр - в Н1 вместо наименования категории зачем то подставляется meta-title страницы и через разделитель перечисляются выбранные фильтры и их значения. Например вот так: Термофутболки и термокофточки для новорожденных. Купить свитерки для детей в магазине «Маргаритки». > Manufacturer Cosilana > цвет Розовый
Тестовая страница вот эта.

В файле blocklayered.php модуля blocklayered (или Блок многоуровневой навигации v2.2.1) для исправления этой ситуации "по живому" сделаны всего две правки.
Я заранее прошу прошения, но я не кодер.
В коде под катом это следующие строки:
$good_title = $category->name.$title;
и
'heading' => $good_title,

Друзья, прошу помощи в написании корректного override
Вот на всякий случай инструкция по ссылке



public function ajaxCall()
{
global $smarty, $cookie;

$selected_filters = $this->getSelectedFilters();
$filter_block = $this->getFilterBlock($selected_filters);
$this->getProducts($selected_filters, $products, $nb_products, $p, $n, $pages_nb, $start, $stop, $range);

// Add pagination variable
$nArray = (int)Configuration::get('PS_PRODUCTS_PER_PAGE') != 10 ? array((int)Configuration::get('PS_PRODUCTS_PER_PAGE'), 10, 20, 50) : array(10, 20, 50);
// Clean duplicate values
$nArray = array_unique($nArray);
asort($nArray);

Hook::exec(
'actionProductListModifier',
array(
'nb_products' => &$nb_products,
'cat_products' => &$products,
)
);

if (version_compare(_PS_VERSION_, '1.6.0', '>=') === true)
$this->context->controller->addColorsToProductList($products);

$category = new Category(Tools::getValue('id_category_layered', Configuration::get('PS_HOME_CATEGORY')), (int)$cookie->id_lang);

// Generate meta title and meta description
$category_title = (empty($category->meta_title) ? $category->name : $category->meta_title);
$category_metas = Meta::getMetaTags((int)$cookie->id_lang, 'category');
$title = '';
$keywords = '';

if (is_array($filter_block['title_values']))
foreach ($filter_block['title_values'] as $key => $val)
{
$title .= ' > '.$key.': '.implode('/', $val);
$keywords .= $key.' '.implode('/', $val).', ';
}

$good_title = $category->name.$title;
$title = $category_title.$title;


if (!empty($title))
$meta_title = $title;
else
$meta_title = $category_metas['meta_title'];

$meta_description = $category_metas['meta_description'];

$keywords = Tools::substr(Tools::strtolower($keywords), 0, 1000);
if (!empty($keywords))
$meta_keywords = rtrim($category_title.', '.$keywords.', '.$category_metas['meta_keywords'], ', ');

$smarty->assign(
array(
'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
'nb_products' => $nb_products,
'category' => $category,
'pages_nb' => (int)$pages_nb,
'p' => (int)$p,
'n' => (int)$n,
'range' => (int)$range,
'start' => (int)$start,
'stop' => (int)$stop,
'n_array' => ((int)Configuration::get('PS_PRODUCTS_PER_PAGE') != 10) ? array((int)Configuration::get('PS_PRODUCTS_PER_PAGE'), 10, 20, 50) : array(10, 20, 50),
'comparator_max_item' => (int)(Configuration::get('PS_COMPARATOR_MAX_ITEM')),
'products' => $products,
'products_per_page' => (int)Configuration::get('PS_PRODUCTS_PER_PAGE'),
'static_token' => Tools::getToken(false),
'page_name' => 'category',
'nArray' => $nArray,
'compareProducts' => CompareProduct::getCompareProducts((int)$this->context->cookie->id_compare)
)
);

// Prevent bug with old template where category.tpl contain the title of the category and category-count.tpl do not exists
if (file_exists(_PS_THEME_DIR_.'category-count.tpl'))
$category_count = $smarty->fetch(_PS_THEME_DIR_.'category-count.tpl');
else
$category_count = '';

if ($nb_products == 0)
$product_list = $this->display(__FILE__, 'blocklayered-no-products.tpl');
else
$product_list = $smarty->fetch(_PS_THEME_DIR_.'product-list.tpl');

$vars = array(
'filtersBlock' => utf8_encode($this->generateFiltersBlock($selected_filters)),
'productList' => utf8_encode($product_list),
'pagination' => $smarty->fetch(_PS_THEME_DIR_.'pagination.tpl'),
'categoryCount' => $category_count,
'meta_title' => $meta_title.' - '.Configuration::get('PS_SHOP_NAME'),
'heading' => $good_title,
'meta_keywords' => isset($meta_keywords) ? $meta_keywords : null,
'meta_description' => $meta_description,
'current_friendly_url' => ((int)$n == (int)$nb_products) ? '#/show-all': '#'.$filter_block['current_friendly_url'],
'filters' => $filter_block['filters'],
'nbRenderedProducts' => (int)$nb_products,
'nbAskedProducts' => (int)$n
);

if (version_compare(_PS_VERSION_, '1.6.0', '>=') === true)
$vars = array_merge($vars, array('pagination_bottom' => $smarty->assign('paginationId', 'bottom')
->fetch(_PS_THEME_DIR_.'pagination.tpl')));
/* We are sending an array in jSon to the .js controller, it will update both the filters and the products zones */
return Tools::jsonEncode($vars);
}



Также добавляю к посту архив с двумя файлами: без изменений и с правками "по живом".
18 Ноябрь 2018, 14:11:18
Ответ #1
  • Новичок
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
не совсем понятна проблема...
овверайд не работает?
Вы же взяли всю функцию, исправили две строчки и отправили её в овверайд -  по идее всё должно работать

В Вашем случае также можно было поэкспериментировать с этой строкой
$category_title = (empty($category->meta_title) ? $category->name : $category->meta_title);
просто убрать условие

24 Ноябрь 2018, 13:52:56
Ответ #2
  • Новичок
  • *
  • Сообщений: 5
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Нет оверрайда. Нужно написать работающий.
24 Ноябрь 2018, 16:31:52
Ответ #3
  • Новичок
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
попробуйте сначала сделать без оверрайда - в основном пхп, а уже потом переносите

ну и с функцией ajaxcall сильно все закручено - там сложно в оверрайд ее вставить
27 Ноябрь 2018, 12:46:03
Ответ #4
  • Новичок
  • *
  • Сообщений: 5
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Без override сделано и работает. Но это правки по живому в модуль, который обновляется. Это не хорошо.
Как перенести эти две строчки в работающий override ?
27 Ноябрь 2018, 13:12:34
Ответ #5
  • Новичок
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
попробуйте разобраться с функцией blocklayered-ajax.php

разработчики почему то вынесли ее отдельно
именно из нее вызывается ajaxCall
и, кажется, по этой причине оверрайд не работает
15 Февраль 2019, 16:35:59
Ответ #6
  • Новичок
  • *
  • Сообщений: 5
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
И чтобы закрыть вопрос, ниже привожу работающее переопределение:
<?php
if (!defined('_PS_VERSION_'))
exit;

class 
BlockLayeredOverride extends BlockLayered
{

public function ajaxCall()
{
global $smarty$cookie;

$category = new Category(Tools::getValue('id_category_layered'Configuration::get('PS_HOME_CATEGORY')), (int)$cookie->id_lang);
$category_title = (empty($category->meta_title[$id_lang]) ? $category->name[$id_lang] : $category->meta_title[$id_lang]);

$selected_filters parent::ajaxCall();
$vars json_decode($selected_filters,  true);

$tmp1 $this->context->smarty->template_objects;
$tmp array_shift($tmp1);
$tmp $tmp->smarty->template_objects;
$tmp array_shift($tmp);
$tmp $tmp $tmp->smarty->tpl_vars;
$tmp $tmp['title_values'];
$title_values $tmp->value;


unset($tmp1);
unset($tmp);
$title '';

if (is_array($title_values))
foreach ($title_values as $key => $val)
{
$title .= ' > '.$key.' '.implode('/'$val);
}

$good_title $category->name.$title;

$vars['heading'] = $good_title;

return Tools::jsonEncode($vars);

}


}
Это файл blocklayered.php по пути override/modules/blocklayered/