Перейти к контенту

Вопросы по скрипту для IPB (?autocom=...)


Рекомендуемые сообщения

Привет.

 

Назрело несколько вопросов...

А точнее - нужна помощь по скрипту.

Что есть на данный момент: работающий ?autocom=... , выводящий данные из скина в скрипт (т.е., фактически, голая страница с дизайном форума, выводящая через add_output определенную часть шаблона.

Раньше занимался извращениями, вроде:

...->add_output('<!--exec.file="мой_скрипт.php"--> ');

Теперь хочу понять немного суть непосредственной работы с таким методом.

Как я понимаю, переменные и условия задаются непосредственно в скрипте, а данные для вывода грузятся из шаблона. ОК.

Вопрос 1:

Реализовать вывод значений переменных через шаблон.

Т.е., скажем, если я прописываю в скрипте:

$name = 1;

 

А в шаблоне - "Привет, {$name}!", естественно, ничего не работает.

 

Вопрос 2:

Как в IPB идет работа с методом GET?

Допустим, хочу реализовать такой вывод:

?autocom=helloworld&hellouser=1.

 

 

Заранее спасибо.

Если уже есть мануалы по какому-то из вопросов - ткните носом, plz.

Ссылка на комментарий
Поделиться на других сайтах

А в шаблоне - "Привет, {$name}!", естественно, ничего не работает.

В каждом шаблоне есть входящие переменные, они видны в нём. Передаются как парамеры при вызове

$html = $this->ipsclass->compiled_templates['skin_группа']->имя_шаблона($переменная);

Примеров тьма в скриптах форума, например в ./sources/action_public/*.php.

 

Как в IPB идет работа с методом GET?

Допустим, хочу реализовать такой вывод:

?autocom=helloworld&hellouser=1.

Работа с $_GET всегда идёт одинаково, этот массив никуда не девается. Разве что глобальные массивы $_GET, $_POST, $_COOKIE, $_REQUEST немного очищаются, на предмет наличия в них ../, на случай, если очень глупые люди будут передавать в параметрах имена файлов. Подробнее смотрите функцию parse_incoming() из ipsclass.

 

Кроме того, можно использовать содержимое массива $this->ipsclass->input[]. В него попадают параметры, переданные скрипту через GET и POST, вторые записываются поверх первых, с очищенными ключами и значениями. Значения проверяются на предмет защиты от XSS.

 

Имхо, лучший способ научиься это делать, смотреть код уже написанных компонентов. Есть простые, такие как репутация, например.

Ссылка на комментарий
Поделиться на других сайтах

Отлично, почти разобрался!

 

Теперь такой трабл. ГЕТ-вывод с помощью ipsclass->input.

 

Выглядит примерно так (часть кода)...

 

$klan = (int) $this->ipsclass->input['klan'];

.......

$query_klanlist = "SELECT name, ballans, last_activity FROM `prefix_members` WHERE klan = $klan";
if (!($result_klanlist = mysql_db_query($INFO['sql_database'], $query_klanlist))){	echo  mysql_errno(), mysql_error();  return 0; }
while($row_klanlist = mysql_fetch_array($result_klanlist))
{

$html2 ="<tr>
<td>".$row_klanlist['name']."</td>
<td>".$this->ipsclass->get_date($row_klanlist['last_activity'], 'SHORT')."</td>
<td>".$row_klanlist['ballans']."</td>
</tr>";


$ipsclass->print->add_output($html2);


};

 

Вот...

Надо сделать как-то тут проверку - вот в этой области:

WHERE klan = $klan

 

Т.е. если значения $klan нет в табле, то надо сделать вывод ошибки.

 

Обращение проходит через запрос ?autocom=script?klan=число.

 

Разумеется, любой может ввести несуществующее число, и скрипт проселектит пустоту.

 

Вот, хочу этого избежать.

 

Есть способы?

 

Спасибо.

Ссылка на комментарий
Поделиться на других сайтах

Нет-нет-нет. Еще разбираться и разбираться.)

 

Все запросы следует делать через конструкции вида:

 

$this->ipsclass->DB->simple_construct(array(
$this->ipsclass->DB->simple_exec();

#Если ничего не нашли, вывести ошибку
if(!$this->ipsclass->DB->get_num_rows())
{
  $this->ipsclass->Error(
}

#Если скрипт не прервался ошибкой выше, то разбираем ряды, полученные из таблицы
while($row_klanlist = $this->ipsclass->DB->fetch_row())
{
...
}

 

Записи такого рода встречаются практически в каждом файле в папке /sources. Смотрите, как и что там написано, и делайте по аналогии. Разобраться очень просто.)

Изменено пользователем WildRAID
Ссылка на комментарий
Поделиться на других сайтах

+ к тому что сказал WildRAID:

Если у вас вдруг появился $ipsclass, вы его через global объявляете? Ну сходите хоть-бя и ко мне в подпись, там есть относительно хороший пример. По крайней мере он приучит к красивому оформлению кода. При всём уважении к IPB 1.3, Song'у, Matt'у хочу сказать, что читать код 2.1 намного приятнее и быстрее. Про большинство скриптов, которые можно найти в сети, включая бесплатные форумные и другие движки, я уже не говорю, это вообще атас.

 

И ещё: а зачем мод кланов писать с нуля? :D

Ссылка на комментарий
Поделиться на других сайтах

Ммм) Спасибо. Просто я как-то больше на примерах (в данном случае запрос и вывод запроса из кода FatCat)...:D

Т.к. это "чистый" PHP, а в работе с ipsclass я почти не разбираюсь) Но, думаю, сегодня вечерком придется переписывать...

 

 

И ещё: а зачем мод кланов писать с нуля?

 

1. Member Teams не совсем подходит по функционалу.

2. Необходима интеграция с Army System...;)

Ссылка на комментарий
Поделиться на других сайтах

При всём уважении к IPB 1.3, Song'у, Matt'у хочу сказать, что читать код 2.1 намного приятнее и быстрее.

гыг :D

 

Приятней? Чем?

В этом коде не видно всего запроса, поэтому сразу трудно сориентироваться какой запрос получиться, соответственно сложней подправить его и вообще понять его сложно. А значит сложней и отладить и программировать.

Он компактней. Но "компактный" не синоним слова "приятный".

А подзапрос написать? А джойн написать? Вот это изврат так изврат.

Для простых запросов select a from t where b=c я согласен будет компактно.

А подставить другой префикс? А подставить другую базу? Тут даже без бутылки не разберёшься куда это подставлять.

 

Быстрее? Чем же? Ведь для компоновки запроса из этих частей надо выполнить кучу функций, посмотрел бы в классе как они там одна из другой вызываются. И где ж тут скорость прости?

А когда я вызываю $DB->query, последний вызывается сразу mysql_query тогда как в твоём способе до mysql_query дело дойдёт только через 10-ые руки.

Ссылка на комментарий
Поделиться на других сайтах

Ох...и вправду - учится и учится!..

Облегчил свой код на 5кб благодаря ipsclass'y))

 

Кстати.

 

$this->ipsclass->simple_construct(array(

$this->ipsclass->simple_exec();

 

$this->ipsclass->DB->simple_construct(array(..........

$this->ipsclass->DB->simple_exec();

 

у меня так только вышло...

 

Но все равно спасибо огромное)

 

 

добавлено:

 

Вот вопрос по меню навигации...

 

$this->ipsclass->print->do_output( array('NAV' =...) )

 

Я вот не знаю, как это использовать...чтобы выводилось в nav-menu нечто вроде...

 

Название форума>Текст

Ссылка на комментарий
Поделиться на других сайтах

Необходимо в NAV передать простой массив с нужным текстом\ссылками.

 

Например, чтобы получилось такое NAV-меню, как в этой теме, передаём следующее:

 

$nav[] = '<a href="http://www.ibresource.ru/forums/index.php?showforum=52">Другое</a>';
$nav[] = '<a href="http://www.ibresource.ru/forums/index.php?showforum=11">Программирование</a>';

$this->ipsclass->print->do_output( array('NAV' => $nav) );

 

Имхо, лучший способ научиься это делать, смотреть код уже написанных компонентов. Есть простые, такие как репутация, например.

 

Самый лучший совет.) Очень рекомендую ему следовать.

Ссылка на комментарий
Поделиться на других сайтах

При всём уважении к IPB 1.3, Song'у, Matt'у хочу сказать, что читать код 2.1 намного приятнее и быстрее.

гыг :D

 

Приятней? Чем?

В этом коде не видно всего запроса, поэтому сразу трудно сориентироваться какой запрос получиться, соответственно сложней подправить его и вообще понять его сложно. А значит сложней и отладить и программировать.

Он компактней. Но "компактный" не синоним слова "приятный".

А подзапрос написать? А джойн написать? Вот это изврат так изврат.

Для простых запросов select a from t where b=c я согласен будет компактно.

А подставить другой префикс? А подставить другую базу? Тут даже без бутылки не разберёшься куда это подставлять.

Я же не призываю использовать эти функции для озвученных тобой целей. Вот только запросы с префиксами другими, подзапросами бывают редко, а те, кто их используют, знают и без меня, как писать ;) Кроме того, для запросов есть ещё ./sources/sql/, о котором не стоит забывать, я бы использовал для сложных запросов именно его("кеш", как они это называют). Так что не стоит воспринимать это так близко к сердцу, я же не тебя учу :)

 

А удобство заключается в основном не в использовании авторами build_query и т.д., а в нормальном оформлении кода, чего топикстартеру явно не хватает. И раз уж во всём коде использует подход с классов БД, то его хорошо бы всегда придерживаться, дабы не плодить путаницу. А то будет писать свои велосипеды, о чём ниже написал.

 

Быстрее? Чем же? Ведь для компоновки запроса из этих частей надо выполнить кучу функций, посмотрел бы в классе как они там одна из другой вызываются. И где ж тут скорость прости?

А когда я вызываю $DB->query, последний вызывается сразу mysql_query тогда как в твоём способе до mysql_query дело дойдёт только через 10-ые руки.

Немного не дочитал :) Я говорю про скорость чтения, а не про скорость выполнения кода. Может этот пример и не такой явный, но возьми, к примеру обновление какого-нибудь кеша. Мне кажется, что вызов $this->ipsclass->update_cache( array( 'name' => '***', 'array' => 1, 'deletefirst' => 1 ) ); несколько понятней, чем выписанные напрямую сериализация, вызов нескольких запросов, часть из которых shutdown... Моя мысль сводится к тому, что нужно использовать функции среды, в котрой работаешь, а не копировать код из неё, тем более не писать это самому. Тогда и кода будет меньше, и ориентироваться в нём и разработчику и другим будет проще. А что касается времени выполнения, то всё равно, где, допустим генерировать код большого апдейта, делать implode в своём коде, или в коде class_db. А выигрыш из-за отсутствия лишнего вызова функии, можно в обсуждаемом случае пренебречь. В IPB есть намного более тормознутые места, на которые стоит обращать внимание.

Ссылка на комментарий
Поделиться на других сайтах

WildRAID, спасибо!

 

Воот...теперь еще вопрос...

 

По маскам доступа. Уже делал тему, но сейчас опять застрял.

 

Как я понимаю, если поле org_perm_id = NULL, то за маску доступа юзера считается маска доступа его группы.

 

Обнаружил это при помощи скрипта (те же "кланы") - при входе в клан проставляется org_perm_id, при выходе - сброс на NULL.

 

И получается, что после входа в клан я теряю админ-привелегии, даваемые маской администраторов.

 

Попробую потом плотнее заняться масками доступа, но сейчас другой вопрос - появилась очередная бредовая идея:

 

Есть ли другие способы ограничить доступ к форуму кроме как через маски доступа?

 

Например, выставить условие, что-то вроде

 

 

if($this->ipsclass->member['klan']!=номер из таблицы)
{

вывод ошибки

}else{

доступ
}

 

 

Это как-нибудь реализуемо? Если да - то в сторону какого файла "копать"?

Ссылка на комментарий
Поделиться на других сайтах

В /sources/classes/class_session.php найти функцию load_member. Там почти в самом начале запрос - добавить в него klan. Это если информация о клане пользователя хранится в таблице members в поле klan.

 

Если в другом месте, то сложнее, но идея та же самая. Тот массив, который возвращает функция load_member, попадает в $this->ipsclass->member и доступен везде.)

Ссылка на комментарий
Поделиться на других сайтах

Да нет.

Проблема не в том, чтобы получить member['klan'].

Проблема в том, чтобы ограничить доступ к форуму\разделу с помощью этого.

Т.е. - равен твой ['klan'] = 1, проходи, нет - ошибка.

 

ВотЪ. :D

Ссылка на комментарий
Поделиться на других сайтах

Ну вот и сделайте, как выше написали с if, так и надо, других мыслей возникнуть и не может :D Else только не нужен, если выведется ошибка, то выполнение закончится.
Ссылка на комментарий
Поделиться на других сайтах

В вашем :D Если не нужно даваь доступ ко всему компоненты, то в начале auto_run() "корневого" файла, ./sources/components_public/*.php. Если к какой-то возможности, то в начале функции, которая реализует эту возможность.
Ссылка на комментарий
Поделиться на других сайтах

Не-е-ет...вопрос в том - как реализовать доступ к ФОРУМАМ\РАЗДЕЛАМ\РУБРИКАМ\ПОДРАЗДЕЛАМ в соответствии с этим полем...

Как замену маскам доступа...

 

Воот...:D

Ссылка на комментарий
Поделиться на других сайтах

Ещё раз повторяю вопрос(раз уж вы про рубрики): вы хотите в своём компоненте это реализовать?
Ссылка на комментарий
Поделиться на других сайтах

Нет. Я хочу именно реализовать доступ к разделу - к компоненту отношения не имеет.

 

На примере.

 

Допустим - раздел "БАНК".

 

Доступен только тем, кто имеет определенное число форумной валюты. (member['money']>1000)

 

Или раздел для забаненых. (member['temp_ban']!=NULL)

Ссылка на комментарий
Поделиться на других сайтах

Вам нужно сделать проверку при открытии раздела форума? При чём тут тогда рубрики? :D
Ссылка на комментарий
Поделиться на других сайтах

Вам нужно сделать проверку при открытии раздела форума?

 

Именно.

 

При чём тут тогда рубрики?

 

Рубрика\раздел - для меня синонимы.

Ссылка на комментарий
Поделиться на других сайтах

Кста чтобы видеть запросы можно в class_db.php написать

 

function build_query( $a )
{
	if ( isset($a['select']) && $a['select'] )
	{
		if ( isset($a['add_join']) && is_array( $a['add_join'] ) )
		{
			$this->simple_select_with_join( $a['select'], $a['from'], isset($a['where']) ? $a['where'] : '', $a['add_join'] );

			print "SELECT ".$a['select']." FROM ";
			foreach ($a['from'] as $key=>$val) {
				print 'ibf_'.$key.' '.$val;
			}
			if (isset($a['where'])) {
				print " WHERE ".$a['where'];
			} else {
				print " WHERE ".$a['add_join'];
			}

		}
		else
		{
			$this->simple_select( $a['select'], $a['from'], isset($a['where']) ? $a['where'] : '' );
		}
	}

	if ( isset($a['update']) && $a['update'] )
	{
		$this->simple_update( $a['update'], $a['set'], isset($a['where']) ? $a['where'] : '', isset($a['lowpro']) ? $a['lowpro'] : '' );
	}

	if ( isset($a['delete']) && $a['delete'] )
	{
		$this->simple_delete( $a['delete'], $a['where'] );
	}

	if ( isset($a['group']) && $a['group'] )
	{
		$this->simple_group( $a['group'] );
		print ' GROUP BY '.$a['group'];
	}		

	if ( isset($a['order']) && $a['order'] )
	{
		$this->simple_order( $a['order'] );
		print ' ORDER BY '.$a['order'];
	}

	if ( isset($a['limit']) && is_array( $a['limit'] ) )
	{
		$this->simple_limit( $a['limit'][0], $a['limit'][1] );
		print ' LIMIT '.$a['limit'][0].', '.$a['limit'][1];
	}
}

Ну и закоментить потом)

Ссылка на комментарий
Поделиться на других сайтах

Вам явно нужно нанять помошника-телепата :D

Можно добавить проверку в функцию forums_check_access в файле ./sources/classes/class_forums.php.

 

P.S. "Кста", это и так есть, уже в 2.1. Го ту документэйшн.

Ссылка на комментарий
Поделиться на других сайтах

Гость
Эта тема закрыта для публикации сообщений.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.