Можно ли сортировать продукты вертикально в сетке? (list.phtml)
-
22-10-2019 - |
Вопрос
У меня есть продукты, на которых они будут показаны горизонтально на странице сетки, однако я хочу, чтобы они были отсортированы по вертикали, и у меня есть 4 coulmns
Если у нас был просто
1 2 3 4
5 6 7 8
9 10 11 12
Я хочу, чтобы выход был
1 4 7 10
2 5 8 11
3 6 9 12
Я написал тестовую страницу без Magento «Простой массив», я хочу сделать это на множестве продуктов, но я действительно не знаю, как это сделать? Потому что у меня есть множество продуктов, которые будут загружены, и я должен изменить их порядок. У вас есть другая идея?
заранее спасибо
<?php
$array1=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25);
$column=4;
$count=count($array1);
$arr=array();
$k=intval($count/4);
$r=($count%4);
$num=0;
for($m=0; $m<4;$m++)
for($n=0;$n<$k;$n++)
{
$arr[$m][$n]=$array1[$num];
$num++;
}
/*
* build the remainders
*/
for($i=0;$i<$r;$i++)
{
$arr[4][$i]=$array1[$num];
$num++;
}
//print the result
echo "<table>";
for($j=0;$j<$k;$j++)
{
echo "<tr>";
for($i=0;$i<=4;$i++)
{
if($i==4 && $j<$r)
{
echo "<td>".$arr[$i][$j]."</td>";
}
else if($i!=4)
echo "<td>".$arr[$i][$j]."</td>";
}
echo "</tr>";
}
echo "</table>";
echo "arraysize is ".$count."<br>";
echo "division answer is".$k."<br>";;
echo "remainder is".$r;
?>
Вот часть. phtml part
$_productCollection=$this->getLoadedProductCollection();
<ol class="products-list" id="products-list">
<?php foreach ($_productCollection as $_product):
Таким образом, массив $ _product должен отображаться вертикально
<?php // Product Image ?>
<a href="<?php echo $_product->getProductUrl() ?>"
//some other code
Решение
На самом деле это не так сложно. Это помогает думать об этом за пределами контекста Magento, как вы делали выше; Но ваш метод может быть упрощен1, 2:
<?php
$cols = 5; //set this to the # columns you want
$count = 55;//number of total records
$list = range(1,$count);
$rowLength = ceil($count/$cols);
$array = array();
$output = array_chunk($list, $rowLength);
for($i=0;$i<$rowLength;$i++){
@array_walk($output,function($val) use ($i){
echo $val[$i] . ' ';
});
echo PHP_EOL;
}
Который, при расчете на 5 columns
и 32 count
Вы получаете:
1 8 15 22 29
2 9 16 23 30
3 10 17 24 31
4 11 18 25 32
5 12 19 26
6 13 20 27
7 14 21 28
Все, что происходит здесь, это то, что $list
Массив (замену вашей коллекции Magento) рассыпается в размере нескольких массивов $rowLength
. Анкет После этого все, что мы делаем, - это итерация через все столбцы и вывод индекса строки в этом значении столбца! Это круто.
Сделайте это в Magento
Загрузите коллекцию и бросьте на массив:
$collection = Mage::getModel('catalog/product')->getCollection()->setPageSize(20);
$array = $collection->toArray();
Затем мы подключаем его к нашему методу, который использует array_chunk
3:
$collection = Mage::getModel('catalog/product')->getCollection()->setPageSize(20)->load();
$collArray = $collection->toArray();
$cols = 5; //set this to the # columns you want
$count = count($collArray);//number of total records
$rowLength = ceil($count/$cols);
$array = array();
$output = array_chunk($collArray, $rowLength);
for($i=0;$i<$rowLength;$i++){
@array_walk($output,function($val) use ($i){
echo $val[$i]['sku'] . ' '; //echoing sku in the array
});
echo PHP_EOL;
}
В этом случае я повторяю только SKU, но вместо того, чтобы выпускать echo
вместо этого вы можете заполнить выходной массив или даже Varien_Data_Collection
Таким образом, вы можете использовать это позже.
Надеюсь, это поможет! Удачи.
- Ошибки подавляются, потому что мы пытаемся получить доступ к несуществующему ключу (в случае пустых ячеек)
- Использование
array_walk
В этих примерах тривиальные и могут быть заменены петлей. Однако, если бы вы делали что-то более глубокое, или у вас был метод блока, который уже обрабатывал, как компилировать строки из значений столбцов, это было бы подходящим решением. - Опять же, ошибки здесь подавляются. Вы могли бы вместо того, чтобы поднять на массив попытку получить его с помощью идентификатора коллекции. Или, еще лучше, охраняйте условие, проверяя, если оно
isset
Перед эхом.