Файл search.tpl

Данный файл отвечает за отображение поиска по Интернет-магазину

В базовом шаблоне он имеет следующую структуру:

  1 {# Variables
  2 # @var products
  3 # @var totalProducts
  4 # @var brandsInSearchResult
  5 # @var pagination
  6 # @var tree
  7 #}
  8 
  9 {# Display sidebar.tpl #}
 10 {include_tpl ('sidebar')}
 11 
 12 <div class="products_list">
 13 
 14       <div id="titleExt">
 15         <h5 class="left">Поиск</h5>
 16         <div class="right">
 17             Найдено {$totalProducts} {echo SStringHelper::Pluralize($totalProducts, array('продукт','продукта','продуктов'))}
 18             <!-- BEGIN FILTER BOX -->
 19                 <a href="#" onclick="$('#filterBox').toggle();return false;">Изменить параметры ↓</a>
 20                 <div id="filterBox">
 21                 <form method="get" action="">
 22                     {if !empty(ShopCore::$_GET['text'])}
 23                         <input type="hidden" value="{encode(ShopCore::$_GET['text'])}" name="text" />
 24                     {/if}
 25 
 26                     <div class="fieldName">Сортировка:</div>
 27                     <div class="field">
 28                         <select name="order">
 29                             <option>-</option>
 30                             <option {if ShopCore::$_GET['order']=='price'}selected{/if} value="price">Возрастанию цены</option>
 31                             <option {if ShopCore::$_GET['order']=='price_desc'}selected{/if} value="price_desc">Убыванию цены</option>
 32                             <option {if ShopCore::$_GET['order']=='name'}selected{/if} value="name">Название  A-Z</option>
 33                             <option {if ShopCore::$_GET['order']=='name_desc'}selected{/if} value="name">Название Z-A</option>
 34                             <option {if ShopCore::$_GET['order']=='date'}selected{/if} value="date">Возрастанию даты</option>
 35                             <option {if ShopCore::$_GET['order']=='date_desc'}selected{/if} value="date_desc">Убыванию даты</option>
 36                         </select>
 37                     </div>
 38 
 39                     <div class="fieldName">Фильтр по категории:</div>
 40                     <div class="field">
 41                         <select name="category" onChange="getCategoryAttributes(this.options[this.selectedIndex].value)">
 42                             <option>-</option>
 43                             {foreach $tree as $c}
 44                                 <option {if ShopCore::$_GET['category']==$c->getId()}selected{/if} value="{echo $c->getId()}">{str_repeat('-',$c->getLevel())}
 45                                     {if $c->getLevel()==0}
 46                                         <b>{echo ShopCore::encode($c->getName())}</b>
 47                                     {else:}
 48                                         {echo ShopCore::encode($c->getName())}
 49                                     {/if}
 50                                 </option>
 51                             {/foreach}  
 52                         </select>
 53                     </div>
 54 
 55                     <div id="catVariants">
 56                     </div>
 57 
 58                     <div class="fieldName">Цена:</div>
 59                     <div class="field">
 60                         от <input type="text" value="{encode(ShopCore::$_GET['lp'])}" name="lp" style="width:26px;" />
 61                         до <input type="text" value="{encode(ShopCore::$_GET['rp'])}" name="rp" style="width:26px;"/> 
 62                     </div>
 63                     <div class="clear"></div>
 64 
 65                     {if !empty(ShopCore::$_GET['brand'])}
 66                         <input type="hidden" value="{encode(ShopCore::$_GET['brand'])}" name="brand" />
 67                     {/if}
 68                     <div class="clear"></div>
 69                     <div class="fieldName"></div>
 70                     <div class="field">
 71                         <input type="submit" value="Применить" />
 72                     </div>
 73                     <div class="clear"></div>
 74 
 75                 </form>
 76                 </div>
 77             <!-- END FILTER BOX -->
 78         </div>
 79         <div class="sp"></div>
 80 
 81         <div id="categoryPath">
 82             {if !empty(ShopCore::$_GET['text'])}
 83                 Вы искали: "<span class="highlight">{encode($_GET['text'])}</span>" 
 84             {/if}
 85         </div>
 86       </div>
 87     <div id="brands_list">
 88     <!-- Display brans list -->
 89     {if sizeof($brandsInSearchResult) > 0}
 90         {foreach $brandsInSearchResult as $brand}
 91             {if $brand->getId() != ShopCore::$_GET['brand']}
 92                 <a href="?text={encode(ShopCore::$_GET['text'])}{if !empty(ShopCore::$_GET['order'])}&order={encode(ShopCore::$_GET['order'])}{/if}{if !empty(ShopCore::$_GET['category'])}&category={encode(ShopCore::$_GET['category'])}{/if}&brand={echo $brand->getId()}">{echo ShopCore::encode($brand->getName())}</a>
 93             {else:}
 94                 <a href="#" style="font-weight:bold;">{echo ShopCore::encode($brand->getName())}</a>
 95             {/if}
 96             |
 97         {/foreach}
 98     {/if}
 99     </div>
100     <br/>
101 
102     {if $totalProducts > 0}
103         <ul class="products">
104         {$count = 1;}
105         {foreach $products as $p}
106             <li {if $count == 3} class="last" {$count = 0}{/if} {if $count == 1} style="clear:left;" {/if}>
107                 <div class="image" style="display:table-cell;vertical-align:middle;overflow:hidden;">
108                     <a href="{shop_url('product/' . $p->getUrl())}">
109                         <img src="{productImageUrl($p->getId() . '_small.jpg')}" border="0"  alt="image" />
110                     </a>
111                 </div>
112                 <h3 class="name"><a href="{shop_url('product/' . $p->getUrl())}">{echo ShopCore::encode($p->getName())}</a></h3>
113                 <div class="price">{echo $p->firstVariant->toCurrency()} {$CS}</div>
114                 <div class="compare"><a href="{shop_url('compare/add/' . $p->getId())}">Сравнить</a></div>
115             </li>
116             {if $count == 3}<li class="separator"></li> {$count=0}{/if}
117             {$count++}
118         {/foreach}
119         </ul>
120 
121         <div class="sp"></div>
122         <div id="gopages">
123                 {$pagination}
124         </div>
125         <div class="sp"></div>
126         {else:}
127         <p>
128             {echo ShopCore::t('По вашему запросу ничего не найдено')}.
129         </p>
130     {/if}
131 </div>

Главные участки файла search.tpl

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

 1  
 2 <div id="titleExt">
 3         <h5 class="left">Поиск</h5>
 4         <div class="right">
 5             Найдено {$totalProducts} {echo SStringHelper::Pluralize($totalProducts, array('продукт','продукта','продуктов'))}
 6             <!-- BEGIN FILTER BOX -->
 7                 <a href="#" onclick="$('#filterBox').toggle();return false;">Изменить параметры ↓</a>
 8                 <div id="filterBox">
 9                 <form method="get" action="">
10                     {if !empty(ShopCore::$_GET['text'])}
11                         <input type="hidden" value="{encode(ShopCore::$_GET['text'])}" name="text" />
12                     {/if}
13 
14                     <div class="fieldName">Сиртировка:</div>
15                     <div class="field">
16                         <select name="order">
17                             <option>-</option>
18                             <option {if ShopCore::$_GET['order']=='price'}selected{/if} value="price">Возрастанию цены</option>
19                             <option {if ShopCore::$_GET['order']=='price_desc'}selected{/if} value="price_desc">Убыванию цены</option>
20                             <option {if ShopCore::$_GET['order']=='name'}selected{/if} value="name">Название  A-Z</option>
21                             <option {if ShopCore::$_GET['order']=='name_desc'}selected{/if} value="name">Название Z-A</option>
22                             <option {if ShopCore::$_GET['order']=='date'}selected{/if} value="date">Возрастанию даты</option>
23                             <option {if ShopCore::$_GET['order']=='date_desc'}selected{/if} value="date_desc">Убыванию даты</option>
24                         </select>
25                     </div>
26 
27                     <div class="fieldName">Фильтр по категории:</div>
28                     <div class="field">
29                         <select name="category" onChange="getCategoryAttributes(this.options[this.selectedIndex].value)">
30                             <option>-</option>
31                             {foreach $tree as $c}
32                                 <option {if ShopCore::$_GET['category']==$c->getId()}selected{/if} value="{echo $c->getId()}">{str_repeat('-',$c->getLevel())}
33                                     {if $c->getLevel()==0}
34                                         <b>{echo ShopCore::encode($c->getName())}</b>
35                                     {else:}
36                                         {echo ShopCore::encode($c->getName())}
37                                     {/if}
38                                 </option>
39                             {/foreach}  
40                         </select>
41                     </div>
42 
43                     <div id="catVariants">
44                     </div>
45 
46                     <div class="fieldName">Цена:</div>
47                     <div class="field">
48                         от <input type="text" value="{encode(ShopCore::$_GET['lp'])}" name="lp" style="width:26px;" />
49                         до <input type="text" value="{encode(ShopCore::$_GET['rp'])}" name="rp" style="width:26px;"/> 
50                     </div>
51                     <div class="clear"></div>
52 
53                     {if !empty(ShopCore::$_GET['brand'])}
54                         <input type="hidden" value="{encode(ShopCore::$_GET['brand'])}" name="brand" />
55                     {/if}
56                     <div class="clear"></div>
57                     <div class="fieldName"></div>
58                     <div class="field">
59                         <input type="submit" value="Применить" />
60                     </div>
61                     <div class="clear"></div>
62 
63                 </form>
64                 </div>
65             <!-- END FILTER BOX -->
66         </div>
67         <div class="sp"></div>
68 
69         <div id="categoryPath">
70             {if !empty(ShopCore::$_GET['text'])}
71                 Вы искали: "<span class="highlight">{encode($_GET['text'])}</span>" 
72             {/if}
73         </div>
74       </div>

Отображение найденных продуктов

 1 
 2 {if $totalProducts > 0}
 3         <ul class="products">
 4         {$count = 1;}
 5         {foreach $products as $p}
 6             <li class="{counter('', '', 'last')}">
 7                 <div class="image" style="display:table-cell;vertical-align:middle;overflow:hidden;">
 8                     <a href="{shop_url('product/' . $p->getUrl())}">
 9                         <img src="{productImageUrl($p->getId() . '_small.jpg')}" border="0"  alt="image" />
10                     </a>
11                 </div>
12                 <h3 class="name"><a href="{shop_url('product/' . $p->getUrl())}">{echo ShopCore::encode($p->getName())}</a></h3>
13                 <div class="price">{echo $p->firstVariant->toCurrency()} {$CS}</div>
14                 <div class="compare"><a href="#">Сравнить</a></div>
15             </li>
16             {if $count == 3}<li class="separator"></li> {$count=0}{/if}
17             {$count++}
18         {/foreach}
19         </ul>
20 
21         <div class="sp"></div>
22         <div id="gopages">
23                 {$pagination}
24         </div>
25         <div class="sp"></div>
26         {else:}
27         <p>
28             {echo ShopCore::t('По вашему запросу ничего не найдено')}.
29         </p>
30     {/if}

Полезные советы

  • Для отображения результатов поиска в виде: категория продукции (количество результатов), а ниже - отображение всех найденных товаров, и так по каждой категории надо
    В скрипте application\modules\shop\search.php:

заменить блок

1 $products = $products
2                     ->offset((int) ShopCore::$_GET['per_page'])
3                     ->limit((int) $this->perPage)
4                     ->find();
5  

блоком

 1             //creating array of name and total products in category
 2             $products_all = $products
 3                     ->find();            
 4             foreach ($products_all as $product) {
 5                 $products_in_category[$product->getCategoryId()]['total']++;
 6             }
 7             ksort($products_in_category);
 8             $categories = SCategoryQuery::create()
 9             ->where('SCategory.Id IN ?', array_keys($products_in_category))
10             ->find();            
11             foreach ($categories as $category) {
12                 $products_in_category[$category->getId()]['name'] = $category->getName();
13                 $products_in_category[$category->getId()]['path'] = $category->getFullPath();
14             }
15 
16             $products = $products
17                     ->orderByCategoryId('ASC')
18                     ->find();

Строку

1 'pagination'=>$this->pagination->create_links(),

заменить строкой

1 'productsCategoryTotal'=>$products_in_category,

В шаблоне templates\commerce\shop\default\search.tpl:

Заменить блок

 1 {if $totalProducts > 0}
 2         <ul class="products">
 3         {$count = 1;}
 4         {foreach $products as $p}
 5             <li class="{counter('', '', 'last')}">
 6                 <div class="image" style="display:table-cell;vertical-align:middle;overflow:hidden;">
 7                     <a href="{shop_url('product/' . $p->getUrl())}">
 8                         <img src="{productImageUrl($p->getId() . '_small.jpg')}" border="0"  alt="image" />
 9                     </a>
10                 </div>
11                 <h3 class="name"><a href="{shop_url('product/' . $p->getUrl())}">{echo ShopCore::encode($p->getName())}</a></h3>
12                 <div class="price">{echo $p->firstVariant->toCurrency()} {$CS}</div>
13                 <div class="compare"><a href="#">Сравнить</a></div>
14             </li>
15             {if $count == 3}<li class="separator"></li> {$count=0}{/if}
16             {$count++}
17         {/foreach}
18         </ul>
19 
20         <div class="sp"></div>
21         <div id="gopages">
22                 {$pagination}
23         </div>
24         <div class="sp"></div>
25         {else:}
26         <p>
27             {echo ShopCore::t('По вашему запросу ничего не найдено')}.
28         </p>
29     {/if}

блоком
 1 {if $totalProducts > 0}      
 2         {foreach $productsCategoryTotal as $key=>$value}
 3             <a href="category/{$value['path']}">{echo $value['name'].'('.$value['total'].')'}</a>
 4             <ul class="products">
 5                 {$count = 1;}
 6                 {foreach $products as $p} 
 7                 {if $p->getCategoryId() == $key}
 8                 <li {if $count == 3} class="last"{/if}>
 9                     <div class="image" style="display:table-cell;vertical-align:middle;overflow:hidden;">
10                         <a href="{shop_url('product/' . $p->getUrl())}">
11                             <img src="{productImageUrl($p->getId() . '_small.jpg')}" border="0"  alt="image" />
12                         </a>
13                     </div>
14                     <h3 class="name"><a href="{shop_url('product/' . $p->getUrl())}">{echo ShopCore::encode($p->getName())}</a></h3>
15                     <div class="price">{echo $p->firstVariant->toCurrency()} {$CS}</div>
16                     <div class="compare"><a href="#">Сравнить</a></div>
17                 </li>
18                 {if $count == 3}<li class="separator"></li> {$count=0}{/if}
19                 {$count++}
20                 {/if}
21             {/foreach}
22             </ul>
23             <div class="sp"></div>
24         {/foreach}
25         <div class="sp"></div>
26         {else:}
27         <p>
28             {echo ShopCore::t('По вашему запросу ничего не найдено')}.
29         </p>
30     {/if}

Пример:

front_search_result_by_category.png (117.5 kB) Василь Совяк, 20-02-2012 17:21