Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Здравствуйте!
Имеется магазин на 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 months later...
В 31.03.2017 в 14:18, thentru сказал:

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


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

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

 

Надіслати
Поділитися на інших сайтах


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

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

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

Надіслати
Поділитися на інших сайтах


  • 3 years later...

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

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

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

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

 

  • +1 1
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.