Перейти к содержимому


Фотография
- - - - -

Вставить код после N новости


Лучший Ответ CB9TOIIIA , 14 July 2015 - 11:45

Рабочий код  :)

 public function columns($layoutName, $objects)
    {
       static $itemCount = 0;

        $cols_num   = $this->_params->get('template.' . $layoutName . '_cols', 1);
        $cols_order = $this->_params->get('template.' . $layoutName . '_order', 1);

        $vars = array(
            'cols_num'   => $cols_num,
            'cols_order' => $cols_order
        );

        // init vars
        $i            = 0;
        $columns      = array();
        $column       = 0;
        $row          = 0;
        $countObjects = count($objects);
        $rows         = ceil($countObjects / $cols_num);

        if ($countObjects > 0) {
            foreach ($objects as $object) {

                if ($cols_order) {
                    // order down
                    if ($row >= $rows) {
                        $column++;
                        $row  = 0;
                        $rows = ceil(($countObjects - $i) / ($cols_num - $column));
                    }
                    $row++;
                    $i++;
                } else {
                    // order across
                    $column = $i++ % $cols_num;
                    $column = $i;
                }

                if (!isset($columns[$column])) {
                    $columns[$column] = '';
                }

                $itemCount++;
                if ($itemCount == 2) {
                    $columns[$column] .= 'Реклама';
                }

                if ($object instanceof Item) {
                    $columns[$column] .= $this->renderItem($object);
                } else {
                    $columns[$column] .= $this->render($layoutName, $object, $vars);
                }
            }

            return $this->render($layoutName . '_columns', $columns, $vars);
        }

        return false;
    }
Перейти к сообщению


  • Закрытая тема Тема закрыта
Сообщений в теме: 14

#1 CB9TOIIIA

CB9TOIIIA

Отправлено 07 July 2015 - 11:12

Всем привет! В общем есть тривиальная задачка, необходимо после 2-ой новости вставить код (например Я.Директ или Adsence). Вопрос: Как можно это реализовать более безболезненно?

 

IkM5fKe.png
 

 

Joomla: 3.3.6     JBZoo: 2.1.5 Pro     Zoo: 3.2.4    


  • 0

#2 SmetDenis

SmetDenis

Отправлено 07 July 2015 - 12:03

Колонки строятся в этом хелпере
jbuniversal\framework\helpers\jblayout.php функция columns()

Там по переменной $i можно отслеживать удобное место.

Примерно так
if ($i == 2) {
    echo $columns[$column] = '<реклама>';
}

  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#3 CB9TOIIIA

CB9TOIIIA

Отправлено 07 July 2015 - 14:47

Спасибо вроде работает! :)
 
Но вопрос:
D5GU89p.png
 
Почему еще вначале он срабатывает? условие не слишком жесткое? Если добавить несколько условий, то еще +1 идет к верху.
 
Например 3 условия: 3 будет сверху друг за другом, а остальные как задал.
 
Вот так пробовал:
 
 

   public function columns($layoutName, $objects)
    {
        $cols_num   = $this->_params->get('template.' . $layoutName . '_cols', 1);
        $cols_order = $this->_params->get('template.' . $layoutName . '_order', 1);

        $vars = array(
            'cols_num'   => $cols_num,
            'cols_order' => $cols_order
        );

        // init vars
        $i            = 0;
        $columns      = array();
        $column       = 0;
        $row          = 0;
        $countObjects = count($objects);
        $rows         = ceil($countObjects / $cols_num);

        if ($countObjects > 0) {
            foreach ($objects as $object) {

                if ($cols_order) {
                    // order down
                    if ($row >= $rows) {
                        $column++;
                        $row  = 0;
                        $rows = ceil(($countObjects - $i) / ($cols_num - $column));
                    }
                    $row++;
                    $i++;
                } else {
                    // order across
                    $column = $i++ % $cols_num;
                    $column = $i;
                }

                if (!isset($columns[$column])) {
                    $columns[$column] = '';
                }


                if ($object instanceof Item) {
                    $columns[$column] .= $this->renderItem($object);
                } else {
                    $columns[$column] .= $this->render($layoutName, $object, $vars);
                }

                if ($i == 3) {
   		 				echo $columns[$column] = '<h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</h1>';
   		 			}
if ($i == 6) {
                         echo $columns[$column] = '<h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</h1>';
                     }

            }

            return $this->render($layoutName . '_columns', $columns, $vars);
        }

        return false;


    }

Если в той позиции сделать var_dump



print '<pre>';
 var_dump($i);
print '</pre>';

p1Xk48t.png
 
до 18 (это кол-во новостей)
 
А далее идут статьи и в этих статьях уже проставлен lorem ipsum

Сообщение отредактировал CB9TOIIIA: 07 July 2015 - 15:10

  • 0

#4 SmetDenis

SmetDenis

Отправлено 08 July 2015 - 10:34

У материалов есть два способа вывода. "Пересечением" и "вниз". От этой опции зависит какая часть функции columns будет работать и как ведут себя счетчики.

Самый простой способ вывести $i,$j и выбрать для себя условия вывода.
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#5 CB9TOIIIA

CB9TOIIIA

Отправлено 08 July 2015 - 18:21

По поводу $j нигде не нашел в jblayout, зато узнал, что используется   // order across  (это вроде пересечение).

 

Код:

 // order across
                    $column = $i++ % $cols_num;
                    $column = $i;
                    if ($i == 2) {
                        echo $columns[$column] = '<h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</h1>';
                    }

bn2Gf4I.png
 
Извините, слаб в PHP

  • 0

#6 CB9TOIIIA

CB9TOIIIA

Отправлено 11 July 2015 - 07:14

up? :)


  • 0

#7 SmetDenis

SmetDenis

Отправлено 13 July 2015 - 10:11

Я запутался :)

Как нужно сделать вывод рекламы между блоками?

- Через первые две новости реклама, дальше список без изменений ?
- Через каждые две новости реклама?
- Через каждые две новости разная реклама?
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#8 CB9TOIIIA

CB9TOIIIA

Отправлено 13 July 2015 - 10:30

Вообще: 

Через первые две новости реклама, дальше список без изменений

 

Верно, но почему-то сверху вставляется еще.

 

Я привел выше пример. http://forum.jbzoo.c...ovosti/?p=68407


Сообщение отредактировал CB9TOIIIA: 13 July 2015 - 10:30

  • 0

#9 SmetDenis

SmetDenis

Отправлено 13 July 2015 - 13:49

Можно сделать так.
Ввести новый, независимый счетчик.

    /**
     * Columns ordering
     * @param $layoutName
     * @param $objects
     * @return bool|string
     */
    public function columns($layoutName, $objects)
    {
        global $itemCount = 0;
    
        $cols_num   = $this->_params->get('template.' . $layoutName . '_cols', 1);
        $cols_order = $this->_params->get('template.' . $layoutName . '_order', 1);

        $vars = array(
            'cols_num'   => $cols_num,
            'cols_order' => $cols_order
        );

        // init vars
        $i            = 0;
        $columns      = array();
        $column       = 0;
        $row          = 0;
        $countObjects = count($objects);
        $rows         = ceil($countObjects / $cols_num);

        if ($countObjects > 0) {
            foreach ($objects as $object) {

                if ($cols_order) {
                    // order down
                    if ($row >= $rows) {
                        $column++;
                        $row  = 0;
                        $rows = ceil(($countObjects - $i) / ($cols_num - $column));
                    }
                    $row++;
                    $i++;
                } else {
                    // order across
                    $column = $i++ % $cols_num;
                    $column = $i;
                }

                if (!isset($columns[$column])) {
                    $columns[$column] = '';
                }
                
                $itemCount++;
                if ($itemCount == 2) {
                    $columns[$column] .= 'Реклама';
                }
                
                if ($object instanceof Item) {
                    $columns[$column] .= $this->renderItem($object);
                } else {
                    $columns[$column] .= $this->render($layoutName, $object, $vars);
                }
            }

            return $this->render($layoutName . '_columns', $columns, $vars);
        }

        return false;
    }

  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#10 CB9TOIIIA

CB9TOIIIA

Отправлено 13 July 2015 - 19:25

ругается на global

 global $itemCount = 0;

Parse error: syntax error, unexpected '=', expecting ',' or ';' in C:\OpenServer\domains\test.local\media\zoo\applications\jbuniversal\framework\helpers\jblayout.php on line 212

  • 0




Click to return to top of page in style!