20 июля 2013 г.

В этой статье речь пойдёт о расширении возможностей одного из стандартных модулей OpenCart, модуля показа баннеров. Цель доработки – получить возможность показывать на страницах магазина интерактивные баннеры в виде flash-объектов, java-апплетов, блоков javascript или любого другого кода в формате гипертекстовой разметки. Основная ставка сделана на размещение рекламных баннеров программ Google AdWords или Яндекс.Директ, также будет не менее интересно и полезно внедрить новые сервисы для покупателей на базе технологий Ajax.

В общем виде одна из форм модуля баннеров (см. меню Система/Дизайн/Баннеры) будет дополнена новой кнопкой, при нажатии которой можно выбрать один из типов баннера: изображение или код HTML.


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

Внимание! Перед каждой модификацией сайта или базы данных не забывайте делать резервные копиии.

Порядок внесения изменений

1. Используя веб-приложение PhpMyAdmin или консоль MySQL в структуру таблицы banner_image добавьте поле code с типом данных TEXT.

2. В файле ~/admin/model/design/banner.php для функций addBanner() и editBanner() в конструкции INSERT INTO для таблицы banner_image в конец текста запроса добавьте code = '" .  $this->db->escape($banner_image['code']) . "'
2.1  Здесь же для функции getBannerImages() в переменную массива данных $banner_image_data[] добавьте 'code' => $banner_image['code']

3. В файлах ~/admin/language/russian/design/banner.php и ~/admin/language/english/design/banner.php добавим соответствующие им переменные перевода:

$_['text_empty'] = 'Очистить поле';
$_['entry_code'] = 'Код HTML:';
$_['button_code'] = 'Код HTML';
$_['button_image'] = 'Изображение';
$_['text_empty'] = 'Clear Field';
$_['entry_code'] = 'HTML Code:';
$_['button_code'] = 'HTML Code';
$_['button_image'] = 'Image';
4. В файле контроллера модуля баннера ~/admin/controller/design/banner.php для функции getForm()  определяем переменные перевода из п.3:

$this->data['text_empty'] = $this->language->get('text_empty');
$this->data['entry_code'] = $this->language->get('entry_code');
$this->data['button_code'] = $this->language->get('button_code');
$this->data['button_image'] = $this->language->get('button_image');

Для этой же функции в переменную массива данных $this->data['banner_images'][] добавляем: 'code' => $banner_image['code']

5. Шаблон формы ~/admin/view/template/design/banner_form.tpl полностью заменяем на файл, размещенный по указанной ссылке.

6. В файле ~/catalog/controller/module/banner.php после строки foreach ($results as $result) { добавляем следующий код:

if (!empty($result['code'])) {
$this->data['banners'][] = array(
'code' => $result['code']
);
} else

7. В шаблоне ~/catalog/view/theme/default/template/module/banner.tpl находим строку <?php if ($banner['link']) { ?> и заменяем на код ниже:

  <?php if (!empty($banner['code'])) { ?>
  <?php echo htmlspecialchars_decode($banner['code']); ?>
  <?php } elseif ($banner['link']) { ?>

Готово! Дополнительных настроек не требуется, все ранее сохранённые баннеры в системе останутся, для них станет доступно новое поле для ввода кода.

В расширенной версии модификации (см. рисунок ниже) добавлена возможность определения групп посетителей, для которых будут показаны или скрыты те или иные баннеры. Например, если пользователь авторизован как покупатель, то лучше не раздражать его лишний раз рекламой или анимированными изображениями.

Если в процессе реализации данного решения на практике Вы столкнулись с трудностями или хотите приобрести расширенную модификацию, тогда обращайтесь к нам, в том числе и за квалифицированной помощью.

5 комментариев:

  1. Update: Если обратили внимание, то в карточке банера есть статус, который не работает. Видимо разработчики недоработали запрос.

    В модели /catalog/model/design/banner.php необходимо заменить существующую строку запроса на следующую:

    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "banner b LEFT JOIN " . DB_PREFIX . "banner_image bi ON (b.banner_id = bi.banner_id) LEFT JOIN " . DB_PREFIX . "banner_image_description bid ON (bi.banner_image_id = bid.banner_image_id) WHERE b.status = 1 AND bi.banner_id = '" . (int)$banner_id . "' AND bid.language_id = '" . (int)$this->config->get('config_language_id') . "'");

    В шаблоне банера /catalog/view/theme/default/template/module/banner.tpl весь код необходимо заключить в тело условия:
    ...

    ОтветитьУдалить
  2. В расширенную версию доработки добавлена сортировка банеров. Это касается, прежде всего, административного интерфейса управления банерами (перемещение содержимого таблицы при помощи мыши).

    ОтветитьУдалить
  3. В модуль показа баннеров добавлен элемент расположения CSS Selector, что позволяет разместить баннеры в любой части HTML-документа.

    ОтветитьУдалить
  4. мне как чайнику пункт 1 и 2 не очень понятно
    поподробней ни как ?

    ОтветитьУдалить
    Ответы
    1. Здравствуйте! Подробнее вроде некуда, дальше только выполнить работу за вас (см. услуги).

      Статья рассчитана на пользователей, знакомых с работой в phpMyAdmin и синтаксисом языка PHP.

      Удалить

  • RSS
  • Twitter
  • Youtube