Список двухуровневой вложенности

Тема в разделе "Программирование", создана пользователем mila, 30.10.2015.

  1. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    33
    Симпатии:
    0
    Пол:
    Женский
    Здравствуйте всем!

    У нас есть двумерный массив
    ---------------
    ([0] => stdClass Object ( [articleId] => 229 [articleTitle] => Кольцов [articleAlias] => koltsov [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )


    [1] => stdClass Object ( [articleId] => 525 [articleTitle] => Черный [articleAlias] => chernyj [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )


    [3] => stdClass Object ( [articleId] => 25 [articleTitle] => Анаграмма [articleAlias] => anagramma [articleCategory] => 55 [id] => [asset_id] => [title] => [ordering] => [state] => [created_time] => [checked_out] => [checked_out_time] => [created_by] => [editor] => )

    ----------------------

    Нам нужно из этого массива вывести на сайте список сборников с материалами:
    ---------------------------------------------
    Название сборника
    - материал
    - материал
    Название сборника
    - материал
    - материал

    Плюс отдельно материалы без сборников.
    ---------------------------------------------
    Знающие люди подсказали, что нам нужно пройтись по всем данным и собрать их в новый многомерный массив.
    Для нашего списка нужен массив массив такого вида:

    [id][title]
    - [id][articleId][articleTitle]

    Подскажите, пожалуйста, вот как теперь это правильно оформить?
     
  2.  
  3. |title|
    Offline

    |title| Активист

    Регистрация:
    19.09.2014
    Сообщения:
    105
    Симпатии:
    26
    Пол:
    Мужской
    Легче всего запрос нормальный сделать
     
  4. OlegK
    Offline

    OlegK Russian Joomla! Team Команда форума ⇒ Профи ⇐

    Регистрация:
    17.01.2011
    Сообщения:
    7 812
    Симпатии:
    771
    Пол:
    Мужской
    Сделайте вывод не var_dump() , a
    Код (PHP):
    1. echo "<pre>";
    2. print_r($object);
    3. echo "</pre>";

    Пример прохода по массиву объектов
    Код (PHP):
    1. <ul class="latestnews<?php echo $moduleclass_sfx; ?>">
    2. <?php foreach ($list as $item) :  ?>
    3.     <li>
    4.         <a href="<?php echo $item->link; ?>">
    5.             <?php echo $item->title; ?></a>
    6.     </li>
    7. <?php endforeach; ?>
    8. </ul>
     
  5. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    33
    Симпатии:
    0
    Пол:
    Женский
    Нам надо в методе getItems() модели пересобрать массив. Сделать там foreach ($items as $item) и составить новый массив.
    Мы делаем так (эти действия мы выполняем в файле compilations.php, который находится в папке models компонента):
    Код (PHP):
    1. public function getItems()
    2.     {
    3.         $compilations = array();
    4.  
    5. foreach ($items as $item)
    6. {
    7.     $article = new stdClass;
    8.     $article->id       = $item->articleId;
    9.     $article->title    = $item->articleTitle;
    10.     $article->alias    = $item->articleAlias;
    11.     $article->category = $item->articleCategory;
    12.  
    13.     $compilations[$item->id]['article'] = $article;
    14.  
    15.     $compilation = new stdClass;
    16.     $compilation->id               = $item->id;
    17.     $compilation->title            = $item->title;
    18.     $compilation->state            = $item->state;
    19.     $compilation->checked_out      = $item->checked_out;
    20.     $compilation->checked_out_time = $item->checked_out_time;
    21.     $compilation->created_by       = $item->created_by;
    22.     $compilation->editor           = $item->editor;
    23.  
    24.     $compilations[$item->id]['compilation'] = $compilation;
    25. }
    26.  
    27. return $compilations;
    28.  
    29.     }

    ----------------------------------------------------------
    В макете вывода вставили

    Код (PHP):
    1. <?php foreach ($list as $item) :
    2. echo "<pre>";
    3. print_r($item);
    4. echo "</pre>";
    5. endforeach; ?>

    --------------------------------------------------------
    Но у нас почему-то возникает такая ошибка: Warning: Invalid argument supplied for foreach() in Z:\home\starting\www\components\com_chmos\models\compilations.php on line 215

    Линия 215 -
    это foreach ($items as $item)

    Подскажите, пожалуйста, что мы не так написали?
     
  6. OlegK
    Offline

    OlegK Russian Joomla! Team Команда форума ⇒ Профи ⇐

    Регистрация:
    17.01.2011
    Сообщения:
    7 812
    Симпатии:
    771
    Пол:
    Мужской
    Пустой массив. Нужно передать массив $items при вызове метода getItems()
     
  7. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    33
    Симпатии:
    0
    Пол:
    Женский
    Спасибо!
    --- добавлено: 05.11.2015, первое сообщение размещено: 03.11.2015 ---
    Ох, и намучались мы с массивом.... Не будем загружать вас лишней иформацией.
    В общем, сейчас наш массив имеет такой вот вид (это окончательно):
    Код (CODE):
    1. Array
    2. (
    3. [0]=> stdClass Object
    4.        (
    5.            [id] => 8
    6.            [title] => Материалы без сборника
    7.            [created_by] => 919
    8.            [articles] => Array
    9.                (
    10.                [0]=> stdClass Object
    11.                        (
    12.                            [id] => 647
    13.                            [title] => Бездомный
    14.                            [alias] => bezdomnyj
    15.                            [catid] => 2
    16.                            [compilation_id] => 8
    17.                        )
    18.  
    19.                )
    20.  
    21.        )
    22.  
    23.    [1] => stdClass Object
    24.        (
    25.            [id] => 9
    26.            [title] => Зебр
    27.            [created_by] => 919
    28.            [articles] => Array
    29.                (
    30.                [0]=> stdClass Object
    31.                        (
    32.                            [id] => 646
    33.                            [title] => Полоски
    34.                            [alias] => poloski
    35.                            [catid] => 2
    36.                            [compilation_id] => 9
    37.                        )
    38.  
    39.                )
    40.  
    41.        )
    42. )

    Подскажите, пожалуйста, как нам теперь всё это красиво оформить во фронтенде? Мы хотим, чтобы у нас был красивый кликабельный список...
    --- добавлено: 06.11.2015 ---
    Люди добрыя! Помогииите! =)...Пытаемся мы присоединить материалы к списку сборников. И так, и эдак - не получается. Правим код в файле default.php прямо на сервере и сразу же смотрим изменения.
    ---------------------------------------------
    Перечитали море информации о том, что такое многомерные ассоциативные массивы, про выборку данных из массива с помощью функции foreach, про ключи, про раскрывающиеся списки... Захлебнулись от переизбытка. Направьте нас, пожалуйста, в нужную сторну!
    -------------------------------------------------------
    Что мы поняли?

    У нас есть многомерный массив, вроде как трёхуровневый.



    Для того, чтобы вывести значения этого массива, нужно, вроде как, воспользоваться функциями foreach, echo и ключами.


    <?php foreach ($this->items (это мы обратились к нашей переменной в модели) as $i => $item (а здесь назначаем ключ) ) : ?>.


    Нам, вообще непонятно, что такое $item? Мы знаем только, что такое $items...


    Подскажите, пожалуйста, как нам наш ключ определить, чтобы добраться до названий материалов, которые содержатся в сборнике?
    И, вообще, в нужном направлении мы копаем? Будем рады любой помощи, наводке и подсказке.
     
  8. |title|
    Offline

    |title| Активист

    Регистрация:
    19.09.2014
    Сообщения:
    105
    Симпатии:
    26
    Пол:
    Мужской
    Код (PHP):
    1. foreach($this->items as $key=>$item){
    2. //строки [0]=> stdClass Object и [1]=> stdClass Object
    3. // ключ - $key в нем хранятся индексы из выше перечисленных строк, у вас их может быть энное количество
    4. // в item храниться непосредственно содержимое объекта, на который указывает ключ
    5. // т.е. сразу идет ключ 0, потом 1 и т.д.
    6. // соответственно item по ключу 0 будет равен объекту
    7. /*
    8. [INDENT][LIST=1]
    9. [*]stdClass Object
    10. [*]       (
    11. [*]           [id] => 8
    12. [*]           [title] => Материалы без сборника
    13. [*]           [created_by] => 919
    14. [*]           [articles] => Array
    15. [*]               (
    16. [*]               [0]=> stdClass Object
    17. [*]                       (
    18. [*]                           [id] => 647
    19. [*]                           [title] => Бездомный
    20. [*]                           [alias] => bezdomnyj
    21. [*]                         [catid] => 2
    22. [*]                           [compilation_id] => 8
    23. [*]                       )
    24. [*]
    25.  
    26. [*]               )
    27. [*]
    28.  
    29. [*]       )*/
    30. [/LIST][/INDENT]
    31.  
    32. // на первом уровне foreach сможете обращаться к полям
    33. /*
    34. [LIST][*][id] => 8[/LIST]
    35. [LIST][*]           [title] => Материалы без сборника[/LIST]
    36. [LIST][*]           [created_by] => 919[/LIST]
    37. [LIST][*]           [articles] => Array[/LIST]
    38. */
    39. // делается это просто - $item->title, $item->created_by и т.д.
    40.  
    41. // выводим первый уровень списка
    42.  
    43. echo '<div class="title">'.$item->title.'</div>'; // название сборника, js  - при клике показать список...
    44. echo '<ul id="lvl1">';
    45.  
    46. // далее создаем вложенный foreach для вывода материалов в сборнике
    47. foreach($item->articles as $key->$article){
    48. // ну и здесь форматируете вывод...чего вам там нужно, ссылки наверное...дальше сами)
    49. echo '<li>'.$article->title.'</li>';
    50.  
    51. }
    52.  
    53. echo '</ul>';
    54. }



    Надеюсь заработает

    Код (PHP):
    1. foreach($this->items as $key=>$item){
    2.   echo '<div class="title">'.$item->title.'</div>';
    3.   echo '<ul id="lvl1">';
    4.      foreach($item->articles as $key->$article){
    5.        echo '<li>'.$article->title.'</li>';
    6.      }
    7.   echo '</ul>';
    8. }

    вот так правильнее
    Код (PHP):
    1. if(count($this->items)){
    2. echo '<ul id="lvl1">';
    3. foreach($this->items as $key=>$item){
    4.   echo '<li class="title">'.$item->title;
    5.   echo '<ul id="lvl2">';
    6.      foreach($item->articles as $key->$article){
    7.        echo '<li>'.$article->title.'</li>';
    8.      }
    9.   echo '</ul>';
    10. echo '</li>';
    11. }
    12. echo '</ul>';
    13. }
     
    Последнее редактирование: 06.11.2015
  9. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    33
    Симпатии:
    0
    Пол:
    Женский
    @|title|, спасибо Вам большое за подсказки и отзывчивость.
    Только ни первый, ни второй код, к сожалению, не работает.
    Причём непонятно, почему. Нам сегодня ночью удалось вывести сборники с материалами с помощью вот этого кода:
    Код (PHP):
    1. <?php foreach ($this->items as $i => $item) { ?>
    2.                     <h3><?=$item->title?></h3>
    3.                     <?php foreach ($item->articles as $article) { ?>
    4.                     <p><?=$article->title?></p>
    5.                     <?php } ?>
    6.                     <?php } ?>


    Он очень похож на то, что Вы нам написали...Но почему Ваш код не работает, мы не видим.

    Сейчас мы пробуем заголовки материалов сделать кликабельными - чтобы название материала вело на текст материала.. Подскажите, пожалуйста, какие изменения нам нужно для этого внести в код?
    --- добавлено: 06.11.2015, первое сообщение размещено: 06.11.2015 ---
    @|title|, посидели сейчас над кодом, который Вы нам написали. Прочитали ещё раз всё внимательно (спасибо за такие развёрнутые пояснения).
    Нашли, почему Ваш код не хотел работать. Дело в этой строчке: foreach($item->articles as $key->$article){. Мы заменили её на foreach($item->articles as $article){ - и всё заработало!
    Вот этот рабочий код:
    Код (PHP):
    1. <?php foreach($this->items as $key=>$item){
    2.  
    3. echo '<div class="title">'.$item->title.'</div>';
    4. echo '<ul id="lvl1">';
    5.  
    6. foreach($item->articles as $article){
    7.  
    8. echo '<li>'.$article->title.'</li>';
    9.  
    10. }
    11.  
    12. echo '</ul>';
    13. }  
    14. ?>


    Только вот мы не можем разобраться, почему не работают ссылки на материалы...
     
  10. |title|
    Offline

    |title| Активист

    Регистрация:
    19.09.2014
    Сообщения:
    105
    Симпатии:
    26
    Пол:
    Мужской
    Возможно вот так
    Код (PHP):
    1. <?php foreach($this->items as $key=>$item){
    2. echo '<div class="title">'.$item->title.'</div>';
    3. echo '<ul id="lvl1">';
    4. foreach($item->articles as $article){
    5. $link = JRoute::_("index.php?option=com_content&view=article&id=".$article->id."&catid=".$item->id);
    6. echo '<li><a href="'.$link.'">'.$article->title.'</a></li>';
    7. }
    8. echo '</ul>';
    9. }
    10. ?>
     
  11. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    33
    Симпатии:
    0
    Пол:
    Женский
    @|title|, работает, спасибо за ответ!
    Мы, правда, уже немного дальше шагнули: ссылки на материалы сделали и заключили наш список в таблицу.
    Вот что мы сейчас имеем:
    --- добавлено: 09.11.2015, первое сообщение размещено: 09.11.2015 ---
    Рядом с названиями сборников - кнопки редактирования (изменить название сборника, удалить сборник)
    Мы теперь бьёмся над тем, чтобы сделать названия сборников кликабельными: чтобы при нажатии на сборник материалы, которые в нём содержатся, открывались. А при повторном нажатии - скрывались.
    --- добавлено: 09.11.2015 ---
    Вот наш код для тела таблицы, которую вы видите на рисунке:

    Код (PHP):
    1. <tbody>
    2.            
    3.         <?php foreach ($this->items as $i => $item) : ?>
    4.                
    5.         <?php $canEdit = $user->authorise('core.edit', 'com_chmos'); ?>
    6.  
    7.         <?php if (!$canEdit && $user->authorise('core.edit.own', 'com_chmos')): ?>
    8.         <?php $canEdit = JFactory::getUser()->id == $item->created_by; ?>
    9.         <?php endif; ?>
    10.  
    11.         <tr>
    12.  
    13.         <?php if (isset($this->items[0]->state)): ?>
    14.         <?php $class = ($canEdit || $canChange) ? 'active' : 'disabled'; ?>
    15.         <td>
    16.         <a class="btn btn-micro <?php echo $class; ?>" href="<?php echo ($canEdit || $canChange) ? JRoute::_('index.php?option=&task=compilation.publish&id=' . $item->id . '&state=' . (($item->state + 1) % 2), false, 2) : '#'; ?>">
    17.         <?php if ($item->state == 1): ?>
    18.         <i class="icon-publish"></i>
    19.         <?php else: ?>
    20.         <i class="icon-unpublish"></i>
    21.         <?php endif; ?>
    22.         </a>
    23.         </td>
    24.         <?php endif; ?>
    25.  
    26.                
    27.  
    28.                 <?php if (isset($this->items[0]->id)): ?>
    29.                    
    30.                
    31.                 <td>
    32.                 <?php echo $this->escape($item->title); ?>
    33.                
    34.                 <?php endif; ?>
    35.                
    36.                
    37.         <?php if ($canEdit || $canDelete): ?>
    38.        
    39.         <?php if ($canEdit): ?>
    40.         <a href="<?php echo JRoute::_('index.php?option=com_chmos&task=compilationform.edit&id=' . $item->id, false, 2); ?>" class="btn btn-mini" type="button"><i class="icon-edit" ></i></a>
    41.         <?php endif; ?>
    42.         <?php if ($canDelete): ?>
    43.         <button data-item-id="<?php echo $item->id; ?>" class="btn btn-mini delete-button" type="button"><i class="icon-trash" ></i></button>
    44.         <?php endif; ?>
    45.         </td>
    46.         <?php endif; ?>
    47.                
    48.         </tr>      
    49.                
    50.                
    51.                 <tr>
    52.      
    53.                  
    54.                  
    55.               <td>
    56.              <?php
    57.  
    58.             foreach($item->articles as $article){
    59.    
    60.             echo '<li><a href="'.JRoute::_('index.php?option=com_content&view=article&id='.$article->id).'">'.$article->title.'</a></li>';
    61.  }
    62. ;
    63.  
    64. ?>  
    65. </td>
    66.     </tr>          
    67.                
    68.                
    69.  
    70.        
    71.        
    72.        
    73.         <?php endforeach; ?>
    74.         </tbody>

    --- добавлено: 09.11.2015 ---
    А вот код, который выводит список сборников с раскрывающимися материалами. Вот мы и думаем, как этот код вписать в таблицу...

    Код (PHP):
    1. <?php
    2. foreach($this->items as $key=>$item){
    3.     echo '<div>';
    4.     echo '<a href="javascript:collapsElement(\'identifikator'.$key.'\')" title="" rel="nofollow">'.$item->title.'</a>';
    5.     echo '<div id="identifikator'.$key.'" style="">';
    6.     foreach($item->articles as $article){
    7.         echo '<p><a href="'.JRoute::_('index.php?option=com_content&view=article&id='.$article->id).'">'.$article->title.'</a></p>';
    8.     }
    9.     echo '</div>';
    10.     echo '</div>';
    11. }
    12. ?>

    --- добавлено: 09.11.2015 ---
    @|title|, будем рады, если Вы захотите нам помочь.
     

    Вложения:

  12. woojin
    Offline

    woojin Местный Команда форума => Cпециалист <=

    Регистрация:
    31.05.2009
    Сообщения:
    3 204
    Симпатии:
    334
    Пол:
    Мужской
    в первом коде вместо строк 58-61
    вставляешь строки 3-10 из второго кода
    действуй))))
     
  13. |title|
    Offline

    |title| Активист

    Регистрация:
    19.09.2014
    Сообщения:
    105
    Симпатии:
    26
    Пол:
    Мужской
    Ну) Пишите функцию js
    Код (javascript):
    1. function collapsElement(e){
    2. jQuery('#' + e).toggle();
    3. }
     
  14. mila
    Offline

    mila Пользователь

    Регистрация:
    01.07.2015
    Сообщения:
    33
    Симпатии:
    0
    Пол:
    Женский
    @|title|, @woojin, спасибо Вам за отзывчивость!
    Мы последние три дня бьёмся над удалением сборников, так что пока отложили вопрос с таблицей.
     

Поделиться этой страницей

Загрузка...