Страница 1 из 1
Работа цикла в цикле
Добавлено: 15.11.2016 16:05
Slash
Здравствуйте.
Как я понимаю в phpBB цикл вывода информации в шаблон работает так (пример):
Код: Выделить всё
$sql = 'SELECT sc_id, sc_name
FROM ' . SC_TABLE;
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$sc_array = array(
'SC_NAME' => $row['sc_name'],
);
$this->template->assign_block_vars('sc', $sc_array);
}
$this->db->sql_freeresult($result);
Затем в шаблоне:
Код: Выделить всё
<!-- BEGIN sc -->
{sc.SC_NAME}
<!-- END sc -->
А как сделать вложенный цикл? У каждого
SC_NAME есть свой список "предметов" (в другой таблице) их надо выводить под
SC_NAME, как то так, что ли:
Код: Выделить всё
<!-- BEGIN sc -->
{sc.SC_NAME}
<!-- BEGIN subject -->
{sc.subject.URL}
<!-- END subject -->
<!-- END sc -->
Как такое провернуть, правильно?
Спасибо.
Re: Работа цикла в цикле
Добавлено: 15.11.2016 16:11
Sheer
Re: Работа цикла в цикле
Добавлено: 15.11.2016 16:16
Slash
Sheer, точно, блин!
Отправлено спустя 1 час 29 минут 40 секунд:
Ни чего не пойму... В шаблоне делаю так:
Код: Выделить всё
<!-- BEGIN sc -->
{sc.SC_NAME}
<!-- BEGIN subject -->
{sc.subject.URL}
<!-- END subject -->
<!-- END sc -->
По идею (по моей), должно идти сначала
sc.SC_NAME, ниже уже список
sc.subject.URL, а у меня наоборот, сначала список, затем его название...
Re: Работа цикла в цикле
Добавлено: 15.11.2016 17:51
Татьяна5
Slash, а в php как?
И действительно ли в исходном коде порядок поменялся, или через css всего лишь?
Re: Работа цикла в цикле
Добавлено: 15.11.2016 18:05
Slash
Татьяна5 писал(а): а в php как?
Код: Выделить всё
$sql = 'SELECT sc_id, sc_name
FROM ' . SC_TABLE;
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$sc_array = array(
'SC_ID' => $row['sc_id'],
'SC_NAME' => $row['sc_name'],
);
$id = $row['sc_id'];
$sql2 = 'SELECT smiley_id, code, smiley_url, smiley_width, smiley_height
FROM ' . SMILIES_TABLE . '
WHERE sc_id = ' . $id;
$result2 = $this->db->sql_query($sql2);
while ($row2 = $this->db->sql_fetchrow($result2))
{
$smiley = array(
'SMILEY_ID' => $row2['smiley_id'],
'CODE' => $row2['code'],
'SMILEY_URL' => $row2['smiley_url'],
'WIDTH' => $row2['smiley_width'],
'HEIGHT' => $row2['smiley_height'],
);
$this->template->assign_block_vars('sc.smiley', $smiley);
}
$this->db->sql_freeresult($result2);
$this->template->assign_block_vars('sc', $sc_array);
}
$this->db->sql_freeresult($result);
Код: Выделить всё
<!-- BEGIN sc -->
<strong>{sc.SC_NAME}</strong>
<!-- BEGIN smiley -->
<a href="#" onclick="insert_text('{sc.smiley.CODE}', true); return false;">
<img src="./images/smilies/{sc.smiley.SMILEY_URL}" width="{sc.smiley.WIDTH}" height="{sc.smiley.HEIGHT}" alt="{sc.smiley.CODE}" title="{sc.smiley.CODE}">
</a>
<!-- END smiley -->
<!-- END sc -->
Татьяна5 писал(а): И действительно ли в исходном коде порядок поменялся
В исходнике черт ногу сломит:
Код: Выделить всё
<strong></strong>
<a href="#" onclick="insert_text(';)', true); return false;">
<img src="./images/smilies/icon_e_wink.gif" width="15" height="17" alt=";)" title=";)">
</a>
<strong></strong>
<a href="#" onclick="insert_text(':(', true); return false;">
<img src="./images/smilies/icon_e_sad.gif" width="15" height="17" alt=":(" title=":(">
</a>
<strong></strong>
<a href="#" onclick="insert_text(':o', true); return false;">
<img src="./images/smilies/icon_e_surprised.gif" width="15" height="17" alt=":o" title=":o">
</a>
<strong></strong>
<a href="#" onclick="insert_text(':shock:', true); return false;">
<img src="./images/smilies/icon_eek.gif" width="15" height="17" alt=":shock:" title=":shock:">
</a>
<strong></strong>
<a href="#" onclick="insert_text(':?', true); return false;">
<img src="./images/smilies/icon_e_confused.gif" width="15" height="17" alt=":?" title=":?">
</a>
<strong>Первая категоря</strong>
Почему то повторяется стронг, там где он не должен быть...
Re: Работа цикла в цикле
Добавлено: 15.11.2016 18:52
Татьяна5
А если так?
Код: Выделить всё
$sql = 'SELECT sc_id, sc_name
FROM ' . SC_TABLE;
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$sc_array = array(
'SC_ID' => $row['sc_id'],
'SC_NAME' => $row['sc_name'],
);
$this->template->assign_block_vars('sc', $sc_array);
$id = $row['sc_id'];
$sql2 = 'SELECT smiley_id, code, smiley_url, smiley_width, smiley_height
FROM ' . SMILIES_TABLE . '
WHERE sc_id = ' . $id;
$result2 = $this->db->sql_query($sql2);
while ($row2 = $this->db->sql_fetchrow($result2))
{
$smiley = array(
'SMILEY_ID' => $row2['smiley_id'],
'CODE' => $row2['code'],
'SMILEY_URL' => $row2['smiley_url'],
'WIDTH' => $row2['smiley_width'],
'HEIGHT' => $row2['smiley_height'],
);
$this->template->assign_block_vars('sc.smiley', $smiley);
}
$this->db->sql_freeresult($result2);
}
$this->db->sql_freeresult($result);
Только запрос в цикле - это полнейший кошмар, надо переписывать всё в один запрос (
LEFT JOIN
'ом бы таблицу присоединила)
Re: Работа цикла в цикле
Добавлено: 15.11.2016 19:13
Sheer
Вложенные циклы Для наглядности
Код: Выделить всё
<?php
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
// Start session
$user->session_begin();
$auth->acl($user->data);
$user->setup();
for($i=0; $i < 5; $i++)
{
$template->assign_block_vars('rows', array(
'ID' => $i,
)
);
for($j = $i; $j < 5; $j++)
{
$template->assign_block_vars('rows.cols', array(
'J' => $j,
)
);
}
}
page_header();
$template->set_filenames(array(
'body' => 'test.html')
);
page_footer();
test.html
Код: Выделить всё
<!-- INCLUDE overall_header.html -->
<table>
<!-- BEGIN rows -->
<tr>
<td>Row: {rows.ID}|</td>
<!-- BEGIN cols -->
<td> {rows.cols.J} </td>
<!-- END cols -->
</tr>
<!-- END rows -->
</table>
<!-- INCLUDE overall_footer.html -->
Татьяна5 писал(а): Только запрос в цикле - это полнейший кошмар
Совершенно согласен.
Re: Работа цикла в цикле
Добавлено: 16.11.2016 2:22
Slash
Татьяна5, спасибо, так работает правильно. Всего то строчку переставить...
Татьяна5 писал(а): Только запрос в цикле - это полнейший кошмар
Я только учусь!
Пока не пойму, как правильно объединить запрос, чтобы с одной таблицы была одна запись, с другой целый список...
Re: Работа цикла в цикле
Добавлено: 16.11.2016 5:30
Slash
Как можно сделать одним запросом?
Re: Работа цикла в цикле
Добавлено: 16.11.2016 10:36
Татьяна5
Примерно так (не проверяла)
Код: Выделить всё
SELECT sc.sc_id, sc.sc_name, sm.smiley_id, sm.code, sm.smiley_url, sm.smiley_width, sm.smiley_height
FROM ' . SC_TABLE . ' sc
LEFT JOIN ' . SMILIES_TABLE . ' sm
ON sm.sc_id = sc.sc_id
Или, скорей, наоборот, к таблице смайлов
JOIN
'ить таблицу категорий
Re: Работа цикла в цикле
Добавлено: 16.11.2016 10:59
Slash
Татьяна5, Ваш запрос вытягивает такой массив:
Код: Выделить всё
Array
(
[sc_id] => 1
[sc_name] => NAME
[smiley_id] => 16
[code] => :shock:
[smiley_url] => icon_eek.gif
[smiley_width] => 15
[smiley_height] => 17
)
Татьяна5 писал(а): Или, скорей, наоборот, к таблице смайлов JOIN'ить таблицу категорий
Об это тоже думаю, но получится, что название категорий будет выводится столько раз, сколько смайликов в категории...
Re: Работа цикла в цикле
Добавлено: 16.11.2016 11:08
Татьяна5
Так потом средствами php надо всё пересортировывать, к виду
Код: Выделить всё
[sc_id] =>
Array
(
'name' => [sc_name]
[smiley_id] =>
Array
(
[code] => :shock:
[smiley_url] => icon_eek.gif
[smiley_width] => 15
[smiley_height] => 17
)
[smiley_id] =>
Array
(
[code] => :shock:
[smiley_url] => icon_eek.gif
[smiley_width] => 15
[smiley_height] => 17
)
[smiley_id] =>
Array
(
[code] => :shock:
[smiley_url] => icon_eek.gif
[smiley_width] => 15
[smiley_height] => 17
)
)
Re: Работа цикла в цикле
Добавлено: 16.11.2016 16:45
Татьяна5
Или по этой схеме ещё можно
Синтаксис HTML вывод ЦИКЛа В ЦИКЛЕ (смысл тот же, но с двумя массивами структура выходит проще)
Re: Работа цикла в цикле
Добавлено: 17.11.2016 6:42
Slash
Сделал так:
Код: Выделить всё
$scs = array();
$sql = 'SELECT sc_id, sc_name
FROM ' . SC_TABLE;
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$scs[] = $row;
}
$this->db->sql_freeresult($result);
$smilies = array();
$sql = 'SELECT smiley_id, code, smiley_url, smiley_width, smiley_height, sc_id
FROM ' . SMILIES_TABLE . '
WHERE sc_id > 0';
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$smilies[] = $row;
}
$this->db->sql_freeresult($result);
foreach ($scs as $sc)
{
$this->template->assign_block_vars('sc', array(
'SC_ID' => $sc['sc_id'],
'SC_NAME' => $sc['sc_name'],
));
foreach ($smilies as $smilie)
{
if ($sc['sc_id'] == $smilie['sc_id'])
{
$this->template->assign_block_vars('sc.smiley', array(
'SMILEY_ID' => $smilie['smiley_id'],
'CODE' => $smilie['code'],
'SMILEY_URL' => $smilie['smiley_url'],
'WIDTH' => $smilie['smiley_width'],
'HEIGHT' => $smilie['smiley_height'],
));
unset($smilie);
}
}
}
Татьяна5, чтоб я делал без Вас?!
rose.png