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

Добавление категорий в строку поиска

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

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

ак вот мне необходимо, что бы строка поиска выглядела как строка ниже. т.е. Сама строка, категории к ней и соответственно кнопка поиска. Полазив в коде я попытался просто скопировать поля из файла catalog/view/theme/default/template/product/search.tpl в файл catalog/view/theme/default/template/common/search.tpl одкако куча нотисов спустила меня с небес на землю. Так же я попробовал вариант залить код в header.tpl, но и здесь меня постигла неудача: нотисов не было, но значение в выпадающем списке не сохранялось. Вдоволь поиздевавшись над шаболном я решил обратиться на форум, ибо побоялся, что запилю какой нить костыль, будет он работать через задницу, а пользы не принесёт.

Расскажите как правильнее всего будет реализовать мою задачу, желательно без использования модулей, в крайнем случае что бы модуль был бесплатным...

post-710945-0-19926800-1472467883_thumb.jpg

Версия ocStore-2.1.0.2.1

Изменено пользователем Undertaker

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


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

Смотрите как реализован вывод категорий на странице поиска.

Открываете контроллер и изучаете как формируется массив $data['categories']

catalog/controller/product/search.php

 

Реализуете вывод такого массива в шаблоне шапки в виде списка, в контроллере например создайте $data['categories_search']

catalog/controller/common/header.php

 

и не забываете, что при нажатии на кнопку поиска (из шапки) нужно передать еще 2 параметра

category_id=*id выбранной категории*

sub_category=true

Изменено пользователем thentru
  • +1 1

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


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

Смотрите как реализован вывод категорий на странице поиска.

Открываете контроллер и изучаете как формируется массив $data['categories']

catalog/controller/product/search.php

 

Реализуете вывод такого массива в шаблоне шапки в виде списка, в контроллере например создайте $data['categories_search']

catalog/controller/common/header.php

 

и не забываете, что при нажатии на кнопку поиска (из шапки) нужно передать еще 2 параметра

category_id=*id выбранной категории*

sub_category=true

Ох не знаю повторю ли снова, но всё вышло очень даже отлично. Спасибо Вам большое...

Я обшерстил google но так и не нашёл ответа на свой вопрос, а потому выкладываю тот код что сделал я, по инструкции thentru. Может кому и пригодится.

Для начала из файла catalog/controller/product/search.php я скопировал код

		// 3 Level Category Search
		$data['categories'] = array();

		$categories_1 = $this->model_catalog_category->getCategories(0);

		foreach ($categories_1 as $category_1) {
			$level_2_data = array();

			$categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']);

			foreach ($categories_2 as $category_2) {
				$level_3_data = array();

				$categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']);

				foreach ($categories_3 as $category_3) {
					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name'        => $category_3['name'],
					);
				}

				$level_2_data[] = array(
					'category_id' => $category_2['category_id'],
					'name'        => $category_2['name'],
					'children'    => $level_3_data
				);
			}

			$data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'        => $category_1['name'],
				'children'    => $level_2_data
			);
		}

Код я вставил в файл catalog/controller/common/search.php немного дописав вывод

    		// 3 Level Category Search
		$data['categories'] = array();

		$categories_1 = $this->model_catalog_category->getCategories(0);

		foreach ($categories_1 as $category_1) {
			$level_2_data = array();

			$categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']);

			foreach ($categories_2 as $category_2) {
				$level_3_data = array();

				$categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']);

				foreach ($categories_3 as $category_3) {
					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name'        => $category_3['name'],
					);
				}

				$level_2_data[] = array(
					'category_id' => $category_2['category_id'],
					'name'        => $category_2['name'],
					'children'    => $level_3_data
				);
			}

			$data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'        => $category_1['name'],
				'children'    => $level_2_data
			);
		}
    
    if (isset($this->request->get['category_id'])) {
			$data['category_id'] = $this->request->get['category_id'];
		} else {
			$data['category_id'] = '0';
		}

Следующим этапом я выдернул <select> из файла catalog/view/theme/default/template/product/search.tpl и вставил его в файл catalog/view/theme/default/template/common/search.tpl добавив для него id

 

            <select id="category_id" name="category_id" class="form-control">
            <?php foreach ($categories as $category_1) { ?>
            <?php if ($category_1['category_id'] == $category_id) { ?>
            <option value="<?php echo $category_1['category_id']; ?>" selected="selected"><?php echo $category_1['name']; ?></option>
            <?php } else { ?>
            <option value="<?php echo $category_1['category_id']; ?>"><?php echo $category_1['name']; ?></option>
            <?php } ?>
            <?php foreach ($category_1['children'] as $category_2) { ?>
            <?php if ($category_2['category_id'] == $category_id) { ?>
            <option value="<?php echo $category_2['category_id']; ?>" selected="selected">      <?php echo $category_2['name']; ?></option>
            <?php } else { ?>
            <option value="<?php echo $category_2['category_id']; ?>">      <?php echo $category_2['name']; ?></option>
            <?php } ?>
            <?php foreach ($category_2['children'] as $category_3) { ?>
            <?php if ($category_3['category_id'] == $category_id) { ?>
            <option value="<?php echo $category_3['category_id']; ?>" selected="selected">            <?php echo $category_3['name']; ?></option>
            <?php } else { ?>
            <option value="<?php echo $category_3['category_id']; ?>">            <?php echo $category_3['name']; ?></option>
            <?php } ?>
            <?php } ?>
            <?php } ?>
            <?php } ?>
          </select>

И разумеется не забыл добавить в файл catalog/view/javascript/common.js код для передачи ещё 2-х параметров

	/* Search */
	$('#search input[name=\'search\']').parent().find('button').on('click', function() {
		url = $('base').attr('href') + 'index.php?route=product/search';

		var value = $('input[name=\'search\']').val();
		var kat = $('#search #category_id option:selected').text();
		var category_id = $("#search #category_id").val();
		
		
		if (value) {
			url += '&search=' + encodeURIComponent(value);
		}
		
		if (category_id) {
			url += '&category_id=' + encodeURIComponent(category_id);
			url += '&sub_category=true';
		}

		location = url;
	});

Спасибо Вам огромное, thentru. Своим бы умом я не допёр бы до данных действий

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


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

делаю по инструкции, но не получается. поиск пропадает. шаблон дефолтный.

можете ткнуть куда вставить ваш код, а еще лучше скинуть уже модифицированные файлы 

catalog/view/javascript/common.js

catalog/view/theme/default/template/common/search.tpl 

 catalog/controller/common/search.php

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


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

lдобился того, что поиск появился на странице + дополнительное окно категорий появилось, но не выводятся категории.

 

вот содержмое моих файлы:

 

catalog/controller/common/search.php

<?php
class ControllerCommonSearch extends Controller {
	public function index() {
		$this->load->language('common/search');

		$data['text_search'] = $this->language->get('text_search');

		if (isset($this->request->get['search'])) {
			$data['search'] = $this->request->get['search'];
		} else {
			$data['search'] = '';
		}

		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/search.tpl')) {
			return $this->load->view($this->config->get('config_template') . '/template/common/search.tpl', $data);
		} else {
			return $this->load->view('default/template/common/search.tpl', $data);
		}
		
		
		// 3 Level Category Search
		$data['categories'] = array();
 
		$categories_1 = $this->model_catalog_category->getCategories(0);
 
		foreach ($categories_1 as $category_1) {
			$level_2_data = array();
 
			$categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']);
 
			foreach ($categories_2 as $category_2) {
				$level_3_data = array();
 
				$categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']);
 
				foreach ($categories_3 as $category_3) {
					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name'        => $category_3['name'],
					);
				}
 
				$level_2_data[] = array(
					'category_id' => $category_2['category_id'],
					'name'        => $category_2['name'],
					'children'    => $level_3_data
				);
			}
 
			$data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'        => $category_1['name'],
				'children'    => $level_2_data
			);
		}
    
    if (isset($this->request->get['category_id'])) {
			$data['category_id'] = $this->request->get['category_id'];
		} else {
			$data['category_id'] = '0';
		}
		
	}
}

catalog/view/theme/default/template/common/search.tpl 

<div id="search" class="input-group">
  <input type="text" name="search" value="<?php echo $search; ?>" placeholder="<?php echo $text_search; ?>" class="form-control input-lg" />
  <span class="input-group-btn">
    <button type="button" class="btn btn-default btn-lg"><img src="image/search icon.png"></button>

  </span>
 
<select id="category_id" name="category_id" class="form-control">
            <?php foreach ($categories as $category_1) { ?>
            <?php if ($category_1['category_id'] == $category_id) { ?>
            <option value="<?php echo $category_1['category_id']; ?>" selected="selected"><?php echo $category_1['name']; ?></option>
            <?php } else { ?>
            <option value="<?php echo $category_1['category_id']; ?>"><?php echo $category_1['name']; ?></option>
            <?php } ?>
            <?php foreach ($category_1['children'] as $category_2) { ?>
            <?php if ($category_2['category_id'] == $category_id) { ?>
            <option value="<?php echo $category_2['category_id']; ?>" selected="selected">      <?php echo $category_2['name']; ?></option>
            <?php } else { ?>
            <option value="<?php echo $category_2['category_id']; ?>">      <?php echo $category_2['name']; ?></option>
            <?php } ?>
            <?php foreach ($category_2['children'] as $category_3) { ?>
            <?php if ($category_3['category_id'] == $category_id) { ?>
            <option value="<?php echo $category_3['category_id']; ?>" selected="selected">            <?php echo $category_3['name']; ?></option>
            <?php } else { ?>
            <option value="<?php echo $category_3['category_id']; ?>">            <?php echo $category_3['name']; ?></option>
            <?php } ?>
            <?php } ?>
            <?php } ?>
            <?php } ?>
          </select>
  
</div> 
    

catalog/view/javascript/common.js

function getURLVar(key) {
	var value = [];

	var query = String(document.location).split('?');

	if (query[1]) {
		var part = query[1].split('&');

		for (i = 0; i < part.length; i++) {
			var data = part[i].split('=');

			if (data[0] && data[1]) {
				value[data[0]] = data[1];
			}
		}

		if (value[key]) {
			return value[key];
		} else {
			return '';
		}
	}
}

$(document).ready(function() {
	// Highlight any found errors
	$('.text-danger').each(function() {
		var element = $(this).parent().parent();

		if (element.hasClass('form-group')) {
			element.addClass('has-error');
		}
	});

	// Currency
	$('#currency .currency-select').on('click', function(e) {
		e.preventDefault();

		$('#currency input[name=\'code\']').attr('value', $(this).attr('name'));

		$('#currency').submit();
	});

	// Language
	$('#language a').on('click', function(e) {
		e.preventDefault();

		$('#language input[name=\'code\']').attr('value', $(this).attr('href'));

		$('#language').submit();
	});

	/* Search */
	$('#search input[name=\'search\']').parent().find('button').on('click', function() {
		url = $('base').attr('href') + 'index.php?route=product/search';

		var value = $('header input[name=\'search\']').val();

		if (value) {
			url += '&search=' + encodeURIComponent(value);
		}

		location = url;
	});

	$('#search input[name=\'search\']').on('keydown', function(e) {
		if (e.keyCode == 13) {
			$('header input[name=\'search\']').parent().find('button').trigger('click');
		}
	});

	// Menu
	$('#menu .dropdown-menu').each(function() {
		var menu = $('#menu').offset();
		var dropdown = $(this).parent().offset();

		var i = (dropdown.left + $(this).outerWidth()) - (menu.left + $('#menu').outerWidth());

		if (i > 0) {
			$(this).css('margin-left', '-' + (i + 5) + 'px');
		}
	});

	// Product List
	$('#list-view').click(function() {
		$('#content .product-grid > .clearfix').remove();

		//$('#content .product-layout').attr('class', 'product-layout product-list col-xs-12');
		$('#content .row > .product-grid').attr('class', 'product-layout product-list col-xs-12');

		localStorage.setItem('display', 'list');
	});

	// Product Grid
	$('#grid-view').click(function() {
		// What a shame bootstrap does not take into account dynamically loaded columns
		cols = $('#column-right, #column-left').length;

		if (cols == 2) {
			$('#content .product-list').attr('class', 'product-layout product-grid col-lg-6 col-md-6 col-sm-12 col-xs-12');
		} else if (cols == 1) {
			$('#content .product-list').attr('class', 'product-layout product-grid col-lg-4 col-md-4 col-sm-6 col-xs-12');
		} else {
			$('#content .product-list').attr('class', 'product-layout product-grid col-lg-3 col-md-3 col-sm-6 col-xs-12');
		}

		 localStorage.setItem('display', 'grid');
	});

	if (localStorage.getItem('display') == 'list') {
		$('#list-view').trigger('click');
	} else {
		$('#grid-view').trigger('click');
	}

	// Checkout
	$(document).on('keydown', '#collapse-checkout-option input[name=\'email\'], #collapse-checkout-option input[name=\'password\']', function(e) {
		if (e.keyCode == 13) {
			$('#collapse-checkout-option #button-login').trigger('click');
		}
	});

	// tooltips on hover
	$('[data-toggle=\'tooltip\']').tooltip({container: 'body',trigger: 'hover'});

	// Makes tooltips work on ajax generated content
	$(document).ajaxStop(function() {
		$('[data-toggle=\'tooltip\']').tooltip({container: 'body'});
	});
});

// Cart add remove functions
var cart = {
	'add': function(product_id, quantity) {
		$.ajax({
			url: 'index.php?route=checkout/cart/add',
			type: 'post',
			data: 'product_id=' + product_id + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1),
			dataType: 'json',
			beforeSend: function() {
				$('#cart > button').button('loading');
			},
			complete: function() {
				$('#cart > button').button('reset');
			},
			success: function(json) {
				$('.alert, .text-danger').remove();

				if (json['redirect']) {
					location = json['redirect'];
				}

				if (json['success']) {
					$('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>');

					// Need to set timeout otherwise it wont update the total
					setTimeout(function () {
						$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
					}, 100);

					$('html, body').animate({ scrollTop: 0 }, 'slow');

					$('#cart > ul').load('index.php?route=common/cart/info ul li');
				}
			},
	        error: function(xhr, ajaxOptions, thrownError) {
	            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
	        }
		});
	},
	'update': function(key, quantity) {
		$.ajax({
			url: 'index.php?route=checkout/cart/edit',
			type: 'post',
			data: 'key=' + key + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1),
			dataType: 'json',
			beforeSend: function() {
				$('#cart > button').button('loading');
			},
			complete: function() {
				$('#cart > button').button('reset');
			},
			success: function(json) {
				// Need to set timeout otherwise it wont update the total
				setTimeout(function () {
					$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
				}, 100);

				if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
					location = 'index.php?route=checkout/cart';
				} else {
					$('#cart > ul').load('index.php?route=common/cart/info ul li');
				}
			},
	        error: function(xhr, ajaxOptions, thrownError) {
	            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
	        }
		});
	},
	'remove': function(key) {
		$.ajax({
			url: 'index.php?route=checkout/cart/remove',
			type: 'post',
			data: 'key=' + key,
			dataType: 'json',
			beforeSend: function() {
				$('#cart > button').button('loading');
			},
			complete: function() {
				$('#cart > button').button('reset');
			},
			success: function(json) {
				// Need to set timeout otherwise it wont update the total
				setTimeout(function () {
					$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
				}, 100);

				if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
					location = 'index.php?route=checkout/cart';
				} else {
					$('#cart > ul').load('index.php?route=common/cart/info ul li');
				}
			},
	        error: function(xhr, ajaxOptions, thrownError) {
	            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
	        }
		});
	}
}

var voucher = {
	'add': function() {

	},
	'remove': function(key) {
		$.ajax({
			url: 'index.php?route=checkout/cart/remove',
			type: 'post',
			data: 'key=' + key,
			dataType: 'json',
			beforeSend: function() {
				$('#cart > button').button('loading');
			},
			complete: function() {
				$('#cart > button').button('reset');
			},
			success: function(json) {
				// Need to set timeout otherwise it wont update the total
				setTimeout(function () {
					$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
				}, 100);

				if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
					location = 'index.php?route=checkout/cart';
				} else {
					$('#cart > ul').load('index.php?route=common/cart/info ul li');
				}
			},
	        error: function(xhr, ajaxOptions, thrownError) {
	            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
	        }
		});
	}
}

var wishlist = {
	'add': function(product_id) {
		$.ajax({
			url: 'index.php?route=account/wishlist/add',
			type: 'post',
			data: 'product_id=' + product_id,
			dataType: 'json',
			success: function(json) {
				$('.alert').remove();

				if (json['redirect']) {
					location = json['redirect'];
				}

				if (json['success']) {
					$('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>');
				}

				$('#wishlist-total span').html(json['total']);
				$('#wishlist-total').attr('title', json['total']);

				$('html, body').animate({ scrollTop: 0 }, 'slow');
			},
	        error: function(xhr, ajaxOptions, thrownError) {
	            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
	        }
		});
	},
	'remove': function() {

	}
}

var compare = {
	'add': function(product_id) {
		$.ajax({
			url: 'index.php?route=product/compare/add',
			type: 'post',
			data: 'product_id=' + product_id,
			dataType: 'json',
			success: function(json) {
				$('.alert').remove();

				if (json['success']) {
					$('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>');

					$('#compare-total').html(json['total']);

					$('html, body').animate({ scrollTop: 0 }, 'slow');
				}
			},
	        error: function(xhr, ajaxOptions, thrownError) {
	            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
	        }
		});
	},
	'remove': function() {

	}
}

/* Agree to Terms */
$(document).delegate('.agree', 'click', function(e) {
	e.preventDefault();

	$('#modal-agree').remove();

	var element = this;

	$.ajax({
		url: $(element).attr('href'),
		type: 'get',
		dataType: 'html',
		success: function(data) {
			html  = '<div id="modal-agree" class="modal">';
			html += '  <div class="modal-dialog">';
			html += '    <div class="modal-content">';
			html += '      <div class="modal-header">';
			html += '        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>';
			html += '        <h4 class="modal-title">' + $(element).text() + '</h4>';
			html += '      </div>';
			html += '      <div class="modal-body">' + data + '</div>';
			html += '    </div';
			html += '  </div>';
			html += '</div>';

			$('body').append(html);

			$('#modal-agree').modal('show');
		}
	});
});

/* Search */
	$('#search input[name=\'search\']').parent().find('button').on('click', function() {
		url = $('base').attr('href') + 'index.php?route=product/search';
 
		var value = $('input[name=\'search\']').val();
		var kat = $('#search #category_id option:selected').text();
		var category_id = $("#search #category_id").val();
		
		
		if (value) {
			url += '&search=' + encodeURIComponent(value);
		}
		
		if (category_id) {
			url += '&category_id=' + encodeURIComponent(category_id);
			url += '&sub_category=true';
		}
 
		location = url;
	});





// Autocomplete */
(function($) {
	$.fn.autocomplete = function(option) {
		return this.each(function() {
			this.timer = null;
			this.items = new Array();

			$.extend(this, option);

			$(this).attr('autocomplete', 'off');

			// Focus
			$(this).on('focus', function() {
				this.request();
			});

			// Blur
			$(this).on('blur', function() {
				setTimeout(function(object) {
					object.hide();
				}, 200, this);
			});

			// Keydown
			$(this).on('keydown', function(event) {
				switch(event.keyCode) {
					case 27: // escape
						this.hide();
						break;
					default:
						this.request();
						break;
				}
			});

			// Click
			this.click = function(event) {
				event.preventDefault();

				value = $(event.target).parent().attr('data-value');

				if (value && this.items[value]) {
					this.select(this.items[value]);
				}
			}

			// Show
			this.show = function() {
				var pos = $(this).position();

				$(this).siblings('ul.dropdown-menu').css({
					top: pos.top + $(this).outerHeight(),
					left: pos.left
				});

				$(this).siblings('ul.dropdown-menu').show();
			}

			// Hide
			this.hide = function() {
				$(this).siblings('ul.dropdown-menu').hide();
			}

			// Request
			this.request = function() {
				clearTimeout(this.timer);

				this.timer = setTimeout(function(object) {
					object.source($(object).val(), $.proxy(object.response, object));
				}, 200, this);
			}

			// Response
			this.response = function(json) {
				html = '';

				if (json.length) {
					for (i = 0; i < json.length; i++) {
						this.items[json[i]['value']] = json[i];
					}

					for (i = 0; i < json.length; i++) {
						if (!json[i]['category']) {
							html += '<li data-value="' + json[i]['value'] + '"><a href="#">' + json[i]['label'] + '</a></li>';
						}
					}

					// Get all the ones with a categories
					var category = new Array();

					for (i = 0; i < json.length; i++) {
						if (json[i]['category']) {
							if (!category[json[i]['category']]) {
								category[json[i]['category']] = new Array();
								category[json[i]['category']]['name'] = json[i]['category'];
								category[json[i]['category']]['item'] = new Array();
							}

							category[json[i]['category']]['item'].push(json[i]);
						}
					}

					for (i in category) {
						html += '<li class="dropdown-header">' + category[i]['name'] + '</li>';

						for (j = 0; j < category[i]['item'].length; j++) {
							html += '<li data-value="' + category[i]['item'][j]['value'] + '"><a href="#">   ' + category[i]['item'][j]['label'] + '</a></li>';
						}
					}
				}

				if (html) {
					this.show();
				} else {
					this.hide();
				}

				$(this).siblings('ul.dropdown-menu').html(html);
			}

			$(this).after('<ul class="dropdown-menu"></ul>');
			$(this).siblings('ul.dropdown-menu').delegate('a', 'click', $.proxy(this.click, this));

		});
	}
})(window.jQuery);



в чем может быть дело?

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


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

+ такая ошибка:

 

 

 

 
            Notice: Undefined variable: categories in /var/www/u0225273/public_html/jou-jou.ru/MaxTsurka/catalog/view/theme/JUO/template/common/search.tpl on line 14Warning: Invalid argument supplied for foreach() in /var/www/u0225273/public_html/jou-jou.ru/MaxTsurka/catalog/view/theme/JUO/template/common/search.tpl on line 14          

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


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

+ такая ошибка:

 

подключить модель категорий

$this->load->model('catalog/category');

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


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

 

подключить модель категорий

$this->load->model('catalog/category');

необходимо добавить в файл template/common/search.tpl ?

в какое именно место, я извиняюсь, но у меня минимальный опыт работы с опенкартом

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


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

необходимо добавить в файл template/common/search.tpl ?

в какое именно место, я извиняюсь, но у меня минимальный опыт работы с опенкартом

 

в

catalog/controller/common/search.php

 

сначала подключить модель

потом получить категории

затем собрать массив категорий

 

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

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/search.tpl')) {

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


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

не получается, ничего не изменилось.

все ли верно?

<?php
class ControllerCommonSearch extends Controller {
	public function index() {
		$this->load->language('common/search');

		$data['text_search'] = $this->language->get('text_search');

		if (isset($this->request->get['search'])) {
			$data['search'] = $this->request->get['search'];
		} else {
			$data['search'] = '';
		}
		
		$this->load->model('catalog/category');

		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/search.tpl')) {
			return $this->load->view($this->config->get('config_template') . '/template/common/search.tpl', $data);
		} else {
			return $this->load->view('default/template/common/search.tpl', $data);
		}
		
		
		// 3 Level Category Search
		$data['categories'] = array();
 
		$categories_1 = $this->model_catalog_category->getCategories(0);
 
		foreach ($categories_1 as $category_1) {
			$level_2_data = array();
 
			$categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']);
 
			foreach ($categories_2 as $category_2) {
				$level_3_data = array();
 
				$categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']);
 
				foreach ($categories_3 as $category_3) {
					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name'        => $category_3['name'],
					);
				}
 
				$level_2_data[] = array(
					'category_id' => $category_2['category_id'],
					'name'        => $category_2['name'],
					'children'    => $level_3_data
				);
			}
 
			$data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'        => $category_1['name'],
				'children'    => $level_2_data
			);
		}
    
    if (isset($this->request->get['category_id'])) {
			$data['category_id'] = $this->request->get['category_id'];
		} else {
			$data['category_id'] = '0';
		}
		
	}
}

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


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

Отделаться простым копипастом из темы не удалось конечно же. Я решил данную проблему как и сказал Thentru.

из catalog\controller\product\search.php скопировал:

$categories_1 = $this->model_catalog_category->getCategories(0);
		
		foreach ($categories_1 as $category_1) {
			$level_2_data = array();
			
			$categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']);
			
			foreach ($categories_2 as $category_2) {
				$level_3_data = array();
				
				$categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']);
				
				foreach ($categories_3 as $category_3) {
					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name'        => $category_3['name'],
					);
				}
				
				$level_2_data[] = array(
					'category_id' => $category_2['category_id'],	
					'name'        => $category_2['name'],
					'children'    => $level_3_data
				);					
			}
			
			$this->data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'        => $category_1['name'],
				'children'    => $level_2_data
			);
		}

нашел блок кода // Search и заменил чуть чуть подправив \catalog\controller\common\header.php :

// Search	
		
		$this->load->model('catalog/category');
		
		$this->load->model('catalog/product');
		
		$this->data['categories'] = array();
					
		$categories_1 = $this->model_catalog_category->getCategories(0);
		
		foreach ($categories_1 as $category_1) {
			$level_2_data = array();
			
			$categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']);
			
			foreach ($categories_2 as $category_2) {
				$level_3_data = array();
				
				$categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']);
				
				foreach ($categories_3 as $category_3) {
					$level_3_data[] = array(
						'category_id' => $category_3['category_id'],
						'name'        => $category_3['name'],
					);
				}
				
				$level_2_data[] = array(
					'category_id' => $category_2['category_id'],	
					'name'        => $category_2['name'],
					'children'    => $level_3_data
				);					
			}
			
			$this->data['categories'][] = array(
				'category_id' => $category_1['category_id'],
				'name'        => $category_1['name'],
				'children'    => $level_2_data
			);
		}
		
		if (isset($this->request->get['search']) || isset($this->request->get['filter_tag'])) {
			$data = array(
				'filter_name'         => $search, 
				'filter_tag'          => $tag, 
				'filter_description'  => $description,
				'filter_category_id'  => $category_id, 
				'filter_sub_category' => $sub_category, 
			);
		}
		else {
			$this->data['search'] = '';
		}
// Menu

Далее из catalog\view\theme\default\template\product\search.tpl скопировал

<select name="filter_category_id" id="category_id">
        <option value="0"><?php echo $text_category; ?></option>
        <?php foreach ($categories as $category_1) { ?>
        <?php if ($category_1['category_id'] == $filter_category_id) { ?>
        <option value="<?php echo $category_1['category_id']; ?>" selected="selected"><?php echo $category_1['name']; ?></option>
        <?php } else { ?>
        <option value="<?php echo $category_1['category_id']; ?>"><?php echo $category_1['name']; ?></option>
        <?php } ?>
        <?php foreach ($category_1['children'] as $category_2) { ?>
        <?php if ($category_2['category_id'] == $filter_category_id) { ?>
        <option value="<?php echo $category_2['category_id']; ?>" selected="selected">      <?php echo $category_2['name']; ?></option>
        <?php } else { ?>
        <option value="<?php echo $category_2['category_id']; ?>">      <?php echo $category_2['name']; ?></option>
        <?php } ?>
        <?php foreach ($category_2['children'] as $category_3) { ?>
        <?php if ($category_3['category_id'] == $filter_category_id) { ?>
        <option value="<?php echo $category_3['category_id']; ?>" selected="selected">            <?php echo $category_3['name']; ?></option>
        <?php } else { ?>
        <option value="<?php echo $category_3['category_id']; ?>">            <?php echo $category_3['name']; ?></option>
        <?php } ?>
        <?php } ?>
        <?php } ?>
        <?php } ?>
      </select> 

Вставил в catalog\view\theme\default\template\common\header.tpl сразу после 

<input type="text" name="search" placeholder="<?php echo $text_search; ?>" value="<?php echo $search; ?>" />

в \catalog\view\javascript\common.js находим /*Search*/

и заменяем стандартный 

	/* Search */
	$('.button-search').bind('click', function() {
		url = $('base').attr('href') + 'index.php?route=product/search';
				 
		var search = $('input[name=\'search\']').attr('value');
		
		if (search) {
			url += '&search=' + encodeURIComponent(search);
		}
		
		location = url;
	});
	
	$('#header input[name=\'search\']').bind('keydown', function(e) {
		if (e.keyCode == 13) {
			url = $('base').attr('href') + 'index.php?route=product/search';
			 
			var search = $('input[name=\'search\']').attr('value');
			
			if (search) {
				url += '&search=' + encodeURIComponent(search);
			}
			
			location = url;
		}
	});
	

на

/* Search */
	$('.button-search').bind('click', function() {
		url = $('base').attr('href') + 'index.php?route=product/search';
				 
		var search = $('input[name=\'search\']').attr('value');
		var category_id = $("#search #category_id").attr('value');
		
		if (search) {
			url += '&search=' + encodeURIComponent(search);
		}
		if (category_id) {
			url += '&category_id=' + encodeURIComponent(category_id);
			url += '&sub_category=true';
		}
		location = url;
	});
	
	$('#header input[name=\'search\']').bind('keydown', function(e) {
		if (e.keyCode == 13) {
			url = $('base').attr('href') + 'index.php?route=product/search';
			 
			var search = $('input[name=\'search\']').attr('value');
			var category_id = $("#search #category_id").attr('value');
			
			if (search) {
				url += '&search=' + encodeURIComponent(search);
			}
			if (category_id) {
			url += '&category_id=' + encodeURIComponent(category_id);
			url += '&sub_category=true';
		}
			location = url;
		}
	});
	

Ну и как говорится Категории в шапке выдает и параметры при поиске передает. Спасибо огромное thentru и Undertaker.

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


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

Смотрите как реализован вывод категорий на странице поиска.

Открываете контроллер и изучаете как формируется массив $data['categories']

catalog/controller/product/search.php

 

Реализуете вывод такого массива в шаблоне шапки в виде списка, в контроллере например создайте $data['categories_search']

catalog/controller/common/header.php

 

и не забываете, что при нажатии на кнопку поиска (из шапки) нужно передать еще 2 параметра

category_id=*id выбранной категории*

sub_category=true

Возникла проблема с сохранением выбранной категории после перезагрузки страницы. Форма Select обновляется и выбранная категория не сохраняется. Подскажите пожалуйста в чем проблема.

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


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

Та же фигня была с обнулением селекта в хедере. Решается добавлением вот такого кода в common/search.php

 


		if (isset($this->request->get['category_id'])) {
			$data['category_id'] = $this->request->get['category_id'];
		} else {
			$data['category_id'] = 0;
		}

 

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


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

Здравствуйте, прошу помочь с данным вопросом. Версия опенкарт 3.0.2 тема дефолтная.

Описанный способ не работает, выводится селект категорий но он пустой. Видимо вариант описанный выше подходит для более ранних версий опенкарт.

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


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

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

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

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

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

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

Войти

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

Войти

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

    • От spectre
      300.00 руб
      Скачать/Купить дополнение


      Скрытие категорий от групп покупателей Hide Categories From Customer Groups 2.1-2.3.x
      ЧЕРНАЯ ПЯТНИЦА! ВСЕ ДОПОЛНЕНИЯ ПО 300!
       
      Модуль позволяет скрыть категории товаров и товары которые в них находятся от некоторых групп покупателей путем установки галочки напротив группы покупателей в настройках категории (на скриншоте)
       
      Примеры использования: 
      - Оптовые категории и и товары в них и розничные, которые не пересекаются
      - "Временные категории" для обработки прайсов, недооформленных товаров и тп
      - Переучет в какой-либо категории
      - и многое другое
       
       
      Версия для 2.3.x и 2.1.х
       
      Кому нужно - могу дать потрогать демо
       
      Адаптация под версии линейки 2.х - бесплатная после покупки
       
       
      ОЧЕНЬ ВАЖНО!!!
      Модуль использует стандартный функционал и изменяет стандартные модели категории и товара для определения доступа
       
      Если у вас какой-то модуль супермегаменю или суперстена категорий, который использует свои модели, отличающиеся от "родных" - адаптация недорогая но платная
       
      Под популярные шаблоны - >300 покупок на форуме - адаптация бесплатная, под остальные - недорого, пишите в лс
       
      Уточняйте эти моменты ДО покупки!
       
       
      Имеются патчи под шаблоны:
      1. Newstore
      2. To be continued
       
      Лицензия - 1 домен
       
      Какие-то вопросы - пишите в личку, разберемся
       
      Добавил spectre Добавлено 21.06.2018 Категория Модули Системные требования Сайт разработчика https://freelancer.od.ua Старая цена 800 Метод активации Автоматическая активация Ioncube Loader Нет OpenCart 2.3 ocStore 2.3 OpenCart.Pro, ocShop Opencart.pro 2.3  
    • От spectre
      ЧЕРНАЯ ПЯТНИЦА! ВСЕ ДОПОЛНЕНИЯ ПО 300!
       
      Модуль позволяет скрыть категории товаров и товары которые в них находятся от некоторых групп покупателей путем установки галочки напротив группы покупателей в настройках категории (на скриншоте)
       
      Примеры использования: 
      - Оптовые категории и и товары в них и розничные, которые не пересекаются
      - "Временные категории" для обработки прайсов, недооформленных товаров и тп
      - Переучет в какой-либо категории
      - и многое другое
       
       
      Версия для 2.3.x и 2.1.х
       
      Кому нужно - могу дать потрогать демо
       
      Адаптация под версии линейки 2.х - бесплатная после покупки
       
       
      ОЧЕНЬ ВАЖНО!!!
      Модуль использует стандартный функционал и изменяет стандартные модели категории и товара для определения доступа
       
      Если у вас какой-то модуль супермегаменю или суперстена категорий, который использует свои модели, отличающиеся от "родных" - адаптация недорогая но платная
       
      Под популярные шаблоны - >300 покупок на форуме - адаптация бесплатная, под остальные - недорого, пишите в лс
       
      Уточняйте эти моменты ДО покупки!
       
       
      Имеются патчи под шаблоны:
      1. Newstore
      2. To be continued
       
      Лицензия - 1 домен
       
      Какие-то вопросы - пишите в личку, разберемся
       
    • От Pavel666
      Скачать/Купить дополнение


      Блок поиска
      Встраиваемый в схемы ajax  блок поиска, ну в принципе на фото все видно, поиск используется стандартный от опенкарт.
      Со стилями как можно заметить сильно не заморачивался 
      В админке можно поменять все стили на свои.
      Добавил Pavel666 Добавлено 15.11.2018 Категория Поиск Системные требования Сайт разработчика Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3 ocStore 2.3 OpenCart.Pro, ocShop Opencart.pro 2.3  
    • От Pavel666
      Встраиваемый в схемы ajax  блок поиска, ну в принципе на фото все видно, поиск используется стандартный от опенкарт.
      Со стилями как можно заметить сильно не заморачивался 
      В админке можно поменять все стили на свои.
    • От alexandrkrot1993
      Переглянути файл


      Мини галерея для товара в категории товаров
      Модификатор изменяет блок с товаром в Категории.
      Добавляет миникартинки товаров .
      При наведении на миникартинки, меняется главня.
      ДЕМО
      По всем вопросам обращайтесь в лс помогу адаптировать под вашу тему


      Совместимось OC- 2.0.3.1, 2.1.0.2, 2.2.0, 2.3.0.2.3

      Автор alexandrkrot1993 долучення 08.07.18 Категорія Меню, дизайн, внешний вид Системные требования Сайт разработчика https://pechenki.top Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1 ocStore 2.3
      2.2
      2.1 OpenCart.Pro, ocShop Не проверялось  
  • Последние посетители   0 пользователей онлайн

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

×

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

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