Jump to content

Вывод однотипных характеристик в 1 строку


Go to solution Solved by yr4ik,

Recommended Posts

В текущем шаблоне выводятся характеристики построчно, причем однотипные на несколько строк в коде (как на скрине). Как сделать, чтобы однотипные значения выводились в одну строку и если можно сортировка по возрастанию:

	    {if $product->features}
 <div class="clear"></div>
        <div id="page_title"><h1>{$product->name|escape} - Характеристики</h1></div>
        <div id="features">        
        <ul>
        {foreach $product->features as $f}
        <li><p class="name">{$f->name}:</p><p class="values">{$f->value}</p></li>
        {/foreach}
        <ul>
        </div>        
    {/if}

post-20681-0-68986700-1516811470_thumb.jpg

Edited by Ivan2016
Link to post
Share on other sites

Код который позволяет вывести в 1 строку:

$product->features = $this->features->get_product_options(array('product_id'=>$product->id));

   $temp_options = array();
   foreach($product->features as $option) {
$temp_options[$option->feature_id]['feature_id'] = $option->feature_id;
$temp_options[$option->feature_id]['name'] = $option->name;
$temp_options[$option->feature_id]['values'][] = $option->value;   
}
  	 
foreach($temp_options as $id => $option)
       	$temp_options[$id]['value'] = implode('; ', $temp_options[$id]['values']);   	 
      	 
$product->features = $temp_options;

Как сделать, чтобы в этой строке значения ещё сортировались по возрастанию?

Link to post
Share on other sites
  • Solution
foreach($temp_options as &$option)
{
       	sort($option['values']);//СОРТИРОВКА
       	$option['value'] = implode('; ', $option['values']);   
}

функцию сортировки подбирайте на свой вкус http://php.net/manual/ru/array.sorting.php

Edited by yr4ik
Link to post
Share on other sites

что-то это не работает... версия 2.3.8

 

     

вот как это 

foreach($temp_options as $id => $option)
    $temp_options[$id]['value'] = implode('; ', $temp_options[$id]['values']); 

стыкуется с этим? меняется? добавляется?

foreach($temp_options as &$option)
{
       	sort($option['values']);//СОРТИРОВКА
       	$option['value'] = implode('; ', $option['values']);   
}

 

 

P.S. если нужна сортировка в фильтре и на странице вывода свойств

 

api/Features.php

185 строка - сортировка значений характеристик по длине значения LENGTH(value) ASC

 

WHERE 1 $feature_id_filter $product_id_filter $brand_id_filter $features_filter GROUP BY po.feature_id, po.value ORDER BY LENGTH(value) ASC, value");

 

для одежды, размеры вводятся 0, 2, 4, 42, 46, 54, 62

Edited by aroman80
Link to post
Share on other sites

Работает именно так, как запрограммировано.

Надо не только код бездумно вставлять, а и читать. Было ведь специально сказано:

 

функцию сортировки подбирайте на свой вкус http://php.net/manual/ru/array.sorting.php

Link to post
Share on other sites

Работает именно так, как запрограммировано.

Надо не только код бездумно вставлять, а и читать. Было ведь специально сказано:

 

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

Link to post
Share on other sites

Даже если не особо силен, по ссылке можно легко в тексте найти список функций сортировки с объяснениями, как работают. Даже если краткие объяснения непонятны, просто попробовать эти функции по одной. Работы на несколько минут...

 

Скорее всего, Вам подойдет natsort()

Link to post
Share on other sites

у меня вообще по-другому

 

у меня код такой и работает (Источник: http://forum.simplacms.ru/topic/6089-%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B4%D0%BB%D1%8F-%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80/)

$temp_options[$option->feature_id]->feature_id = $option->feature_id;
$temp_options[$option->feature_id]->name = $option->name;
$temp_options[$option->feature_id]->values[] = $option->value;   

тут такой

$temp_options[$option->feature_id]['feature_id'] = $option->feature_id;
$temp_options[$option->feature_id]['name'] = $option->name;
$temp_options[$option->feature_id]['values'][] = $option->value;   

кто разбирается, в чём разница?

Edited by aroman80
Link to post
Share on other sites

у меня вообще по-другому

 

у меня код такой и работает (Источник: http://forum.simplacms.ru/topic/6089-%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B4%D0%BB%D1%8F-%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80/)

$temp_options[$option->feature_id]->feature_id = $option->feature_id;
$temp_options[$option->feature_id]->name = $option->name;
$temp_options[$option->feature_id]->values[] = $option->value;   
тут такой
$temp_options[$option->feature_id]['feature_id'] = $option->feature_id;
$temp_options[$option->feature_id]['name'] = $option->name;
$temp_options[$option->feature_id]['values'][] = $option->value;   
кто разбирается, в чём разница?
Идиотский вопрос.

Пойдите почитайте про массивы и объекты прежде чем задавать такие глупые вопросы.

Link to post
Share on other sites

Идиотский вопрос.

Пойдите почитайте про массивы и объекты прежде чем задавать такие глупые вопросы.

не кипишуйте, уважаемый Noxter! 

я не так давно изучаю php и mysql, сделайте поблажку новичку.

я не задавал бы глупых вопросов, если бы было ясно как днём.

Link to post
Share on other sites

не кипишуйте, уважаемый Noxter! 

я не так давно изучаю php и mysql, сделайте поблажку новичку.

я не задавал бы глупых вопросов, если бы было ясно как днём.

Да вы кэп!
Link to post
Share on other sites

изучал вопрос и вроде получилось

 

в карточке товара "product" сортировка тут (api/Features.php самый конец файла)
public function get_product_options($product_id)
	{
		$query = $this->db->placehold("SELECT f.id as feature_id, f.name, po.value, po.product_id FROM __options po LEFT JOIN __features f ON f.id=po.feature_id WHERE po.product_id in(?@) 
ORDER BY f.position", (array)$product_id);
		$this->db->query($query);
		return $this->db->results();
	}

меняем ORDER BY f.position на ORDER BY LENGTH(value) ASC
и получаем сортировку в карточке товара по длине значения, вот так 0,1,2,3,4,10,100,1000,10000
 
p.s. вот только не могу понять, сортируем по value или по po.value ?
в книге MySql по SELECT написано, что сортировка идет по названию столбца, а в базе нет столбца po.value.
я так понял, что po.value это, типа связанного или сгруппированного столбца...

 

Edited by aroman80
Link to post
Share on other sites

В данном случае сортировка будет правильно работать в обоих случаях

ORDER BY LENGTH(po.value) ASC

ORDER BY LENGTH(value) ASC

 

Это примерно, как, находясь в Ленинграде, водителю такси сказать

1. 3-я улица Строителей, 25  ИЛИ

2. Ленинград, 3-я улица Строителей, 25.

Результат будет одинаков.

А вот если это сказать в Москве, то результат будет другой...
 
 
Link to post
Share on other sites

 

В данном случае сортировка будет правильно работать в обоих случаях

ORDER BY LENGTH(po.value) ASC

ORDER BY LENGTH(value) ASC

 

Это примерно, как, находясь в Ленинграде, водителю такси сказать

1. 3-я улица Строителей, 25  ИЛИ

2. Ленинград, 3-я улица Строителей, 25.

Результат будет одинаков.

А вот если это сказать в Москве, то результат будет другой...

 

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

Link to post
Share on other sites

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...