Модуль виджета whatsapp для Opencart

Купить модуль(+установка) можно через мой кворк или обратившись ко мне напрямую. Ниже файлы для самостоятельной установки.

Версия: Ocstore2.3

Тип модуля:для мобильных устройств

 class=

В течение минуты «загорается» и напоминает, чтобы пользователь может написать в Whatsapp. Напоминание закрывается по нажатию на кретстик

 class=

По нажатию на иконку происходит перенаправление на вотсаповскую форму

 class=

Телефон отправки сообщения и текст задаются настройками модуля в админке

 class=

Файлы модуля

Контроллер в админке

<?php
class ControllerExtensionModuleMobutpanel extends Controller {
	private $error = array();
	public function index() {
		$this->load->language('extension/module/mobutpanel');
		$this->load->model('extension/module');
		if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
			if (!isset($this->request->get['module_id'])) {
				$this->model_extension_module->addModule('mobutpanel', $this->request->post);
			} else {
				$this->model_extension_module->editModule($this->request->get['module_id'], $this->request->post);
			}
			// $this->session->data['success'] = $this->language->get('text_success');
			$this->response->redirect($this->url->link('extension/extension', 'token=' . $this->session->data['token'] . '&type=module', true));
		}
		$data['entry_phone'] = $this->language->get('entry_phone');
		$data['entry_message'] = $this->language->get('entry_message');
		$data['entry_status'] = $this->language->get('entry_status');
		$data['entry_name'] = $this->language->get('entry_name');
		$data['text_edit'] = $this->language->get('text_edit');
		$data['heading_title'] = $this->language->get('heading_title');
		$data['text_enabled'] = $this->language->get('text_enabled');
		$data['text_disabled'] = $this->language->get('text_disabled');
		$data['button_save'] = $this->language->get('button_save');
		$data['button_cancel'] = $this->language->get('button_cancel');
		if (isset($this->error['warning'])) {
			$data['error_warning'] = $this->error['warning'];
		} else {
			$data['error_warning'] = '';
		}
		if (isset($this->error['name'])) {
			$data['error_name'] = $this->error['name'];
		} else {
			$data['error_name'] = '';
		}
		if (isset($this->error['phone'])) {
			$data['error_phone'] = $this->error['phone'];
		} else {
			$data['error_phone'] = '';
		}		
		if (isset($this->error['message'])) {
			$data['error_message'] = $this->error['message'];
		} else {
			$data['error_message'] = '';
		}
		$data['breadcrumbs'] = array();
		$data['breadcrumbs'][] = array(
			'text' => $this->language->get('text_home'),
			'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], true)
		);
		$data['breadcrumbs'][] = array(
			'text' => $this->language->get('text_extension'),
			'href' => $this->url->link('extension/extension', 'token=' . $this->session->data['token'] . '&type=module', true)
		);
		if (!isset($this->request->get['module_id'])) {
			$data['breadcrumbs'][] = array(
				'text' => $this->language->get('heading_title'),
				'href' => $this->url->link('extension/module/mobutpanel', 'token=' . $this->session->data['token'], true)
			);
		} else {
			$data['breadcrumbs'][] = array(
				'text' => $this->language->get('heading_title'),
				'href' => $this->url->link('extension/module/mobutpanel', 'token=' . $this->session->data['token'] . '&module_id=' . $this->request->get['module_id'], true)
			);
		}
		if (!isset($this->request->get['module_id'])) {
			$data['action'] = $this->url->link('extension/module/mobutpanel', 'token=' . $this->session->data['token'], true);
		} else {
			$data['action'] = $this->url->link('extension/module/mobutpanel', 'token=' . $this->session->data['token'] . '&module_id=' . $this->request->get['module_id'], true);
		}
		$data['cancel'] = $this->url->link('extension/extension', 'token=' . $this->session->data['token'] . '&type=module', true);
		if (isset($this->request->get['module_id']) && ($this->request->server['REQUEST_METHOD'] != 'POST')) {
			$module_info = $this->model_extension_module->getModule($this->request->get['module_id']);
		}
		if (isset($this->request->post['name'])) {
			$data['name'] = $this->request->post['name'];
		} elseif (!empty($module_info)) {
			$data['name'] = $module_info['name'];
		} else {
			$data['name'] = '';
		}
		if (isset($this->request->post['phone'])) {
			$data['phone'] = $this->request->post['phone'];
		} elseif (!empty($module_info)) {
			$data['phone'] = $module_info['phone'];
		} else {
			$data['phone'] = '7';
		}		
		if (isset($this->request->post['message'])) {
			$data['message'] = $this->request->post['message'];
		} elseif (!empty($module_info)) {
			$data['message'] = $module_info['message'];
		} else {
			$data['message'] = 'Здравствуйте! Хочу получить консультацию.';
		}	
		if (isset($this->request->post['status'])) {
			$data['status'] = $this->request->post['status'];
		} elseif (!empty($module_info)) {
			$data['status'] = $module_info['status'];
		} else {
			$data['status'] = '';
		}
		$data['header'] = $this->load->controller('common/header');
		$data['column_left'] = $this->load->controller('common/column_left');
		$data['footer'] = $this->load->controller('common/footer');
		$this->response->setOutput($this->load->view('extension/module/mobutpanel', $data));
	}
	protected function validate() {
		if (!$this->user->hasPermission('modify', 'extension/module/mobutpanel')) {
			$this->error['warning'] = $this->language->get('error_permission');
		}
		if ((utf8_strlen($this->request->post['name']) < 3) || (utf8_strlen($this->request->post['name']) > 64)) {
			$this->error['name'] = $this->language->get('error_name');
		}
		if (!$this->request->post['phone']) {
			$this->error['phone'] = $this->language->get('error_phone');
		}		
		if (!$this->request->post['message']) {
			$this->error['message'] = $this->language->get('error_message');
		}
		return !$this->error;
	}
}

Вьюшка в админке

<?php echo $header; ?><?php echo $column_left; ?>
<div id="content">
  <div class="page-header">
    <div class="container-fluid">
      <div class="pull-right">
        <button type="submit" form="form-special" data-toggle="tooltip" title="<?php echo $button_save; ?>" class="btn btn-primary"><i class="fa fa-save"></i></button>
        <a href="<?php echo $cancel; ?>" data-toggle="tooltip" title="<?php echo $button_cancel; ?>" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
      <ul class="breadcrumb">
        <?php foreach ($breadcrumbs as $breadcrumb) { ?>
        <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
        <?php } ?>
      </ul>
    </div>
  </div>
  <div class="container-fluid">
    <?php if ($error_warning) { ?>
    <div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?>
      <button type="button" class="close" data-dismiss="alert">×</button>
    </div>
    <?php } ?>
    <div class="panel panel-default">
      <div class="panel-body">
        <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-special" class="form-horizontal">
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-name"><?php echo $entry_name; ?></label>
            <div class="col-sm-10">
              <input type="text" name="name" value="<?php echo $name; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name" class="form-control" />
              <?php if ($error_name) { ?>
              <div class="text-danger"><?php echo $error_name; ?></div>
              <?php } ?>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-phone"><?php echo $entry_phone; ?></label>
            <div class="col-sm-10">
              <input type="text" name="phone" value="<?php echo $phone; ?>" placeholder="<?php echo $entry_phone; ?>" id="input-phone" class="form-control" />
              <?php if ($error_phone) { ?>
              <div class="text-danger"><?php echo $error_phone; ?></div>
              <?php } ?>
            </div>
          </div>          
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-phone"><?php echo $entry_message; ?></label>
            <div class="col-sm-10">
              <input type="text" name="message" value="<?php echo $message; ?>" placeholder="<?php echo $entry_message; ?>" id="input-phone" class="form-control" />
              <?php if ($error_message) { ?>
              <div class="text-danger"><?php echo $error_message; ?></div>
              <?php } ?>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-status"><?php echo $entry_status; ?></label>
            <div class="col-sm-10">
              <select name="status" id="input-status" class="form-control">
                <?php if ($status) { ?>
                <option value="1" selected="selected"><?php echo $text_enabled; ?></option>
                <option value="0"><?php echo $text_disabled; ?></option>
                <?php } else { ?>
                <option value="1"><?php echo $text_enabled; ?></option>
                <option value="0" selected="selected"><?php echo $text_disabled; ?></option>
                <?php } ?>
              </select>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
<?php echo $footer; ?>

Контроллер на фронтенде

<?php
class ControllerExtensionModuleMobutpanel extends Controller {
	public function index($setting) {
			$data['phone'] = $setting['phone'];
			$data['message'] = $setting['message'];
			if($this->isMobile()){
			    return $this->load->view('extension/module/mobutpanel', $data);
			}
			
		}
		public function isMobile() { 
			return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up.browser|up.link|webos|wos)/i", /*$_SERVER["HTTP_USER_AGENT"]*/$this->request->server['HTTP_USER_AGENT']);
			}
	}

Вьюшка на фронтенде

<style>
.callbackkiller {
  box-sizing: content-box !important;
  font-size: 13px !important;
  font-weight: 300 !important;
  transform-origin: 50% 50% 0px;
  -webkit-box-shadow: 0 3px 12px rgba(0,0,0,.15);
  -moz-box-shadow: 0 3px 12px rgba(0,0,0,.15);
  box-shadow: 0px 3px 12px rgba(0,0,0,0.15);
  white-space: normal;
}
.close {
  text-shadow: none;
}
.callbackkiller, .callbackkiller * {
  color: #333 !important;
  font-family: CBKOpenSans,CBKRobotoLight,sans-serif !important;
  font-style: normal !important;
  text-transform: none !important;
}
.cbk-phone, .cbk-phone:hover {
  background-color: transparent !important;
  bottom: 5%;
  border-radius: 60px !important;
  -webkit-border-radius: 60px !important;
  color: #fff;
  display: block;
  font-size: 22px !important;
  height: 120px !important;
  left: auto;
  outline: none !important;
  overflow: hidden;
  padding: 0 !important;
  position: absolute;
  right: 20%;
  text-decoration: none;
  top: auto;
  width: 120px !important;
  z-index: 9999 !important;
  transition: none;
  -webkit-transition: none;
}
.cbk-phone-pulse, .cbk-phone-waves, .cbk-phone-wild, .multi-button-waves {
  overflow: visible !important;
}
.callbackkiller.whatsapp {
  display: none !important;
}
/* @media all and (max-width:767px) */
.callbackkiller.whatsapp {
  display: block !important;
}
.cbk-phone.cbk-phone-xs, .cbk-phone.cbk-phone-xs:hover {
  height: 60px !important;
  width: 60px !important;
  position: absolute;
}
/* @media all and (max-width:767px) */
.callbackkiller.cbk-phone.cbk-phone-pulse {
  --box-shadow-color:  0 9px 16px rgba(19,156,20,.6);
}
.callbackkiller.cbk-phone.cbk-phone-pulse {
  --box-shadow-color: 0 9px 16px rgba(255,34,65,.6);
  -webkit-animation: envybox-phone-pulse 12s infinite ease-in;
  -moz-animation: envybox-phone-pulse 12s infinite ease-in;
  -ms-animation: envybox-phone-pulse 12s infinite ease-in;
  -o-animation: envybox-phone-pulse 12s infinite ease-in;
  animation: envybox-phone-pulse 12s infinite ease-in;
  -webkit-backface-visibility: visible !important;
}
.callbackkiller.cbk-phone.cbk-phone-pulse {
  --box-shadow-color:  0 9px 16px rgba(19,156,20,1) !important;
}
/* @media all and (max-width:767px) */
.callbackkiller.whatsapp.cbk-phone.cbk-phone-xs {
  height: 57px !important;
  width: 57px !important;
  display: block;
  position: fixed;
  bottom: 10%;
  right: 4%;
  transform: scale(1);
  z-index: 5;
}
ul.tabs li span, .front_slider_wrapp .extended_pagination span, a, a span {
  -webkit-transition: color ease-out 0.07s;
  -moz-transition: color ease-out 0.07s;
  -o-transition: color ease-out 0.07s;
  transition: color ease-out 0.07s;
}
/* @media all and (max-width:767px) */
.callbackkiller .whatsapp-notifier {
  display: block;
  width: 227px;
  position: relative;
  top: 30px;
  left: -188px;
  overflow: hidden;
}
/* @media all and (max-width:767px) */
.callbackkiller .whatsapp-notifier__inner-wrapp {
  position: relative;
  background: #139c14;
  padding: 5px 5px 5px 15px;
  border-radius: 13px;
  right: -250px;
}
.alert .alert-link, .close {
  font-weight: 700;
}
.close, .list-group-item > .badge {
  float: right;
}
.close {
  font-size: 21px;
  line-height: 1;
  color: #000;
  text-shadow: 0px 1px 0px #fff;
  opacity: 0.2;
  filter: alpha(opacity=20);
}
.callbackkiller span {
  -webkit-transform: none !important;
  transform: none !important;
}
/* @media all and (max-width:767px) */
.callbackkiller .whatsapp-notifier__close {
  z-index: 999;
  opacity: 1;
  font-size: 18px;
  color: #aeaeae !important;
  width: 25px;
  height: 24px;
  text-align: center;
  position: relative;
  right: 195px;
  top: -2px;
}
/* @media all and (max-width:767px) */
.callbackkiller .whatsapp-notifier__body {
  color: #fff !important;
  font-size: 14px;
  line-height: 18px;
  font-weight: bold;
  text-align: center;
}
/* @media all and (max-width:767px) */
.callbackkiller .whatsapp__message-count {
  position: absolute;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background-color: #ff360e;
  font-size: 12px;
  line-height: 21px;
  color: #fff !important;
  text-align: center;
  z-index: 1000000;
  right: 0px;
  display: none;
}
.cbk-phone .cbk-phone-bgr {
  background-color: #f44336;
  border-radius: 60px !important;
  -webkit-border-radius: 60px !important;
  height: 100% !important;
  opacity: 0.95;
  width: 100% !important;
}
.cbk-phone .cbk-phone-bgr, .cbk-phone .cbk-phone-phone {
  left: 0px !important;
  position: absolute !important;
  top: 0px !important;
  z-index: 9997 !important;
}
.cbk-phone .cbk-phone-bgr {
  background-color: rgba(19, 156, 20, 1) !important;
}
.callbackkiller.cbk-phone.cbk-phone-pulse .cbk-phone-circle {
  background-color: rgba(19, 156, 20, 1) !important;
}
/* @media all and (max-width:767px) */
.callbackkiller.whatsapp.cbk-phone .cbk-phone-bgr, .callbackkiller.whatsapp.cbk-phone.cbk-phone-pulse .cbk-phone-circle, .callbackkiller.whatsapp.cbk-phone.cbk-phone-pulse .cbk-phone-second_circle, .callbackkiller.whatsapp.cbk-phone.cbk-phone-pulse .cbk-phone-third_circle {
  background-color: rgba(19, 156, 20, 1) !important;
}
.cbk-multi-button-circle, .cbk-phone-circle {
  transform-origin: center center 0px !important;
  -moz-transform-origin: center center !important;
  -webkit-transform-origin: center center 0px !important;
  -o-transform-origin: center center !important;
  -ms-transform-origin: center center !important;
}
.cbk-phone-pulse .cbk-phone-circle {
  display: none;
  position: fixed !important;
  top: 0px;
  left: 0px;
  right: 0px;
  bottom: 0px;
  margin: auto;
  -webkit-border-radius: 100%;
  -moz-border-radius: 100%;
  -ms-border-radius: 100%;
  -o-border-radius: 100%;
  border-radius: 100%;
  border: 2px solid transparent;
  opacity: 0;
  animation-play-state: running;
  animation-duration: 12s;
  animation-name: envybox-circle-pulse;
  animation-iteration-count: infinite;
  animation-timing-function: ease-in;
  background-color: #a71933;
  pointer-events: none;
}
.callbackkiller.cbk-phone.cbk-phone-pulse .cbk-phone-circle {
  display: block;
  -webkit-backface-visibility: visible !important;
}
.cbk-phone .cbk-phone-phone {
  height: 60px !important;
  margin: 24px;
  width: 60px !important;
}
.cbk-phone .cbk-phone-content div {
  display: block;
  opacity: 0;
  position: absolute !important;
  -webkit-transform-origin: center center 0px;
  transform-origin: center center 0px;
  transform: perspective(400px) rotateY(-180deg) scale(0.4);
  -moz-transform: perspective(400px) rotateY(-180deg) scale(.4);
  -ms-transform: perspective(400px) rotateY(-180deg) scale(.4);
  -webkit-transform: perspective(400px) rotateY(-180deg) scale(0.4);
  -o-transform: perspective(400px) rotateY(-180deg) scale(.4);
  -khtml-transform: perspective(400px) rotateY(-180deg) scale(.4);
  -webkit-transition: all .8s cubic-bezier(.19,1,.22,1);
  -moz-transition: all .8s cubic-bezier(.19,1,.22,1);
  -o-transition: all .8s cubic-bezier(.19,1,.22,1);
  transition: all .8s cubic-bezier(.19,1,.22,1);
}
.cbk-phone.cbk-phone-xs .cbk-phone-phone {
  height: 30px !important;
  margin: 12px;
  width: 30px !important;
}
.cbk-phone .cbk-phone-content div.cbk-rotate-icon {
  display: block !important;
  opacity: 1 !important;
  transform: perspective(400px) rotateY(0deg) scale(1) !important;
  -moz-transform: perspective(400px) rotateY(0) scale(1) !important;
  -ms-transform: perspective(400px) rotateY(0) scale(1) !important;
  -webkit-transform: perspective(400px) rotateY(0deg) scale(1) !important;
  -o-transform: perspective(400px) rotateY(0) scale(1) !important;
  -khtml-transform: perspective(400px) rotateY(0) scale(1) !important;
  -webkit-transform-style: preserve-3d !important;
  -ms-transform-style: preserve-3d !important;
  -o-transform-style: preserve-3d !important;
  transform-style: preserve-3d !important;
  -webkit-transition: opacity 3s cubic-bezier(.19,1,.22,1);
}
/* @media all and (max-width:767px) */
.callbackkiller.whatsapp.cbk-phone.cbk-phone-xs .cbk-phone-phone {
  margin: 5px 0 0 6px;
  height: 45px !important;
  width: 45px !important;
}
/* @media all and (max-width:767px) */
.callbackkiller.whatsapp.cbk-phone.cbk-phone-xs .cbk-phone-phone img {
  width: 100%;
}
</style>
<span class="callbackkiller whatsapp cbk-phone cbk-phone-xs cbk-phone-pulse cbk-phone-text-none"><a rel="nofollow" href="https://api.whatsapp.com/send?phone=<?=$phone;?>&text=<?= $message; ?>"><div class="whatsapp__message-count">1</div><div class="cbk-phone-bgr"></div><div class="cbk-phone-content"><div class="cbk-phone-phone cbk-rotate-icon"><img src="/image/mobutpanel_whatsapp.png" alt="whatsapp"></div></div><div class="cbk-phone-circle"></div><div class="cbk-phone-second_circle"></div><div class="cbk-phone-third_circle"></div></a><div class="whatsapp-notifier"><div class="whatsapp-notifier__inner-wrapp"><span class="whatsapp-notifier__close close close-fb">x</span><a rel="nofollow" href="https://api.whatsapp.com/send?phone=<?=$phone;?>&text=<?= $message; ?>"><div class="whatsapp-notifier__body">Написать в WhatsApp</div></a></div></div></span><!--/noindex--><!--googleon: all--><!--googleoff: all--><!--noindex--><div class="ktodostavit_frame popup"></div><!--/noindex--><!--googleon: all--><div id="fade_detail"></div>
<script type="text/javascript">
    /* whatsapp widget */
    $(".whatsapp-notifier__close").on("click", function () {
        $( ".whatsapp-notifier__inner-wrapp" ).animate({ right: "-250px" }, 1000);
        setTimeout(function () {
            $(".whatsapp-notifier__inner-wrapp").animate({ right: "0" }, 1000);
        }, 25000);
    });
    
    setTimeout(function () {
        $(".whatsapp__message-count").show();
    }, 10000);
    setTimeout(function () {
        $(".whatsapp-notifier__inner-wrapp").animate({ right: "0" }, 1000);
    }, 12000);
    /* /whatsapp widget */
</script>
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

СТАТЬИ БЛОГА ПО РУБРИКЕ И МЕТКАМ

img

Какие включить доп. функции в плитку тегов

1. добавление тегов с автоподстановкой* через админку

*автоподстановкой названий товаров/категорий

см.видео

2. вывод плитки в любом месте шаблона через селекторы html(class или id)

см.видео

пояснения

подробная инструкция

3. замена дизайна плитки тегов с «карусели»(базовый дизайн) на «таблетки»

скрин (декстопная версия)

скрин (мобильная версия)


3а. замена изначального дизайна на «квадраты»

живой пример

скрины


3b. замена изначального дизайна на цепочку с кнопкой

живой пример

скрины


3c. замена изначального дизайна на дизайн с табами

скрин

живой пример_1

живой пример_2 (с картинками у тегов)

живой_пример_3 (с кнопкой <показать все>)


4. функция «упорядочивание тегов по полкам на витрине».

Подойдёт тем, у кого на одной странице очень много тегов и их нужно как-то упорядочить.

см.скриншот(декстоп)

см.скриншот(смартфон)

видео

живой пример

4а.Вывод плиток тегов в нескольких областях сразу

скриншот

инструкция

5. функция «отобразить плитку во всех товарах категории».

Допустим, у вас в магазине есть категория, в которой 500 товаров, а вам требуется добавить одну и туже плитку тегов в каждом из них. Если подключена данная функция, то достаточно добавить в эксель-файл для импорта только 1 строку и теги появятся на 500 страницах.


5_a. расширение функции №5 на подкатегории.


6. вывод плитки в листинге товаров

см.скрин

7. мультиязычность

с данной функцией отпадает необходимость создавать плитки под каждый язык отдельно

скриншот

8. Самостоятельный генератор тегов из товаров

см.статью


10. выгрузка всех тегов с сайта в эксель-файл

11. добавление тегов непосредственно в админке товара или категории

скрин

инструкция

12. Формирование посадочных страниц  к опциям/атрибутам стандартного фильтра

у страниц стандартного фильтра товаров появится ЧПУ(SEO URL), мета-теги (keywords,description), title (заголовок страницы) и h1.

видео


13. Ранжирование тегов по популярности

Какие включить доп. функции в плитку тегов

1. добавление тегов с автоподстановкой* через админку

*автоподстановкой названий товаров/категорий

см.видео

2. вывод плитки в любом месте шаблона через селекторы html(class или id)

см.видео

пояснения

подробная инструкция

3. замена дизайна плитки тегов с "карусели"(базовый дизайн) на "таблетки"

скрин (декстопная версия)

скрин (мобильная версия)


3а. замена изначального дизайна на "квадраты"

живой пример

скрины


3b. замена изначального дизайна на цепочку с кнопкой

живой пример

скрины


3c. замена изначального дизайна на дизайн с табами

скрин

живой пример_1

живой пример_2 (с картинками у тегов)

живой_пример_3 (с кнопкой <показать все>)


4. функция "упорядочивание тегов по полкам на витрине".

Подойдёт тем, у кого на одной странице очень много тегов и их нужно как-то упорядочить.

см.скриншот(декстоп)

см.скриншот(смартфон)

видео

живой пример

4а.Вывод плиток тегов в нескольких областях сразу

скриншот

инструкция

5. функция "отобразить плитку во всех товарах категории".

Допустим, у вас в магазине есть категория, в которой 500 товаров, а вам требуется добавить одну и туже плитку тегов в каждом из них. Если подключена данная функция, то достаточно добавить в эксель-файл для импорта только 1 строку и теги появятся на 500 страницах.


5_a. расширение функции №5 на подкатегории.


6. вывод плитки в листинге товаров

см.скрин

7. мультиязычность

с данной функцией отпадает необходимость создавать плитки под каждый язык отдельно

скриншот

8. Самостоятельный генератор тегов из товаров

см.статью


10. выгрузка всех тегов с сайта в эксель-файл

11. добавление тегов непосредственно в админке товара или категории

скрин

инструкция

12. Формирование посадочных страниц  к опциям/атрибутам стандартного фильтра

у страниц стандартного фильтра товаров появится ЧПУ(SEO URL), мета-теги (keywords,description), title (заголовок страницы) и h1.

видео


13. Ранжирование тегов по популярности

img

Создание мульти склада в opencart и получение остатков из 1С

  • Реализована возможность работать с несколькими складами в Opencart. Общий остаток товара складывается из остатков на складах.
  • Реализована передача остатков в интернет-магазин (ИМ) из выгрузки 1С.
  • Реализован вывод остатков по складам в карточке товара.

II. Подробное описание модуля

1.Передача остатков в ИМ настраивается с любых складов 1с, например, с основного склада и двух других.  Есть возможность использовать любые статусы наличия, например,

— если на «складе 1» товара нет, но на основном складе этот товар есть (или есть на складе 2), то в карточке на витрине будет показываться статус ожидание 1 день
— если нигде товара нет, то в карточке — статус нет в наличии
— если на выбранном складе товара менее Х штук, то статус — мало. (значение Х доступно для корректировки из админ-панели)

2. В модуле опенкарта реализована возможность добавлять/убирать склады и корректировать их настройки.  Чтобы работало обновление остатков из 1С, в настройках модуля требуется складам присвоить GUID из 1с.

3. Списание остатков производится в зависимости от способа доставки в заказе. Например, если выбрана курьерская доставка, то списание товара начнётся с основного склада, продолжится со склада 1 (при отсутствии на основном), далее со склада 2. Если в методе доставки заказа выбран самовывоз со склада 1 или со склада 2, то вначале списание произойдет с выбранного склада, затем с основного склада, и далее с последнего склада, где остались остатки. Приоритеты списания остатков настраиваются в админ-панели модуля.

Создание мульти склада в opencart и получение остатков из 1С

  • Реализована возможность работать с несколькими складами в Opencart. Общий остаток товара складывается из остатков на складах.
  • Реализована передача остатков в интернет-магазин (ИМ) из выгрузки 1С.
  • Реализован вывод остатков по складам в карточке товара.

II. Подробное описание модуля

1.Передача остатков в ИМ настраивается с любых складов 1с, например, с основного склада и двух других.  Есть возможность использовать любые статусы наличия, например,

-- если на "складе 1" товара нет, но на основном складе этот товар есть (или есть на складе 2), то в карточке на витрине будет показываться статус ожидание 1 день
-- если нигде товара нет, то в карточке - статус нет в наличии
-- если на выбранном складе товара менее Х штук, то статус - мало. (значение Х доступно для корректировки из админ-панели)

2. В модуле опенкарта реализована возможность добавлять/убирать склады и корректировать их настройки.  Чтобы работало обновление остатков из 1С, в настройках модуля требуется складам присвоить GUID из 1с.

3. Списание остатков производится в зависимости от способа доставки в заказе. Например, если выбрана курьерская доставка, то списание товара начнётся с основного склада, продолжится со склада 1 (при отсутствии на основном), далее со склада 2. Если в методе доставки заказа выбран самовывоз со склада 1 или со склада 2, то вначале списание произойдет с выбранного склада, затем с основного склада, и далее с последнего склада, где остались остатки. Приоритеты списания остатков настраиваются в админ-панели модуля.

img

Переход на https в opencart wordpress

Для wordpress

https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564

Для нулевых сайтов на opencart

Переход на https в opencart wordpress

Для wordpress https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564 Для нулевых сайтов на opencart
img

Переход на https в opencart wordpress

Для wordpress

https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564

Для нулевых сайтов на opencart

Переход на https в opencart wordpress

Для wordpress https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564 Для нулевых сайтов на opencart
img

Как наполнить opencart 2.3 fake-заказами

Подключиться к БД другого интернет-магазина и выкачать оттуда заказы с помощью запроса С помощью хранимой процедуры актуализируем заказы, на одну дату по пять заказов Если получились заказы из будущего, то запросом delete удаляем лишнии, в […]

Как наполнить opencart 2.3 fake-заказами

Подключиться к БД другого интернет-магазина и выкачать оттуда заказы с помощью запроса С помощью хранимой процедуры актуализируем заказы, на одну дату по пять заказов Если получились заказы из будущего, то запросом delete удаляем лишнии, в […]
img

Создание pdf с деталями заказа в письме клиенту. Opencart

Сделано в OPENCART 2.3. Скачать библиотеку, зайти в папку с ней через консоль команд и выполнить команды git clone https://github.com/dompdf/dompdf.git cd dompdf git clone https://github.com/PhenX/php-font-lib.git lib/php-font-lib cd lib/php-font-libgit checkout 0.5.1 cd .. git clone https://github.com/PhenX/php-svg-lib.git […]

Создание pdf с деталями заказа в письме клиенту. Opencart

Сделано в OPENCART 2.3. Скачать библиотеку, зайти в папку с ней через консоль команд и выполнить команды git clone https://github.com/dompdf/dompdf.git cd dompdf git clone https://github.com/PhenX/php-font-lib.git lib/php-font-lib cd lib/php-font-libgit checkout 0.5.1 cd .. git clone https://github.com/PhenX/php-svg-lib.git […]
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x