Перейти к содержанию
Ramis05rus

[Решено] 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 1

Поделиться сообщением


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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 31.03.2017 в 14:18, thentru сказал:

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


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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 часов назад, Alexlife сказал:

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

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От NNA
      Ещё один лёгкий мод, решающий одну из самых назойливых косметических SEO-проблем Опенкарта: index.php?route=common/home на главной.
      Способов на форумах масса, многие из которых на сегодня по разным причинам не работают, включая добавление переадресаций в oc_url_alias.
       
      Плюсы:
      Не требует загрузки файлов (значит, и нет потенциальных проблем с ftp). Не требует JQuery. Минимизированный код (не сжатый! т.е. без потери удобства чтения-правок).  
      Известные минусы: не обнаружено.
       
      Установка:
      Распаковать zip-архив! Установочный файл - xml из архива. Установить через стандартное меню (либо скопировать в папку /system/ сайта) В обоих случаях обновить кэш модификаторов.  
      На более старых версиях не проверялось. Пробуйте, пишите отчёты о работоспособности, мод совершенно бесплатный.
    • От NNA
      Скачать/Купить дополнение


      Show Password (Показать-скрыть пароль) для OC 2.x
      Отображает и снова прячет пароли на страницах регистрации, авторизации и изменения пароля.
      Давно известно, что на самом деле толком не повышающая безопасности мода прятать вводимые символы под "звёздочками" приводит к потере клиентов в е-коммерции из-за целого ряда неудобств, среди которых:
      Нет контроля набора букв, особенно новых и сложных паролей. Ошибки, отрицательные эмоции. В случае несовпадения паролей в полях невозможно определить, какое из них содержит ошибку, а какое - верный пароль. Невозможно элементарно скопировать набранный пароль для сохранения в любимый блокнот\контейнер\etc. Ну и так далее. Столкнулся с полным отсутствием решения этой давно наболевшей проблемы для пользователей. Дарю сообществу, пусть приносит пользу (и расширение, и сообщество ).
      Должно работать на:
      любых грамотных шаблонах, использующих стандартный вывод ошибок при вводе пароля. Проверено на нескольких имеющихся. любой версии OC2 со стандартным шаблоном. Проверено от 2.2.х. В случае несовместимости шаблона - правки минимальны, но по просьбе могу внести в публикуемый код.
      Тестирование (и сообщения о работоспособности) на OCStore и других сборках также привествуются.
      Плюсы:
      Не требует загрузки файлов (значит, и нет потенциальных проблем с ftp). Не требует JQuery. Минимизированный код (не сжатый! т.е. без потери удобства чтения-правок). Известные минусы: не обнаружено.
      Установка:
      Распаковать zip-архив! Установочный файл - xml из архива. Установить через стандартное меню (либо скопировать в папку /system/ сайта) В обоих случаях обновить кэш модификаторов. Добавил NNA Добавлено 10.01.2017 Категория Прочее Системные требования Исправный OCMOD Метод активации Без активации Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1
      2.0 ocStore 2.3
      2.2
      2.1 OpenCart.Pro, ocShop Не проверялось  
    • От Dim4ik86
      Скачать/Купить дополнение


      Интеграция с МойСклад
      Модуль синхронизации товаров из сервиса МойСклад в OpenCart 2.3
       
      Доступный функционал:
      - Синхронизация категорий
      - Синхронизация остатков
      - Синхронизация заказов
      - Синхронизация модификаций
      - Синхронизации статусов заказа из OpenCart в МойСклад (при условии создании в МойСклад таких же статусов как и в OpenCart)
      - Приветственное СМС при регистрации в магазине (SMSInt)
      - Отправка СМС сообщения пользователям, у которых не было покупок в течении 30 дней
       
      Чтобы СМС сообщения работали надо аккаунт на сервисе SMSInt
       
       
      Пожелания по улучшению пишите в теме поддержке.
      Добавил Dim4ik86 Добавлено 25.05.2018 Категория Модули Системные требования Сайт разработчика Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3 ocStore 2.3 OpenCart.Pro, ocShop  
    • От Dim4ik86
      Модуль синхронизации товаров из сервиса МойСклад в OpenCart 2.3
       
      Доступный функционал:
      - Синхронизация категорий
      - Синхронизация остатков
      - Синхронизация заказов
      - Синхронизация модификаций
      - Синхронизации статусов заказа из OpenCart в МойСклад (при условии создании в МойСклад таких же статусов как и в OpenCart)
      - Приветственное СМС при регистрации в магазине (SMSInt)
      - Отправка СМС сообщения пользователям, у которых не было покупок в течении 30 дней
       
      Чтобы СМС сообщения работали надо аккаунт на сервисе SMSInt
       
       
      Пожелания по улучшению пишите в теме поддержке.
    • От fildenis
      После установки модуля Attribute Ext. в карточке товара перестала отображаться вкладка с характеристиками товара. И появилась ошибка "Notice: Undefined index: attribute_groups in /home/germansh/public_html/system/storage/modification/catalog/controller/product/product.php on line 1288"
       
      Автор темы намекнул на решение проблемы:
       
      Вот кусок этого кода в ocmode файле:
       


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

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

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