Проблема с <-- BEGIN -->

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Eugeny1987
phpBB 1.4.1
Сообщения: 43
Стаж: 14 лет 6 месяцев
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Проблема с <-- BEGIN -->

Сообщение Eugeny1987 »

Решил сделать свою главную страницу для форума, которая будет использоваться вместо главной сайта.

Создаю двухуровневое меню.
Двумя запросами выбираю
а. элементы с parent_id = 0
б. элементы с parent_id > 0

функция выборки

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

    function display_menu() {
        global $db, $auth, $user, $template;
        global $phpbb_root_path, $phpEx, $config;
        $sql = 'SELECT * FROM '.PORTAL_CATEGORY.' WHERE `parent_id` = 0';
        $result = $db->sql_query($sql);
        if ($row = $db->sql_fetchrow($result))
        {
            do {
                $template->assign_block_vars('categories', array(
                    'CATEGORY_TITLE'    => $row['title'],
                    'CATEGORY_LINK'        => append_sid("{$phpbb_root_path}viewcategory.$phpEx", 'c=' . $row['id']),
                    'CATEGORY_ID'        => $row['id'],
                    'CATEGORY_DESC'        => $row['description']
                ));
            }
            while ($row = $db->sql_fetchrow($result));
        }
        $db->sql_freeresult($result);
        $sql = 'SELECT * FROM '.PORTAL_CATEGORY.' WHERE `parent_id` > 0 ';
        $result = $db->sql_query($sql);
        if ($row = $db->sql_fetchrow($result)) {
            do {
                $template->assign_block_vars('categories.subcategories', array(
                    'CATEGORY_TITLE'    => $row['title'],
                    'CATEGORY_LINK'        => append_sid("{$phpbb_root_path}viewcategory.$phpEx", 'c=' . $row['id']),
                    'CATEGORY_PARENT'    => $row['parent_id'],
                    'CATEGORY_ID'        => $row['id'],
                    'CATEGORY_DESC'        => $row['description']
                ));
            }
            while ($row = $db->sql_fetchrow($result));
        }
        $db->sql_freeresult($result);
    } 
Проблема в том что вложенный блок оказывается снаружи главного.

Шаблон менюшки:

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

<!-- BEGIN categories -->
    <tr>
    	<td class="row1" width="32" height="32">{TOPIC_FOLDER_IMG}{categories.CATEGORY_ID}</td>
        <td class="row1" style="padding-left:12px;"><a href="{categories.CATEGORY_LINK}" title="{categories.CATEGORY_DESC}" class="forumlink">{categories.CATEGORY_TITLE}</a>
		</td>
	</tr>
    <!-- BEGIN subcategories -->
		    <tr>
    		<td class="row1" width="32" height="32">{categories.subcategories.CATEGORY_PARENT}</td>
		    <td class="row1" style="padding-left:12px;">
				<li><a href="{categories.subcategories.CATEGORY_LINK}" title="{categories.subcategories.CATEGORY_DESC}" class="forumlink">{categories.subcategories.CATEGORY_TITLE}</a></li>
			</td>
		</tr>
	<!-- END subcategories -->

<!-- END categories -->
Как я думаю, то с таким шаблоном должно выводиться так:
Без имени-2.jpg
Но выводится так:
Без имени-1.jpg
С проверкой

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

<!-- BEGIN categories -->
    <tr>
    	<td class="row1" width="32" height="32">{TOPIC_FOLDER_IMG}{categories.CATEGORY_ID}</td>
        <td class="row1" style="padding-left:12px;"><a href="{categories.CATEGORY_LINK}" title="{categories.CATEGORY_DESC}" class="forumlink">{categories.CATEGORY_TITLE}</a>
		</td>
	</tr>
    <!-- BEGIN subcategories -->
    	<!-- IF categories.subcategories.CATEGORY_PARENT == categories.CATEGORY_ID -->
		    <tr>
    		<td class="row1" width="32" height="32">{categories.subcategories.CATEGORY_PARENT}</td>
		    <td class="row1" style="padding-left:12px;">
				<li><a href="{categories.subcategories.CATEGORY_LINK}" title="{categories.subcategories.CATEGORY_DESC}" class="forumlink">{categories.subcategories.CATEGORY_TITLE}</a></li>
			</td>
		</tr>
        <!-- ENDIF -->
	<!-- END subcategories -->
<!-- END categories -->
Не отображается второй блок.

Подскажите как решить эту проблему.
Версия PHPBB - 3.0.10
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Eugeny1987 24.03.2012 18:48, всего редактировалось 2 раза.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Проблема с <-- BEGIN -->

Сообщение Sheer »

Не вдаваясь... Попробуй

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

$template->assign_block_vars('subcategories', array( 
ну и в шаблоне соответственно.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с <-- BEGIN -->

Сообщение rxu »

Sheer
В этой части всё правильно. Алгоритм, видимо, другой должен быть.
Изображение
Eugeny1987
phpBB 1.4.1
Сообщения: 43
Стаж: 14 лет 6 месяцев
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Проблема с <-- BEGIN -->

Сообщение Eugeny1987 »

исправил

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

$template->assign_block_vars('subcategories', array(
в шаблоне тоже исправил

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

<!-- BEGIN categories -->
    <tr>
    	<td class="row1" width="32" height="32">{TOPIC_FOLDER_IMG}{categories.CATEGORY_ID}</td>
        <td class="row1" style="padding-left:12px;"><a href="{categories.CATEGORY_LINK}" title="{categories.CATEGORY_DESC}" class="forumlink">{categories.CATEGORY_TITLE}</a>
		</td>
	</tr>
    <!-- BEGIN subcategories -->
		    <tr>
    		<td class="row1" width="32" height="32">{subcategories.CATEGORY_PARENT}</td>
		    <td class="row1" style="padding-left:12px;">
				<li><a href="{subcategories.CATEGORY_LINK}" title="{subcategories.CATEGORY_DESC}" class="forumlink">{subcategories.CATEGORY_TITLE}</a></li>
			</td>
		</tr>
	<!-- END subcategories -->
<!-- END categories -->
Внутренний блок вообще перестал отображаться.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Проблема с <-- BEGIN -->

Сообщение Sheer »

А...ну да.. ступил. В твоем первоначальном варианте должно быть

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

<!-- BEGIN categories.subcategories -->
Кажись так...
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Eugeny1987
phpBB 1.4.1
Сообщения: 43
Стаж: 14 лет 6 месяцев
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Проблема с <-- BEGIN -->

Сообщение Eugeny1987 »

пробовал и так
ошибка
Parse error: syntax error, unexpected '=' in E:\home\localhost\www\volfshantse\forum\includes\template.php(668) : eval()'d code on line 8
Аватара пользователя
Палыч
Former team member
Сообщения: 9683
Стаж: 20 лет 4 месяца
Откуда: Питер
Благодарил (а): 3 раза
Поблагодарили: 454 раза

Re: Проблема с <-- BEGIN -->

Сообщение Палыч »

Eugeny1987 писал(а):пробовал и так
А end не забыли? <!-- END categories.subcategories -->
Не все то WINDOWS, что висит... phpBB только учусь.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.
Eugeny1987
phpBB 1.4.1
Сообщения: 43
Стаж: 14 лет 6 месяцев
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Проблема с <-- BEGIN -->

Сообщение Eugeny1987 »

Палыч писал(а):
Eugeny1987 писал(а):пробовал и так
А end не забыли? <!-- END categories.subcategories -->
Нет не забыл.
Аватара пользователя
Палыч
Former team member
Сообщения: 9683
Стаж: 20 лет 4 месяца
Откуда: Питер
Благодарил (а): 3 раза
Поблагодарили: 454 раза

Re: Проблема с <-- BEGIN -->

Сообщение Палыч »

Eugeny1987
Возможно выборку >0 нужно делать в конце каждого шага выборки =0

Добавлено спустя 35 секунд:
Синтаксис HTML в первом посте правильный
Не все то WINDOWS, что висит... phpBB только учусь.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Проблема с <-- BEGIN -->

Сообщение Sheer »

Выборку надо делать не по parent_id > 0 а по parent_id = id родителя. Как я понимаю, у вас подкатегория имеет родителем какую-то категорию, хотя, что у вас там за структура таблицы неизвестно. Но вот на примере с форумами (категориями (parent_id=0) и форумами) у меня получилось так

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

<?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 management
$user->session_begin();
$auth->acl($user->data);
$user->setup();
        $sql = 'SELECT forum_id, forum_name
            FROM ' . FORUMS_TABLE . ' WHERE parent_id = 0';
        $result = $db->sql_query($sql);

        while ($cat_row = $db->sql_fetchrow($result))
        {

            $template->assign_block_vars('cat_row', array(
                'ID'         => $cat_row['forum_id'],
                'NAME'         => $cat_row['forum_name'],
            )
            );

            $sql_sub = 'SELECT forum_id, forum_name
                FROM ' . FORUMS_TABLE . ' WHERE parent_id = '.$cat_row['forum_id'].'';
            $res = $db->sql_query($sql_sub);

            while ($sub_row = $db->sql_fetchrow($res))
            {
                $template->assign_block_vars('cat_row.sub_row', array(
                    'ID'         => $sub_row['forum_id'],
                    'NAME'         => $sub_row['forum_name'],
                )
                );
            }
            $db->sql_freeresult($res);
        }
        $db->sql_freeresult($result);

// Output the page
page_header('Header');

$template->set_filenames(array(
    'body' => 'cat.html')
);
page_footer();
?>
Шаблон cat.php

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

<!-- INCLUDE simple_header.html -->
<table>
<!-- BEGIN cat_row -->
	<tr>
		<td><b>{cat_row.ID}</b></td>
		<td><b>{cat_row.NAME}</b></td>
	<tr>
	<!-- BEGIN sub_row -->
		<tr>
			<td>&bull; {sub_row.ID} -- </td>
			<td>{sub_row.NAME}</td>
		</tr>
	<!-- END sub_row -->
<!-- END cat_row -->
</table>
<!-- INCLUDE simple_footer.html -->
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Eugeny1987
phpBB 1.4.1
Сообщения: 43
Стаж: 14 лет 6 месяцев
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Проблема с <-- BEGIN -->

Сообщение Eugeny1987 »

структура таблицы:

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

CREATE TABLE IF NOT EXISTS `phpbb_portal_category` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `parent_id` mediumint(9) NOT NULL DEFAULT '0',
  `title` varchar(50) NOT NULL,
  `description` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Sheer,
ваш код адаптировал под свою таблицу, все выводится
только получаются лишние запросы к базе.

вот только остался вопрос, почему первый код не сработал.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Проблема с <-- BEGIN -->

Сообщение Sheer »

Eugeny1987 писал(а):только получаются лишние запросы к базе
Ну а как там иначе?
Ок. Вот вообще с одним запросом

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

<?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 management
$user->session_begin();
$auth->acl($user->data);
$user->setup();

    $forum_rows = array();
    $parent_id = $branch_root_id = 0;
      $root_data = array('forum_id' => 0);
    $sql = 'SELECT f.* FROM ('. FORUMS_TABLE .' f) ORDER BY f.left_id';
    $result = $db->sql_query($sql);
    while ($row = $db->sql_fetchrow($result))
    {
        $forum_id = $row['forum_id'];
        if ($row['parent_id'] == $root_data['forum_id'] || $row['parent_id'] == $branch_root_id)
        {
            $parent_id = $forum_id;
            $forum_rows[$forum_id] = $row;

            if ($row['parent_id'] == $root_data['forum_id'])
            {
                $branch_root_id = $forum_id;
            }
        }
    }
    $db->sql_freeresult($result);

    foreach ($forum_rows as $row)
    {
        if ($row['parent_id'] == $root_data['forum_id'])
        {
            $template->assign_block_vars('forumrow', array(
                'S_IS_CAT'        => true,
                'FORUM_ID'        => $row['forum_id'],
                'FORUM_NAME'    => $row['forum_name'],
                )
            );
            continue;
        }

        $template->assign_block_vars('forumrow', array(
            'S_IS_CAT'        => false,
            'FORUM_ID'        => $row['forum_id'],
            'FORUM_NAME'    => $row['forum_name'],
            )
        );
    }
page_header('Header');
$template->set_filenames(array(
    'body' => 'cat.html')
);
page_footer();
?>

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

<!-- INCLUDE simple_header.html -->
<table>
<!-- BEGIN forumrow -->
	<tr>
		<td>{forumrow.FORUM_ID}</td>
		<td><!-- IF forumrow.S_IS_CAT --><b><!-- ENDIF -->{forumrow.FORUM_NAME}<!-- IF forumrow.S_IS_CAT --></b><!-- ENDIF --></td>
<!-- END forumrow -->
</table>
<!-- INCLUDE simple_footer.html -->
Но... почувствуйте разницу... left_id
Значит надо приводить вашу таблицу в соответствующий вид, чтобы было понятно, какая категория за какой идет, какая выше, а какая ниже.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с <-- BEGIN -->

Сообщение rxu »

Для понимания принципов хранения иерархических структур в БД, полезна статья: http://www.sitepoint.com/hierarchical-data-database/
Изображение
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3365
Стаж: 17 лет 6 месяцев
Благодарил (а): 37 раз
Поблагодарили: 1454 раза

Re: Проблема с <-- BEGIN -->

Сообщение Nekstati »

$template->assign_block_vars()
<!-- BEGIN categories.subcategories -->
Использование циклов в шаблоне для построения меню, имхо, неправильно, это лишние сложности себе на голову. В случае со списками форумов/тем это ещё оправдано сложностью HTML-кода, а в случае с меню, где код представляет собой простые <ul><li> или <tr><td>, не оправдано. Гораздо проще делать меню целиком в PHP и выводить в шаблон с помощью одной переменной. Напр.: Многоступенчатое выпадающее меню.
Eugeny1987
phpBB 1.4.1
Сообщения: 43
Стаж: 14 лет 6 месяцев
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Проблема с <-- BEGIN -->

Сообщение Eugeny1987 »

Всем спасибо!
Буду разбираться дальше.

Добавлено спустя 30 минут 52 секунды:
Сделал так

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

		$sql = 'SELECT * FROM '.PORTAL_CATEGORY.' WHERE `parent_id` > 0 ';
		$submenu_result = $db->sql_query($sql);
		while ($subrow = $db->sql_fetchrow($submenu_result)) {
			$submenu[] = $subrow;
		}
		$db->sql_freeresult($submenu_result);
		$sql = 'SELECT * FROM '.PORTAL_CATEGORY.' WHERE `parent_id` = 0';
		$menu = $db->sql_query($sql);
		while ($row = $db->sql_fetchrow($menu)) {
			$template->assign_block_vars('categories', array(
				'CATEGORY_TITLE'	=> $row['title'],
				'CATEGORY_LINK'		=> append_sid("{$phpbb_root_path}viewcategory.$phpEx", 'c=' . $row['id']),
				'CATEGORY_ID'		=> $row['id'],
				'CATEGORY_PARENT'	=> 0,
				'CATEGORY_DESC'		=> $row['description']
			));
			foreach ( $submenu as $val ) {
				if ( $val['parent_id'] == $row['id'] ) {
					$template->assign_block_vars('categories', array(
						'CATEGORY_TITLE'	=> $val['title'],
						'CATEGORY_PARENT'	=> $val['parent_id'],
						'CATEGORY_LINK'		=> append_sid("{$phpbb_root_path}viewcategory.$phpEx", 'c=' . $val['id']),
						'CATEGORY_ID'		=> $val['id'],
						'CATEGORY_DESC'		=> $val['description']
					));	
				}
			}
		}
		$db->sql_freeresult($menu);
шаблон

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

<!-- BEGIN categories -->
    <tr>
    	<td class="row1" width="32" height="32">{categories.CATEGORY_ID}</td>
        <!-- IF categories.CATEGORY_PARENT > 0 -->
			<td class="row1" style="padding-left:12px;"><li><a href="{categories.CATEGORY_LINK}" title="{categories.CATEGORY_DESC}" class="forumlink">{categories.CATEGORY_TITLE}</a></li>
		<!-- ELSE -->
			<td class="row1" style="padding-left:12px;"><a href="{categories.CATEGORY_LINK}" title="{categories.CATEGORY_DESC}" class="forumlink">{categories.CATEGORY_TITLE}</a>
        <!-- ENDIF -->
		</td>
	</tr>
<!-- END categories -->
Все работает.

Вернуться в «Для авторов (phpBB 3.0.x)»