Здравствуйте всем! У нас есть двумерный массив --------------- ([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] Подскажите, пожалуйста, вот как теперь это правильно оформить?
Сделайте вывод не var_dump() , a Код (PHP): echo "<pre>"; print_r($object); echo "</pre>"; Пример прохода по массиву объектов Код (PHP): <ul class="latestnews<?php echo $moduleclass_sfx; ?>"> <?php foreach ($list as $item) : ?> <li> <a href="<?php echo $item->link; ?>"> <?php echo $item->title; ?></a> </li> <?php endforeach; ?> </ul>
Нам надо в методе getItems() модели пересобрать массив. Сделать там foreach ($items as $item) и составить новый массив. Мы делаем так (эти действия мы выполняем в файле compilations.php, который находится в папке models компонента): Код (PHP): public function getItems() { $compilations = array(); foreach ($items as $item) { $article = new stdClass; $article->id = $item->articleId; $article->title = $item->articleTitle; $article->alias = $item->articleAlias; $article->category = $item->articleCategory; $compilations[$item->id]['article'] = $article; $compilation = new stdClass; $compilation->id = $item->id; $compilation->title = $item->title; $compilation->state = $item->state; $compilation->checked_out = $item->checked_out; $compilation->checked_out_time = $item->checked_out_time; $compilation->created_by = $item->created_by; $compilation->editor = $item->editor; $compilations[$item->id]['compilation'] = $compilation; } return $compilations; } ---------------------------------------------------------- В макете вывода вставили Код (PHP): <?php foreach ($list as $item) : echo "<pre>"; print_r($item); echo "</pre>"; endforeach; ?> -------------------------------------------------------- Но у нас почему-то возникает такая ошибка: Warning: Invalid argument supplied for foreach() in Zhome\starting\www\components\com_chmos\models\compilations.php on line 215 Линия 215 - это foreach ($items as $item) Подскажите, пожалуйста, что мы не так написали?
Спасибо! --- добавлено: 05.11.2015, первое сообщение размещено: 03.11.2015 --- Ох, и намучались мы с массивом.... Не будем загружать вас лишней иформацией. В общем, сейчас наш массив имеет такой вот вид (это окончательно): Код (CODE): Array ( [0]=> stdClass Object ( [id] => 8 [title] => Материалы без сборника [created_by] => 919 [articles] => Array ( [0]=> stdClass Object ( [id] => 647 [title] => Бездомный [alias] => bezdomnyj [catid] => 2 [compilation_id] => 8 ) ) ) [1] => stdClass Object ( [id] => 9 [title] => Зебр [created_by] => 919 [articles] => Array ( [0]=> stdClass Object ( [id] => 646 [title] => Полоски [alias] => poloski [catid] => 2 [compilation_id] => 9 ) ) ) ) Подскажите, пожалуйста, как нам теперь всё это красиво оформить во фронтенде? Мы хотим, чтобы у нас был красивый кликабельный список... --- добавлено: 06.11.2015 --- Люди добрыя! Помогииите! =)...Пытаемся мы присоединить материалы к списку сборников. И так, и эдак - не получается. Правим код в файле default.php прямо на сервере и сразу же смотрим изменения. --------------------------------------------- Перечитали море информации о том, что такое многомерные ассоциативные массивы, про выборку данных из массива с помощью функции foreach, про ключи, про раскрывающиеся списки... Захлебнулись от переизбытка. Направьте нас, пожалуйста, в нужную сторну! ------------------------------------------------------- Что мы поняли? У нас есть многомерный массив, вроде как трёхуровневый. Для того, чтобы вывести значения этого массива, нужно, вроде как, воспользоваться функциями foreach, echo и ключами. <?php foreach ($this->items (это мы обратились к нашей переменной в модели) as $i => $item (а здесь назначаем ключ) ) : ?>. Нам, вообще непонятно, что такое $item? Мы знаем только, что такое $items... Подскажите, пожалуйста, как нам наш ключ определить, чтобы добраться до названий материалов, которые содержатся в сборнике? И, вообще, в нужном направлении мы копаем? Будем рады любой помощи, наводке и подсказке.
Код (PHP): foreach($this->items as $key=>$item){ //строки [0]=> stdClass Object и [1]=> stdClass Object // ключ - $key в нем хранятся индексы из выше перечисленных строк, у вас их может быть энное количество // в item храниться непосредственно содержимое объекта, на который указывает ключ // т.е. сразу идет ключ 0, потом 1 и т.д. // соответственно item по ключу 0 будет равен объекту /* [INDENT][LIST=1] [*]stdClass Object [*] ( [*] [id] => 8 [*] [title] => Материалы без сборника [*] [created_by] => 919 [*] [articles] => Array [*] ( [*] [0]=> stdClass Object [*] ( [*] [id] => 647 [*] [title] => Бездомный [*] [alias] => bezdomnyj [*] [catid] => 2 [*] [compilation_id] => 8 [*] ) [*] [*] ) [*] [*] )*/ [/LIST][/INDENT] // на первом уровне foreach сможете обращаться к полям /* [LIST][*][id] => 8[/LIST] [LIST][*] [title] => Материалы без сборника[/LIST] [LIST][*] [created_by] => 919[/LIST] [LIST][*] [articles] => Array[/LIST] */ // делается это просто - $item->title, $item->created_by и т.д. // выводим первый уровень списка echo '<div class="title">'.$item->title.'</div>'; // название сборника, js - при клике показать список... echo '<ul id="lvl1">'; // далее создаем вложенный foreach для вывода материалов в сборнике foreach($item->articles as $key->$article){ // ну и здесь форматируете вывод...чего вам там нужно, ссылки наверное...дальше сами) echo '<li>'.$article->title.'</li>'; } echo '</ul>'; } Надеюсь заработает Код (PHP): foreach($this->items as $key=>$item){ echo '<div class="title">'.$item->title.'</div>'; echo '<ul id="lvl1">'; foreach($item->articles as $key->$article){ echo '<li>'.$article->title.'</li>'; } echo '</ul>'; } вот так правильнее Код (PHP): if(count($this->items)){ echo '<ul id="lvl1">'; foreach($this->items as $key=>$item){ echo '<li class="title">'.$item->title; echo '<ul id="lvl2">'; foreach($item->articles as $key->$article){ echo '<li>'.$article->title.'</li>'; } echo '</ul>'; echo '</li>'; } echo '</ul>'; }
@|title|, спасибо Вам большое за подсказки и отзывчивость. Только ни первый, ни второй код, к сожалению, не работает. Причём непонятно, почему. Нам сегодня ночью удалось вывести сборники с материалами с помощью вот этого кода: Код (PHP): <?php foreach ($this->items as $i => $item) { ?> <h3><?=$item->title?></h3> <?php foreach ($item->articles as $article) { ?> <p><?=$article->title?></p> <?php } ?> <?php } ?> Он очень похож на то, что Вы нам написали...Но почему Ваш код не работает, мы не видим. Сейчас мы пробуем заголовки материалов сделать кликабельными - чтобы название материала вело на текст материала.. Подскажите, пожалуйста, какие изменения нам нужно для этого внести в код? --- добавлено: 06.11.2015, первое сообщение размещено: 06.11.2015 --- @|title|, посидели сейчас над кодом, который Вы нам написали. Прочитали ещё раз всё внимательно (спасибо за такие развёрнутые пояснения). Нашли, почему Ваш код не хотел работать. Дело в этой строчке: foreach($item->articles as $key->$article){. Мы заменили её на foreach($item->articles as $article){ - и всё заработало! Вот этот рабочий код: Код (PHP): <?php foreach($this->items as $key=>$item){ echo '<div class="title">'.$item->title.'</div>'; echo '<ul id="lvl1">'; foreach($item->articles as $article){ echo '<li>'.$article->title.'</li>'; } echo '</ul>'; } ?> Только вот мы не можем разобраться, почему не работают ссылки на материалы...
Возможно вот так Код (PHP): <?php foreach($this->items as $key=>$item){ echo '<div class="title">'.$item->title.'</div>'; echo '<ul id="lvl1">'; foreach($item->articles as $article){ $link = JRoute::_("index.php?option=com_content&view=article&id=".$article->id."&catid=".$item->id); echo '<li><a href="'.$link.'">'.$article->title.'</a></li>'; } echo '</ul>'; } ?>
@|title|, работает, спасибо за ответ! Мы, правда, уже немного дальше шагнули: ссылки на материалы сделали и заключили наш список в таблицу. Вот что мы сейчас имеем: --- добавлено: 09.11.2015, первое сообщение размещено: 09.11.2015 --- Рядом с названиями сборников - кнопки редактирования (изменить название сборника, удалить сборник) Мы теперь бьёмся над тем, чтобы сделать названия сборников кликабельными: чтобы при нажатии на сборник материалы, которые в нём содержатся, открывались. А при повторном нажатии - скрывались. --- добавлено: 09.11.2015 --- Вот наш код для тела таблицы, которую вы видите на рисунке: Код (PHP): <tbody> <?php foreach ($this->items as $i => $item) : ?> <?php $canEdit = $user->authorise('core.edit', 'com_chmos'); ?> <?php if (!$canEdit && $user->authorise('core.edit.own', 'com_chmos')): ?> <?php $canEdit = JFactory::getUser()->id == $item->created_by; ?> <?php endif; ?> <tr> <?php if (isset($this->items[0]->state)): ?> <?php $class = ($canEdit || $canChange) ? 'active' : 'disabled'; ?> <td> <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) : '#'; ?>"> <?php if ($item->state == 1): ?> <i class="icon-publish"></i> <?php else: ?> <i class="icon-unpublish"></i> <?php endif; ?> </a> </td> <?php endif; ?> <?php if (isset($this->items[0]->id)): ?> <td> <?php echo $this->escape($item->title); ?> <?php endif; ?> <?php if ($canEdit || $canDelete): ?> <?php if ($canEdit): ?> <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> <?php endif; ?> <?php if ($canDelete): ?> <button data-item-id="<?php echo $item->id; ?>" class="btn btn-mini delete-button" type="button"><i class="icon-trash" ></i></button> <?php endif; ?> </td> <?php endif; ?> </tr> <tr> <td> <?php foreach($item->articles as $article){ echo '<li><a href="'.JRoute::_('index.php?option=com_content&view=article&id='.$article->id).'">'.$article->title.'</a></li>'; } ; ?> </td> </tr> <?php endforeach; ?> </tbody> --- добавлено: 09.11.2015 --- А вот код, который выводит список сборников с раскрывающимися материалами. Вот мы и думаем, как этот код вписать в таблицу... Код (PHP): <?php foreach($this->items as $key=>$item){ echo '<div>'; echo '<a href="javascript:collapsElement(\'identifikator'.$key.'\')" title="" rel="nofollow">'.$item->title.'</a>'; echo '<div id="identifikator'.$key.'" style="">'; foreach($item->articles as $article){ echo '<p><a href="'.JRoute::_('index.php?option=com_content&view=article&id='.$article->id).'">'.$article->title.'</a></p>'; } echo '</div>'; echo '</div>'; } ?> --- добавлено: 09.11.2015 --- @|title|, будем рады, если Вы захотите нам помочь.
@|title|, @woojin, спасибо Вам за отзывчивость! Мы последние три дня бьёмся над удалением сборников, так что пока отложили вопрос с таблицей.