Jump to content

Как вывести список брендов с разбивкой по алфавиту.


Recommended Posts

Подскажите, как разбить большой список брендов по алфавиту.
Например, чтобы при нажитии на кнопку А, выводились бренды только на букву А, или на 123, только бренды, которые начинаются с цифр. Видел такое на множестве интернет-магазинов, но что-то не получилось.

И еще вопрос, как можно сделать вывод разбивки по первым буквам, например:

A
Armaini
...
B
Bosco
Bvlgari
...

Link to post
Share on other sites

Самый простой вариант - использовать 2 Джейквери-плагина: лист-меню и (блин, второй не помню, как называется :-) ) из той же серии...
Или заплатить немного денег тому, кто знает, как это делается...

Link to post
Share on other sites
  • 2 years later...

я делал для Симплы 2.3.6 от 14.07.14

Brands.php

	public function get_all_brands($filter = array())
	{
		$brands = array();
		$category_id_filter = '';
		$visible_filter = '';
		if(isset($filter['visible']))
			$visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible']));
		
		if(!empty($filter['category_id']))
			$category_id_filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id LEFT JOIN __products_categories pc ON p.id = pc.product_id WHERE pc.category_id in(?@) $visible_filter", (array)$filter['category_id']);

		// Выбираем все бренды
		$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
								 		FROM __brands b $category_id_filter ORDER BY b.name");
		$this->db->query($query);

		// return $this->db->results();
		$bnds = $this->db->results();

		foreach($bnds as $brnd){
			$first_letter = mb_strtoupper(substr($brnd->name, 0, 1));
			$otp[$first_letter][] = $brnd;
		}

		return $otp;
	}

 

в шаблоне где нужно вывести (в моем случае я выводил в шаблоне page)

{get_all_brands var=all_brands}

{if $all_brands}
	{foreach $all_brands as $kbrnds => $brnds}
	<h3>{$kbrnds}</h3>
	<ul class="all_brands">
		{foreach $brnds as $b}
			<li><a href="brands/{$b->url}">{$b->name}</a></li>
		{/foreach}
	</ul>
	{/foreach}
{/if}

 

Код писал на скорую, поэтому несуразные имена переменных, и кривосли аля накой черд я узал функцию чтобы вырезать первую букву хотя можно было сделать просто '$first = $str[0];'

 

и чтобы это дело работало в View.php
 

			$this->design->smarty->registerPlugin("function", "get_all_brands",              array($this, 'get_all_brands_plugin'));

	public function get_all_brands_plugin($params, &$smarty)
	{
		if(!isset($params['visible']))
			$params['visible'] = 1;
		if(!empty($params['var']))
			$smarty->assign($params['var'], $this->brands->get_all_brands($params));
	}

Link to post
Share on other sites
  • 8 months later...

Подниму тему — как начать вывод с A? а то в начале всякие цифры и скобки лезут...

Также русский алфАвит не работает...

Edited by Maksclub
Link to post
Share on other sites

Подниму тему — как начать вывод с A? а то в начале всякие цифры и скобки лезут...

Также русский алфАвит не работает...

 

а у вас есть цыфры в названиях?

 

по коду первые буквы бренда сохраняются. если у вас нет таких брендов, то не должно быть цыфр и скобок

		foreach($bnds as $brnd){
			$first_letter = mb_strtoupper(substr($brnd->name, 0, 1));
			$otp[$first_letter][] = $brnd;
		}
Link to post
Share on other sites

 

а у вас есть цыфры в названиях?

 

по коду первые буквы бренда сохраняются. если у вас нет таких брендов, то не должно быть цыфр и скобок

		foreach($bnds as $brnd){
			$first_letter = mb_strtoupper(substr($brnd->name, 0, 1));
			$otp[$first_letter][] = $brnd;
		}

 

Почему Вы решили, что там должны сохраняться непременно первые буквы?  С ходу видно, что  в коде используется substr...

Link to post
Share on other sites

Почему Вы решили, что там должны сохраняться непременно первые буквы?  С ходу видно, что  в коде используется substr...

 

видимо потому что substr с параметром 0,1.

Link to post
Share on other sites

видимо потому что substr с параметром 0,1.

А как насчет того, чтобы догадаться, что с русскими буквами это может давать ошибку? На нее довольно явно  указал maksclub. Тем более рядом в коде стоит подсказка mb_strtoupper...

Link to post
Share on other sites

Попробуйте mb_substr

 

...........

Или даже так

$first_letter = mb_strtoupper(preg_replace('/^([^\w]*)([\w]{1}).*$/ui', '$2', $brnd->name));

Это разрешит только буквы и цифры

Edited by yr4ik
Link to post
Share on other sites

 

а у вас есть цыфры в названиях?

 

по коду первые буквы бренда сохраняются. если у вас нет таких брендов, то не должно быть цыфр и скобок

		

 

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

Link to post
Share on other sites
  • 2 years later...

У меня есть рабочий вариант, но в нем сначала идут цифры, потом английский алфавит, а потом русский

Если не сложно, поделитесь..

Я тоже такую страничку хочу вывести.

Link to post
Share on other sites
  • 3 years later...
  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...