Jump to content


Photo
- - - - -

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


Best Answer CB9TOIIIA , 14 July 2015 - 11:45

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

  1. public function columns($layoutName, $objects)
  2. {
  3. static $itemCount = 0;
  4.  
  5. $cols_num = $this->_params->get('template.' . $layoutName . '_cols', 1);
  6. $cols_order = $this->_params->get('template.' . $layoutName . '_order', 1);
  7.  
  8. $vars = array(
  9. 'cols_num' => $cols_num,
  10. 'cols_order' => $cols_order
  11. );
  12.  
  13. // init vars
  14. $i = 0;
  15. $columns = array();
  16. $column = 0;
  17. $row = 0;
  18. $countObjects = count($objects);
  19. $rows = ceil($countObjects / $cols_num);
  20.  
  21. if ($countObjects > 0) {
  22. foreach ($objects as $object) {
  23.  
  24. if ($cols_order) {
  25. // order down
  26. if ($row >= $rows) {
  27. $column++;
  28. $row = 0;
  29. $rows = ceil(($countObjects - $i) / ($cols_num - $column));
  30. }
  31. $row++;
  32. $i++;
  33. } else {
  34. // order across
  35. $column = $i++ % $cols_num;
  36. $column = $i;
  37. }
  38.  
  39. if (!isset($columns[$column])) {
  40. $columns[$column] = '';
  41. }
  42.  
  43. $itemCount++;
  44. if ($itemCount == 2) {
  45. $columns[$column] .= 'Реклама';
  46. }
  47.  
  48. if ($object instanceof Item) {
  49. $columns[$column] .= $this->renderItem($object);
  50. } else {
  51. $columns[$column] .= $this->render($layoutName, $object, $vars);
  52. }
  53. }
  54.  
  55. return $this->render($layoutName . '_columns', $columns, $vars);
  56. }
  57.  
  58. return false;
  59. }
Go to the full post


  • This topic is locked This topic is locked
14 replies to this topic

#1 CB9TOIIIA

CB9TOIIIA
  • Administrators
  • User rate: 230.6
  • posts: 3680
  • topics: 235

Posted 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
  • Administrators
  • User rate: 139.4
  • posts: 16232
  • topics: 200

Posted 07 July 2015 - 12:03

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

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

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

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



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


#3 CB9TOIIIA

CB9TOIIIA
  • Topic Starter
  • Administrators
  • User rate: 230.6
  • posts: 3680
  • topics: 235

Posted 07 July 2015 - 14:47

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

  1. public function columns($layoutName, $objects)
  2. {
  3. $cols_num = $this->_params->get('template.' . $layoutName . '_cols', 1);
  4. $cols_order = $this->_params->get('template.' . $layoutName . '_order', 1);
  5.  
  6. $vars = array(
  7. 'cols_num' => $cols_num,
  8. 'cols_order' => $cols_order
  9. );
  10.  
  11. // init vars
  12. $i = 0;
  13. $columns = array();
  14. $column = 0;
  15. $row = 0;
  16. $countObjects = count($objects);
  17. $rows = ceil($countObjects / $cols_num);
  18.  
  19. if ($countObjects > 0) {
  20. foreach ($objects as $object) {
  21.  
  22. if ($cols_order) {
  23. // order down
  24. if ($row >= $rows) {
  25. $column++;
  26. $row = 0;
  27. $rows = ceil(($countObjects - $i) / ($cols_num - $column));
  28. }
  29. $row++;
  30. $i++;
  31. } else {
  32. // order across
  33. $column = $i++ % $cols_num;
  34. $column = $i;
  35. }
  36.  
  37. if (!isset($columns[$column])) {
  38. $columns[$column] = '';
  39. }
  40.  
  41.  
  42. if ($object instanceof Item) {
  43. $columns[$column] .= $this->renderItem($object);
  44. } else {
  45. $columns[$column] .= $this->render($layoutName, $object, $vars);
  46. }
  47.  
  48. if ($i == 3) {
  49. echo $columns[$column] = '<h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</h1>';
  50. }
  51. if ($i == 6) {
  52.                          echo $columns[$column] = '<h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</h1>';
  53.                      }
  54.  
  55. }
  56.  
  57. return $this->render($layoutName . '_columns', $columns, $vars);
  58. }
  59.  
  60. return false;
  61.  
  62.  
  63. }
  64.  

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

  1.  
  2.  
  3. print '<pre>';
  4. var_dump($i);
  5. print '</pre>';
  6.  
p1Xk48t.png
 
до 18 (это кол-во новостей)
 
А далее идут статьи и в этих статьях уже проставлен lorem ipsum

Edited by CB9TOIIIA, 07 July 2015 - 15:10.

  • 0

#4 SmetDenis

SmetDenis
  • Administrators
  • User rate: 139.4
  • posts: 16232
  • topics: 200

Posted 08 July 2015 - 10:34

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

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



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


#5 CB9TOIIIA

CB9TOIIIA
  • Topic Starter
  • Administrators
  • User rate: 230.6
  • posts: 3680
  • topics: 235

Posted 08 July 2015 - 18:21

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

 

Код:

  1. // order across
  2. $column = $i++ % $cols_num;
  3. $column = $i;
  4. if ($i == 2) {
  5. echo $columns[$column] = '<h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</h1>';
  6. }
  7.  
bn2Gf4I.png
 
Извините, слаб в PHP

  • 0

#6 CB9TOIIIA

CB9TOIIIA
  • Topic Starter
  • Administrators
  • User rate: 230.6
  • posts: 3680
  • topics: 235

Posted 11 July 2015 - 07:14

up? :)


  • 0

#7 SmetDenis

SmetDenis
  • Administrators
  • User rate: 139.4
  • posts: 16232
  • topics: 200

Posted 13 July 2015 - 10:11

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

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

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



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


#8 CB9TOIIIA

CB9TOIIIA
  • Topic Starter
  • Administrators
  • User rate: 230.6
  • posts: 3680
  • topics: 235

Posted 13 July 2015 - 10:30

Вообще: 

Quote

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

 

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

 

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


Edited by CB9TOIIIA, 13 July 2015 - 10:30.

  • 0

#9 SmetDenis

SmetDenis
  • Administrators
  • User rate: 139.4
  • posts: 16232
  • topics: 200

Posted 13 July 2015 - 13:49

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

  1. /**
  2. * Columns ordering
  3. * @param $layoutName
  4. * @param $objects
  5. * @return bool|string
  6. */
  7. public function columns($layoutName, $objects)
  8. {
  9. global $itemCount = 0;
  10. $cols_num = $this->_params->get('template.' . $layoutName . '_cols', 1);
  11. $cols_order = $this->_params->get('template.' . $layoutName . '_order', 1);
  12.  
  13. $vars = array(
  14. 'cols_num' => $cols_num,
  15. 'cols_order' => $cols_order
  16. );
  17.  
  18. // init vars
  19. $i = 0;
  20. $columns = array();
  21. $column = 0;
  22. $row = 0;
  23. $countObjects = count($objects);
  24. $rows = ceil($countObjects / $cols_num);
  25.  
  26. if ($countObjects > 0) {
  27. foreach ($objects as $object) {
  28.  
  29. if ($cols_order) {
  30. // order down
  31. if ($row >= $rows) {
  32. $column++;
  33. $row = 0;
  34. $rows = ceil(($countObjects - $i) / ($cols_num - $column));
  35. }
  36. $row++;
  37. $i++;
  38. } else {
  39. // order across
  40. $column = $i++ % $cols_num;
  41. $column = $i;
  42. }
  43.  
  44. if (!isset($columns[$column])) {
  45. $columns[$column] = '';
  46. }
  47. $itemCount++;
  48. if ($itemCount == 2) {
  49. $columns[$column] .= 'Реклама';
  50. }
  51. if ($object instanceof Item) {
  52. $columns[$column] .= $this->renderItem($object);
  53. } else {
  54. $columns[$column] .= $this->render($layoutName, $object, $vars);
  55. }
  56. }
  57.  
  58. return $this->render($layoutName . '_columns', $columns, $vars);
  59. }
  60.  
  61. return false;
  62. }

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



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


#10 CB9TOIIIA

CB9TOIIIA
  • Topic Starter
  • Administrators
  • User rate: 230.6
  • posts: 3680
  • topics: 235

Posted 13 July 2015 - 19:25

ругается на global

  1. global $itemCount = 0;
  1.  
  2. 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!