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

Вопрос при создании хака


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

Вообще, можно было бы и создать отдельный форум для таких, как я, ну ладно, к вопросу:

Структура Invision Power Board, как я понял такова:

Сами скрипты и функции лежат в папке Sources в разных файлах типа Profile.php и т.д в них есть "ссылки" на skin-файлы, а в скин-файлах уже есть "ссылки" на lang-файлы

 

У меня кое-что получилось уже сделать более сложное, а вот тут проблемы:

Допустим, мне надо, чтобы если описание клана было равно "" (пустое), отображалось "Нет описания", в противном случае писали бы Описание.

Скрипт выглядет так (сам написал, поэтому ошибка может быть и тут):

if ($theclandescr == "") { print "Нет информации о клане"; } else { print "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; }

 

Прописываю это в skin-файле, мне в результате так весь этот код и выводит, заменяя переменные $theclanname и $theclandescr на те, которые выдрал из базы. Если поставить в начале скрипта <?php и в конце ?>, то код исчезает и ничего вообще не выводится на его месте.

Если просто поставить $theclandescr, то всё правильно выводит описание для этого клана, но мне хотелось бы, чтобы если описания нет, былобы не пусто в этой таблице, а было написано, что нет описания.

Как это сделать???

 

Так выглядет у меня вся функция в skin-файле:

 

function Page_header_members($clan_name, $theclanurl, $theclanforumurl, $theclandescr) {
global $ibforums;
return <<<EOF


          <br>
       <table cellpadding='0' cellspacing='0' border='0' width=80% bgcolor='#000000' align='center'>
        <tr>
            <td>
              <table cellpadding='4' cellspacing='1' border='0' width='100%'>
                <tr>
                   <td align='left' width='30%' class='titlemedium'>Информация о клане <b>"{$clan_name}"</b></td>
                   <tr>
                   <td align='left' width='10%' class='row1'>Адрес клана: <a href="$theclanurl" target="_blank">$theclanurl</a></td>
                   <tr>
                   <td align='left' width='30%' class='row2'>Адрес форума: <a href="$theclanforumurl" target="_blank">$theclanforumurl</a></td>
                 <tr>
                   <td align='left' width='30%' class='row1'>if ($theclandescr == "") { print "Нет информации о клане"; } else { print "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; } </td>



</tr>
</table></table>
<br><br>

       <table cellpadding='0' cellspacing='0' border='0' width='600' bgcolor='#000000' align='center'>
        <tr>
            <td>
              <table cellpadding='4' cellspacing='1' border='0' width='100%'>
                <tr>
                   <td align='left' width='30%' class='titlemedium'>Пользователь</td>
                   <td align='left' width='10%' class='titlemedium'>Сообщения</td>
                   <td align='left' width='30%' class='titlemedium'>Деньги</td>
                </tr>
EOF;
}

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

function Page_header_members($clan_name, $theclanurl, $theclanforumurl, $theclandescr) {
global $ibforums;

if ($theclandescr == "")  
             $clan_descriprion = "Нет информации о клане";
else  
             $clan_descriprion = "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; 

return <<<EOF
.....
<td align='left' width='30%' class='row2'>Адрес форума: <a href="$theclanforumurl" target="_blank">$theclanforumurl</a></td>
                 <tr>
                 <td align='left' width='30%' class='row1'>$clan_descriprion</td>
......
EOF;
}

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

Vanish

Вау! Спасибо! Получилось! Теперь буду знать, как это делать.

Темку не закрывайте, плиз. Если будут вопросы, я буду писать сюда.

P.S За что отвечает EOF; и return <<<EOF ???

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

Vanish

В скине нельзя писать любой php код (у тебя стоит провера).

Он там продержится вплоть до того момента как ты изменишь этот скин из админки. Хотя, конечно, если ты всегда форум редактируешь только по ftp, то это прокатит.

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

Gangster

Структура Invision Power Board, как я понял такова:

Сами скрипты и функции лежат в папке Sources в разных файлах типа Profile.php и т.д в них есть "ссылки" на skin-файлы, а в скин-файлах уже есть "ссылки" на lang-файлы

Если не понял структуру форума, то милости в статейку:

Структура и пути в IPB

А вообще перед созданием хаков неплохо было бы некоторые статейки отсюда прочитать:

Навигатор

 

А вообще эту проблему решил бы еще до передачи делов в skin файл. Перед строкой выдачи скина, а она у вас такая (имена переменных конечно по другому наверняка называются):

$this->output .= $this->html->Page_header_members($clan_name, $theclanurl, $theclanforumurl, $theclandescr);

Я бы добавил бы запись:

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

if ($theclandescr == "") {
$theclandescr = "Нет информации о клане";
}

Если предусмотрено несколько языков на форуме, то такую:

if ($theclandescr == "") {
$theclandescr = $ibforums->lang['not_clan_information'];
}

Естесственно в lang-files после строки $lang = array () для обоих языков для этого хака добавив запись на русском и других языках... на русском такую:

'not_clan_information' => "Нет информации о клане",

И не было бы проблем со скинами. Не люблю я этот PHP в скинах :D

IMHO, в /sources/ - PHP, в /Skin/ - HTML.

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

Делать лучше так:

1) в функцию скина вводим новый параметр:

 function some_function(старые_параметры, $new) {

Здесь что-то делаем с $new или если применительно к этому примеру просто выводим его:
{$new}

}

 

2) находим исходник где some_function вызывается и вписываем туда:

 

if ($theclandescr == "")   { $clan_description = "Нет информации о клане"; } else  
                                     { $clan_description = "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; }

$this->html->some_function(старые_передаваемые_параметры, $clan_descriprion);

 

3) рассинхронизируем скин, чтобы параметр $new в скине попал в базу. Всё.

 

4) Enjoy! :D

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

P.S. Убавьте плиз размер шрифта в теге CODE, потому что мало инфы умещается, строки переносятся, плохо выглядит.
Ссылка на комментарий
Поделиться на других сайтах

Спасибо, сейчас переделаю. Php-код будет в sources в clans.php, а HTML - в skin

Lang-файлы нет необходимости модифицировать, т.к у меня включён только русский язык.

Song

А чем твоя версия отличается от версии Oska, кроме рессинхронизации скина?

 

Во, ещё вопрос:

Как удалить и переименовать столбец clanmoder1, если я его создавал такой командой?

alter table `ibf_clans` 
add clanmoder1 INT NOT NULL

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

Gangster тем что Oska добавил это позже =)))

Это сообщение отредактировал Oska - 4 Янв 2004, 21:57

ну и решение более правильное с точки зрения построения форума.

 

ALTER TABLE table1 RENAME table2; - Переименование таблицы table1 в table2

 

ALTER TABLE table2 ADD new_attr varchar(20); - Добавление в таблицу table2 нового аттрибута new_attr с типом varchar длиной в 20 символов.

 

ALTER TABLE table2 CHANGE new_attr varchar(60); - изменение типа аттрибута new_attr в таблице table2 на varchar длинной в 60 символов.

 

ALTER TABLE table2 DROP new_attr; - удалить аттрибут new_attr и таблицы table2

 

Вроде так.

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

Что делает fetch_row()???

Пример запроса:

        $DB->query("SELECT clanid FROM ibf_members WHERE id='$clanmoder1idnew'");
 {
	 $r = $DB->fetch_row();
         $thismemberclanid = $r['clanid'];

 }

Вопрос очень важет, так как в моём коде есть важная проверка на равенство переменных, и всё получается, но при некоторых случаях она проскакивает. Мне кажется, что в этом виноват fetch_row()

Можно узнать, что делает этот fetch_row()???

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

Что делает fetch_row()???

Это форумный аналог функции PHP mysql_fetch_array. ;)

 

Если $DB->query делает запрос к базе, то $DB->fetch_row выдёргивает все результаты этого запроса.

 

Если запрос не дал результатов (вернул 0 строк), то $r (в твоём примере) получит пустое значение.

Если запрос вернул один результат, то $r будет массивом, к элементам которого можно обращаться по именам ячеек в таблице, для которых ты делал SELECT.

Поясняю - если сделать так:

$DB->query("SELECT id, name, location, last_visit FROM ibf_members WHERE name = 'Vasya Pupkin'");
$r = $DB->fetch_row();

то значения $r['id'], $r['name'], $r['location'] будут хранить информацию про Васю Пупкина.

Если запрос вернул несколько результатов, то вызов $DB->fetch_row() нужно запихать в цикл

while ($r = $DB->fetch_row()) { что делать; }

и выполнять в цикле обработку каждой строки запроса.

 

Если запрос вернул несколько результатов, а ты вызываешь $DB->fetch_row() не в цикле (как в твоём примере), то значения $r будут взяты из самого первого результата запроса. Пример:

$DB->query("SELECT * FROM ibf_members ORDER BY join_date ASC");
$r = $DB->fetch_row();

$r['name'] сейчас будет хранить имя того пользователя, который зарегистрировался самым первым (у которого дата join_date самая маленькая).

 

Так понятно?.. :D

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

Понятно, но вчитывался 3 раза.

Значит, если я пущю запрос

SELECT name, last_visit FROM ibf_members WHERE id=2

то мне можно это не пихать в цикл, а если пущю запрос

SELECT name, last_visit FROM ibf_members WHERE id>2

то тут нужно пихать в цикл, так как id>2 это 3, 4, 5.....

и значений будет много????

 

Что делает $DB->get_num_rows()???

я так понял, что она сообщает о том, что нет такой записи.

Допустим, вот такой код

	 $DB->query("SELECT clanid, clanname FROM ibf_members WHERE id=". $ibforums->member['id'] ."");
 
 if ( !$DB->get_num_rows() )
 {
	 $std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_such_user' ) );
 }

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

Gangster

 

function get_num_rows() {
       return mysql_num_rows($this->query_id);
}

 

Сколько строчек ( rows ) вернул данный запрос в базу

 

if ( !$DB->get_num_rows() )

Заходим в if, только, если по данному запросу ничего в БД не найдено ...

 

ЗЫ Пойди по ссылке ( в коде ПХП mysql_num_rows отображена как ссылка - там дополнят картину профессонально ) ... :D

 

ЗЫЫ Если задаёшься подобными вопросами - полезно будет рассмотреть класс и методы класса

class db_driver что в файле sources/Drivers/mySQL.php ...

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

и значений будет много????

Много или нет - качественная категория, а $DB->get_num_rows() возвращает число рядов. ;)

 

Сколько строчек ( rows ) вернул данный запрос в базу

Тогда уж "к базе" или "из базы"... :D Запросы SELECT ничего не возвращают "в базу".

 

Заходим в if, только, если по данному запросу ничего в БД не найдено ...

Наоборот - если хоть что-то найдено.

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

Наоборот - если хоть что-то найдено.

theIggs

Не прав - смотри внимательнее -

if ( !$DB->get_num_rows() ),

или проще

if ( $DB->get_num_rows() == 0 )

:D

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

Спасибо, теперь понял.

Самое интересно, у меня есть проверка на равенство переменных

if ($thisclanid == "$thismemberclanid")
{
................
}
else
{
	 $std->Error( array( 'LEVEL' => 1, 'MSG' => 'not_in_your_clan' ) );
}

Так вот, если в проверке стоит ==, то она прекрасно работает, и не вычисляет в TRUE, ни при каких условиях, если переменные не равны, а если поставить только один знак =, то она будет вычислять в TRUE в одном случае, если (вообщем долго объяснять), но при этом переменные будут не равны, но всёже в большенстве случаях она проходит.

Неужели такая большая разница в том, что я поставил = или ==???

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

Gangster, разница, конечно, есть.

= оператор присваивания. То есть след. запись присвоит переменной $a значение переменной $b:

$a = $b

== оператор сравнения. Здесь собственно идет проверка на равенство...

if ($a == $

Вот ссылочка по теме:

http://www.php.net/manual/ru/language.oper....comparison.php

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

Понятно, спасибо.

У меня ещё вопрос:

Можно ли в разных функциях называть переменные одинаково?

Например, в

function do_clan_add_join()
{
global $ibforums, $DB, $std;

$clan = "Клан";
}

function clan_add_join()
{
global $ibforums, $DB, $std;

$clan = "Ха-ха-ха";
}

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

Если они не глобальные то можно =))))

 

А вообще RTFM. Создается впечатление что хочется написать, да не могу так как основ не знаю.

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

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

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

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