Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

[Решено] OpenCart 2. Как проверить, находимся ли мы на странице товара?


 Поделиться

Рекомендованные сообщения

Здравствуйте!
Имеется магазин на OpenCart 2.0.1.1, необходимо в header.tpl задать проверку, находимся мы на странице товара или же какой-то другой.

<?php
  if (<проверка, товар ли мы показываем или нет>){
    оператор;
  }else{
    оператор 2;
  };
?>
Как можно провести такую проверку? Используется ЧПУ, так что из url парсить не удастся.
Может, можно через тип используемого шаблона? Для товаров используется product.tpl, в нём и вызывается header.tpl
Изменено пользователем Ramis05rus
Ссылка на комментарий
Поделиться на других сайтах


Проверяеть по роуту

if (isset($this->request->get['route']) && $this->request->get['route'] == 'product/product') {
 ...
}
  • +1 2
Ссылка на комментарий
Поделиться на других сайтах


Вот такая конструкция у меня.

<?php if ($description) : ?>
	//если есть родной дескрипшн, выводим собственный
	<meta name="description" content="<?php echo $description; ?>" />
	//иначе, если мы находимся на странице с товаром
	//формируем дескрипшн вида "тайтл + некоторые предопределенные слова"
<?php elseif(isset($this->request->get['route']) && $this->request->get['route'] == 'product/product') : ?>
	<meta name="description" content="<?php $desc = $title . '. ✔ Заходите!'; echo $desc; ?>" />
<?php else : ?>
	//для отладки - если не удается получить ни тот, ни другой, пишем "отсутствует"
	<meta name="description" content="Отсутствует" />
<?php endif; ?>

Эта проверка не работает, выводится "отсутствует". Есть еще идеи?

Изменено пользователем Ramis05rus
Ссылка на комментарий
Поделиться на других сайтах


Проверку необходимо делать в контроллере, а не в представлении

Ссылка на комментарий
Поделиться на других сайтах


thentru, Я правильно понимаю, в контроллер header.php мы добавляем эту проверку, определяем, например, переменную, а затем можем обращаться к этой переменной из header.tpl?

 

Добавил в system\modification\catalog\controller\common\header.php ,

class ControllerCommonHeader extends Controller {
	<тут стандартные функции>
	
    if (isset($this->request->get['route']) && $this->request->get['route'] == 'product/product') {
		$tovar = true;
    };
}

но получил просто пустую страницу. Где я ошибся, неправильно выбрал место для размещения проверки?

Ссылка на комментарий
Поделиться на других сайтах


Переменная $description в данном случае относится к контроллеру продукта
/catalog/controller/product/product.php

соответственно, все ваши манипуляции делаете в нем и выводите в product.tpl


в header.tpl эта переменная $description недоступна, чтобы ее здесь получить нужно получить информацию о товаре

Изменено пользователем thentru
  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


thentru, Дело в том, что $description - это не описание непосредственно товара, это содержимое одноимённого метатега (привет, SEO), и она доступна из header.tpl в изначальной версии шаблона, без падений.

 

Проблемы у меня возникают, когда я добавляю любой код в контроллер (я что-то на этом шаге делаю неверно).

Например, сейчас я добавил в \system\modification\catalog\controller\product\product.php код:

<?php
class ControllerProductProduct extends Controller {
	тут стандартные функции

	$abcde = 5;
}

и получил пустой экран при открытии товара.

 

То же было, когда пытался добавить что-то в header.php.

Можно писать прямо в классе, или надо оборачивать код в какую-то функцию?

PS. Шаблон NewStore, если это внесёт ясность...

Изменено пользователем Ramis05rus
Ссылка на комментарий
Поделиться на других сайтах


1. правки внутри метода index()

2. зачем вы трогаете header?
3. проверка на роут вам и не нужна
4. посмотрите как передается мета-тег в контроллере продукта

$this->document->setDescription($product_info['meta_description']);

все что вам надо - это слепить нужный мета-тег и установить его через метод setDescription

Изменено пользователем thentru
  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


thentru, я сразу не объяснил, исправлюсь.

Есть куча товаров с не прописанным метатегом description.

Есть страницы типа "Главная", "О нас", у которых этот метатег составлен вручную, но также есть страницы без тега.

 

Задача: для страниц с товарами выводить:

1) если метатег задан - выводить его (этот вариант по-умолчанию работает, в header.tpl есть условие проверки $description, если не пустая = выводим);

2) если метатег для страницы товара не прописан - генерируем description по шаблону "%название товара% - Купить там-то сям-то." и выводим его.

 

Изначально код в header.tpl выглядел так:

<?php if ($description) { ?>
	<meta name="description" content="<?php echo $description; ?>" />
<?php } ?>

И он работал.

Я его модифицировал, добавив генерацию description по шаблону в случае его отсутствия:

<?php if ($description) : ?>
	<meta name="description" content="<?php echo $description; ?>" />
<?php else : ?>
	<?php
		$desc = $title . ' ➤ Купить по выгодной цене!';
	?>
	<meta name="description" content="<?php echo $desc; ?>" />
<?php endif; ?>

И это тоже работает :)

Теперь нужно сделать так, чтобы description генерировался в случае отсутствия только на страницах товара (а не, например, в категориях или каких-то справочных страницах типа "Доставки"). То есть, перед процедурой генерации нужно добавить проверку, товар ли мы собираемся отобразить, или нет.

Ссылка на комментарий
Поделиться на других сайтах


@Ramis05rus , вы идёте абсолютно не тем путём! Как уже было сказано выше, есть метод

$this->document->setDescription()

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

Ссылка на комментарий
Поделиться на других сайтах


thentru, Dotrox, большое спасибо!

В \system\modification\catalog\controller\product\product.php после указанного метода добавил

if ($product_info['meta_description'] == ''){
	$this->document->setDescription($data['heading_title'] . ' ➤ Купить по выгодной цене!');
}

, всё работает как надо!

Ссылка на комментарий
Поделиться на других сайтах


@Ramis05rus , это надо делать не в кеше модификаторов, а в оригинальном файле (/catalog/controller/product/product.php), иначе все правки после обновления кеша улетят в трубу.

И второе: надо не дважды вызывать setDescription, а сделать все проверки до вызова и туда передать уже результат. То есть так:

if (empty($product_info['meta_description'])){
	$product_info['meta_description'] = $data['heading_title'] . $this->language->get('custom_meta_description');	
}
$this->document->setDescription($product_info['meta_description']);

 

Ну, и обратите внимание, что empty, а не сравнение с пустой строкой и сам текст не в контроллере, а в языковом файле и подтягивается оттуда через

$this->language->get

 

Ссылка на комментарий
Поделиться на других сайтах


  • 7 месяцев спустя...
В 31.03.2017 в 14:18, thentru сказал:

Проверяеть по роуту


if (isset($this->request->get['route']) && $this->request->get['route'] == 'product/product') {
 ...
}

и что в трех точках писать если мне нужно вывести код в определенном месте в хедер тпл?

 

Ссылка на комментарий
Поделиться на других сайтах


14 часов назад, Alexlife сказал:

и что в трех точках писать если мне нужно вывести код в определенном месте в хедер тпл?

то, что нужно сделать при данном условии

Ссылка на комментарий
Поделиться на других сайтах


  • 3 года спустя...

Решение: в контроллер https://prnt.sc/wey1bs

$data['route'] = $this->request->get['route'];

в шаблон в нужное место: https://prnt.sc/wey1tm

<?php if ($route == 'product/product') { ?>
мы на странице товара
<?php } else { ?>
мы на другой странице
<?php } ?>

 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.