Можно ли сортировать продукты вертикально в сетке? (list.phtml)

magento.stackexchange https://magento.stackexchange.com/questions/16535

Вопрос

У меня есть продукты, на которых они будут показаны горизонтально на странице сетки, однако я хочу, чтобы они были отсортированы по вертикали, и у меня есть 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. Анкет После этого все, что мы делаем, - это итерация через все столбцы и вывод индекса строки в этом значении столбца! Это круто.

enter image description here

Сделайте это в Magento

Загрузите коллекцию и бросьте на массив:

$collection = Mage::getModel('catalog/product')->getCollection()->setPageSize(20);
$array = $collection->toArray();

Затем мы подключаем его к нашему методу, который использует array_chunk3:

$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 Таким образом, вы можете использовать это позже.

Надеюсь, это поможет! Удачи.


  1. Ошибки подавляются, потому что мы пытаемся получить доступ к несуществующему ключу (в случае пустых ячеек)
  2. Использование array_walk В этих примерах тривиальные и могут быть заменены петлей. Однако, если бы вы делали что-то более глубокое, или у вас был метод блока, который уже обрабатывал, как компилировать строки из значений столбцов, это было бы подходящим решением.
  3. Опять же, ошибки здесь подавляются. Вы могли бы вместо того, чтобы поднять на массив попытку получить его с помощью идентификатора коллекции. Или, еще лучше, охраняйте условие, проверяя, если оно isset Перед эхом.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top