Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Работа цикла в цикле

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 13 лет 1 месяц
Благодарил (а): 101 раз
Поблагодарили: 79 раз
Контактная информация:

Работа цикла в цикле

Сообщение 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 -->
Как такое провернуть, правильно?
Спасибо.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Работа цикла в цикле

Сообщение Sheer »

Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 13 лет 1 месяц
Благодарил (а): 101 раз
Поблагодарили: 79 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Slash »

Sheer, точно, блин! :oops:

Отправлено спустя 1 час 29 минут 40 секунд:
Ни чего не пойму... В шаблоне делаю так:

Код: Выделить всё

<!-- BEGIN sc -->
    {sc.SC_NAME}
    <!-- BEGIN subject -->
        {sc.subject.URL}
    <!-- END subject -->
<!-- END sc -->
По идею (по моей), должно идти сначала sc.SC_NAME, ниже уже список sc.subject.URL, а у меня наоборот, сначала список, затем его название...
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Татьяна5 »

Slash, а в php как?
И действительно ли в исходном коде порядок поменялся, или через css всего лишь?
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 13 лет 1 месяц
Благодарил (а): 101 раз
Поблагодарили: 79 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение 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>
Почему то повторяется стронг, там где он не должен быть...
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Татьяна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'ом бы таблицу присоединила)
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Работа цикла в цикле

Сообщение 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>&nbsp;{rows.cols.J}&nbsp;</td>
	<!-- END cols -->
</tr>
<!-- END rows -->
</table>
<!-- INCLUDE overall_footer.html -->
Татьяна5 писал(а): Только запрос в цикле - это полнейший кошмар
Совершенно согласен.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 13 лет 1 месяц
Благодарил (а): 101 раз
Поблагодарили: 79 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Slash »

Татьяна5, спасибо, так работает правильно. Всего то строчку переставить...
Татьяна5 писал(а): Только запрос в цикле - это полнейший кошмар
Я только учусь!
Пока не пойму, как правильно объединить запрос, чтобы с одной таблицы была одна запись, с другой целый список...
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 13 лет 1 месяц
Благодарил (а): 101 раз
Поблагодарили: 79 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Slash »

Как можно сделать одним запросом?
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Татьяна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'ить таблицу категорий
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 13 лет 1 месяц
Благодарил (а): 101 раз
Поблагодарили: 79 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение 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'ить таблицу категорий
Об это тоже думаю, но получится, что название категорий будет выводится столько раз, сколько смайликов в категории...
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Татьяна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
    )
)
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение Татьяна5 »

Или по этой схеме ещё можно Синтаксис HTML вывод ЦИКЛа В ЦИКЛЕ (смысл тот же, но с двумя массивами структура выходит проще)
Аватара пользователя
Slash
phpBB 2.0.10
Сообщения: 794
Стаж: 13 лет 1 месяц
Благодарил (а): 101 раз
Поблагодарили: 79 раз
Контактная информация:

Re: Работа цикла в цикле

Сообщение 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
Ответить

Вернуться в «Для разработчиков»