Страница 1 из 1

List of blocks in area

СообщениеДобавлено: 19 авг 2013, 18:54
MonoStas
Всем привет. Возникла нетривиальная задача. Получить список блоков в данной area и после каждого 3-его по счету блока вывести инфу. У меня есть задумки, но не могу собрать картину воедино.

и так:

Код: Выделить всё
$a = new Area('myAreaName');
$areaObjects = $a->getAreaBlocksArray($c);
$numOfBlocks = $a->getTotalBlocksInArea($c); либо можно так написать как я понял $numOfBlocks = sizeof($areaObjects);
foreach($areaObjects as $ni)
{
// тут нужно вывести инфу. не нашел нужный метод в API
      if ($numOfBlocks % 3 == 0 ) {
          # Echo My Info
       }
}

Re: List of blocks in area

СообщениеДобавлено: 19 авг 2013, 21:57
guyasyou
хм, а можно узнать конкретную задачу, которую вы решаете?
как-то это не кошерно, по-моему...

Re: List of blocks in area

СообщениеДобавлено: 19 авг 2013, 22:10
MonoStas
да, метод на скорую руку. Мне нужно слайдер запилить с информацией, и там уже верстка готовая. И я block уже написал. Поэтому такие костыли приходится делать. Суть в том, что три моих block'a образуют один слайд и их все три блока нужно обернуть в div с определенным стилем, а я упустил изначально этот момент. Но все переписывать уже не охота. И слайдер использовать нужно именно такой. Т.е. следующие три блока составят еще один слайд и т.д...

Re: List of blocks in area

СообщениеДобавлено: 19 авг 2013, 22:18
guyasyou
неужели, такой костыл легче сделать, чем обернуть тройки в блоке?

Re: List of blocks in area

СообщениеДобавлено: 19 авг 2013, 22:30
MonoStas
Нужно обернуть 3 блока в div! вот я о чем. Или я вас не понял. Опишите подробнее идею

Re: List of blocks in area

СообщениеДобавлено: 19 авг 2013, 23:13
guyasyou
ой, сори, эт меня не туда понесло. ну а то что вы предложили, не костыль- так и надо наверное.
тока в чем проблема то: не можете получить массив блоков, не можете вывести отдельно блок, или как ДИВы воткнуть?

По последнему как то так видится дело:
Код: Выделить всё
$flag = true;
foreach ($bloks as $block) {
  if ($flag) {
    echo '<div>';
    $flag = false;
  }
  // тут выводите текущий блок
  if (//проверка кратности трем, если текущий блок 3й, 6й, 9й ...) {
     echo '</div>';
    $flag = true;
  }
}


вроде норм. в начале откроет, и в конце закроет последнюю тройку. незакрытых ДИВов не должно быть

Re: List of blocks in area

СообщениеДобавлено: 20 авг 2013, 09:24
cmsservice
Вот за что я люблю наших людей, так это за умение придумывать себе трудности и потом героически их преодолевать. :)
Можно же верстку слайдера из шаблона вырезать вставить в смой модуль, тогда не придется придумывать костыли. И, кстати, концептуально так будет правильно :)

Re: List of blocks in area

СообщениеДобавлено: 20 авг 2013, 11:38
guyasyou
cmsservice писал(а):Вот за что я люблю наших людей, так это за умение придумывать себе трудности и потом героически их преодолевать. :)
Можно же верстку слайдера из шаблона вырезать вставить в смой модуль, тогда не придется придумывать костыли. И, кстати, концептуально так будет правильно :)

вот куда меня несло)) автор, таки вы в шаблоне хотели доверстать слайдер????

Re: List of blocks in area

СообщениеДобавлено: 20 авг 2013, 12:18
MonoStas
cmsservice писал(а):Вот за что я люблю наших людей, так это за умение придумывать себе трудности и потом героически их преодолевать. :)
Можно же верстку слайдера из шаблона вырезать вставить в смой модуль, тогда не придется придумывать костыли. И, кстати, концептуально так будет правильно :)

Гениально, товарищ капитан! а то я не догадался. Откуда мне знать, что во view.php можно писать что угодно :mrgreen: . Для каждого кусочка инфы (блок) так и происходит, но нужно 3 блока завернуть в 1 слайд. Мой модуль - создает блоки, но не слайды. Т.к. общее число блоков может быть 4, соответственно в о 1-ом слайде - 3 блока (3 моих модуля), а во втором 1. 3+1=4. А их может быть 6, может 2, может 112 будет.

В общем разборался, написал сам. Может кому пригодится. На забугорном форуме аналога не встретите :), я лично перекопал - ничего не нашел.
Суть в том, что в режиме отображения блоки выводятся перебором, а не как обычно $a->display($c);
Соответственно мы можем манипулировать ими как хотим. Вставлять контент до, после, вместо, да хоть сортировать...


Код: Выделить всё
   
$a = new Area('AreaName');
if ($c->isEditMode()) {
                  $a->display($c);
               } else {
                  $i = 0;
                  $blocks = $a->getAreaBlocksArray($c);
                  foreach ($blocks as $b => $block) {
                     $i++;
                     if ($i == 4) {   
                        echo('What you need to insert');
                        $i = 0;
                     }
                     // echo $b; // block position in area
                     $block->display();
                  }
               }


Кстати, хотел сделать еще красивее, но почему-то $a->setBlockWrapperStart('my content') и соответственно $a->setBlockWrapperEnd('my content') у меня не завелись. Не стал разбираться почему.

Re: List of blocks in area

СообщениеДобавлено: 20 авг 2013, 12:21
MonoStas
вот куда меня несло)) автор, таки вы в шаблоне хотели доверстать слайдер????


Не хотел, но пришлось. Опишите как во view.php определить позицию текущего блока - перепишу с удовольствием.

Re: List of blocks in area

СообщениеДобавлено: 20 авг 2013, 16:45
cmsservice
Ну вообще-то можно и легко. :)
Есть такой модуль, в каталоге на сайте конкрита он называется matogertel_area_splitter вот он занимается ровно этим. Кода не очень много, но вот смотрите во вложении (контроллер и вьюшку положил, чтобы не нарушать авторские права)