Posted 14 сентября, 201410 yr comment_71347 Добрый вечер, уважаемые, попробую максимально точно обозначить ситуацию и ее проблему. Итак, на моем ipb стоит расширение Refferals System, которое нужно немного расширить, а если быть точным, то в таблицу, где выводятся реффералы пользователя нужно вывести и реффералов моих реффералов и их реффералов и так до определенной глубины вложенности. Переходим от слов к коду: <foreach loop="MyInvitedMembersLoop:$invited as $user"> <php> $this->DB->build(array('select' => 'name', 'from' => 'members', 'where' => 'dp3_rs_referred_by = '.$user['i_invited_id'])); $this->DB->execute(); while($row = $this->DB->fetch()) { $chlds[] = $row['name']; } print_r($chlds); </php> /*и так далее*/ Суть данного куска в том, что идет перебор тех самых реффералов. Потому как только стартует "родной" foreach плагина я начинаю искать по таблица дочерних реффералов моего рефферала (пока что стоит добиться результата на уровне вложенности 2, а там дело возьмет рекурсия и иже с ней). Итогом выполнения будет array $chlds. Консоль благополучно выдает нам значения этого array-я: Array ( [0] => СынПётра [1] => ДругПётра ) Но так как мы имеем дело с ipb, то не может быть речи о том, чтобы вывести нужные нам данные в foreach-у php вставки,- необходимо использовать тег <foreach> и вот как выглядит кусок вместе с ним: <foreach loop="MyInvitedMembersLoop:$invited as $user"> <php> $this->DB->build(array('select' => 'name', 'from' => 'members', 'where' => 'dp3_rs_referred_by = '.$user['i_invited_id'])); $this->DB->execute(); while($row = $this->DB->fetch()) { $chlds[] = $row['name']; } print_r($chlds); </php> <if test = "is_array($chlds)"> <foreach loop="$chlds as $chld"> <p>*{$chld}</p> </foreach> <else /> <p>null</p> </if> Итог - 4 null в месте вывода (по одному на рефферала) и плевки в журнал ошибок: Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225Array ( [0] => СынПётра [1] => ДругПётра ) Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225Array ( [0] => СынПётра [1] => ДругПётра ) Warning: Invalid argument supplied for foreach() in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 225 Из чего следуют 2 весьма бугуртные для меня вещи: 1. Где же я допустил ошибку в написании этого "форича" злосчастного; 2. Как так $chlds вообще не считается массивом (этот вывод основан на выводе <p>null</p> на страницу)? В 225 строке кэш файла как раз тот самый foreach, транслированный на php лад: $_ips___x_retval = ''; $__iteratorCount = 0; foreach( $chlds as $chld ) { $__iteratorCount++; $_ips___x_retval .= " <p>*{$chld}</p> "; /*и так далее*/ Маленькая добавка, если выводить содержимое этого же array-я в <php> аналогичным кодом, то все прекрасно выводится. На коленях стою... Edited 14 сентября, 201410 yr by lirfaum
14 сентября, 201410 yr comment_71348 Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме iPB, хотя там пару вопросов всего было на эту тему (что странно), пришлось поискать. Решение: <foreach loop="MyInvitedMembersLoop:$invited as $user"> <php> $chlds = array(); $this->DB->build(array('select' => 'name', 'from' => 'members', 'where' => 'dp3_rs_referred_by = '.$user['i_invited_id'])); $this->DB->execute(); while($row = $this->DB->fetch()) { $chlds[] = $row['name']; } $this->$chlds = $chlds; </php> <if test = "is_array($this->$chlds)"> <foreach loop="$this->$chlds as $chld"> <p>*{$chld}</p> </foreach> <else /> <p>null</p> </if>
15 сентября, 201410 yr Author comment_71355 Сам мучался с подобным. Казалось бы должно все работать, ан нет. Ответ есть на форуме iPB, хотя там пару вопросов всего было на эту тему (что странно), пришлось поискать. Решение: <foreach loop="MyInvitedMembersLoop:$invited as $user"> <php> $chlds = array(); $this->DB->build(array('select' => 'name', 'from' => 'members', 'where' => 'dp3_rs_referred_by = '.$user['i_invited_id'])); $this->DB->execute(); while($row = $this->DB->fetch()) { $chlds[] = $row['name']; } $this->$chlds = $chlds; </php> <if test = "is_array($this->$chlds)"> <foreach loop="$this->$chlds as $chld"> <p>*{$chld}</p> </foreach> <else /> <p>null</p> </if> Хотел было я уже возрадоваться, но не тут то было. Правка кода дала уже не warning, а полноценный error черным шрифтом на белой странице: Catchable fatal error: Object of class skin_referrals_1 could not be converted to string in /home/enfanter/public_html/logus/cache/skin_cache/cacheid_1/skin_referrals.php on line 259 Ссылается данная ошибка на данную строку: <if test = "is_array($this->$chlds)"> Не люблю дабл-постинг, но тем не менее. Я вывел нужную мне информацию немного другим путем (вывешиваю на случай, если у кого то будет схожая проблема и такое решение ему вполне угодит): <php> $chlds = array(); $pr_tbl = ''; $this->DB->build(array('select' => 'name', 'from' => 'members', 'where' => 'dp3_rs_referred_by = '.$user['i_invited_id'])); $this->DB->execute(); while($row = $this->DB->fetch()) { $chlds[] = $row['name']; } $pr_tbl .= "<p>".$user['name']."</p>"; if (!empty($chlds)) { $pr_tbl .= "<p>Дочерние рефералы:</p>"; foreach($chlds as $chld) { $pr_tbl .= "<p>*".$chld."</p>"; } } else $pr_tbl .= "<p>Дочерние рефералы отсутствуют</p>"; </php> {$pr_tbl} Но тем не менее, факт непонимания проблемы в попытке реализовать это предыдущим способом не убирает, посему тему прошу не закрывать, ведь с foreach-ем нужно будет столкнуться еще не раз и не два=)
15 сентября, 201410 yr comment_71376 Правка кода дала уже не warning, а полноценный error черным шрифтом на белой странице: Хм. У меня вот этот код на сайте работает без errorов <php> $cities=array(); if($this->request['city']){ $cities = $this->request['city']; }else{ foreach($data['records'] as $v){ $cities[] = $v['ads_city'];} } $cities = array_unique($cities); $this->cities = $cities; </php> <if test="is_array($this->cities)"> <foreach loop="$this->cities as $city"> {$city} </foreach> </if>
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.