Первый опыт :)

Форум для авторов модов для phpBB 2.0.x. Здесь можно попросить помощи в разработке у коллег.

Первый опыт :)

Сообщение svk 21.07.2005 16:34

Мой первый опыт в написании модов, сделал небольшой мод что бы можно было прям из админки добавлять html код в шапку и в область ссылок. Слижком уж часто меня просили что то там изменить :)
Код: Выделить всё
#
#-----[ SQL ]------------------------------
#
CREATE TABLE `phpbb_top` (
`name` VARCHAR( 255 ) NOT NULL ,
`value` TEXT NOT NULL );

#
#-----[ SQL ]------------------------------
#
INSERT INTO `phpbb_top` ( `name` , `value` ) VALUES ( 'links', '');
INSERT INTO `phpbb_top` ( `name` , `value` ) VALUES ( 'top', '');

#
#-----[ OPEN ]------------------------------
#
includes/page_header.php
#
#-----[ FIND ]-----------------------------------
#
$l_timezone = (count($l_timezone) > 1 && $l_timezone[count($l_timezone)-1] != 0) ? $lang[sprintf('%.1f', $board_config['board_timezone'])] : $lang[number_format($board_config['board_timezone'])];
#
#-----[ AFTER, ADD ]-----------------------------------
#
//Custom Top And links
//Add header and links from database
$sql = "SELECT value FROM phpbb_top WHERE name = 'top'
   LIMIT 1";

if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, "Could not obtain header information.", '', __LINE__, __FILE__, $sql);
}

$postrow = $db->sql_fetchrow($result);

$topp = $postrow['value'];
$topp = str_replace("'", "\'", $topp);

$sql = "SELECT config_value FROM phpbb_config WHERE config_name = 'links'
   LIMIT 1";

if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, "Could not obtain header information.", '', __LINE__, __FILE__, $sql);
}

$postrow = $db->sql_fetchrow($result);

$links = $postrow['value'];
$links = str_replace("'", "\'", $links);

//End
#
#-----[ FIND ]-----------------------------------
#
   'T_SPAN_CLASS3' => $theme['span_class3'],
#
#-----[ AFTER, ADD ]-----------------------------------
#
   'TOPP' => $topp,
   'LINKS' => $links,

#
#-----[ OPEN ]------------------------------
#
templates/SubSilver/overall_header.tpl
#
#-----[ FIND ]-----------------------------------
#
      <td class="bodyline"><table width="100%" cellspacing="0" cellpadding="0" border="0">
#
#-----[ AFTER, ADD ]-----------------------------------
#
      {TOPP}

#
#-----[ FIND ]-----------------------------------
#
               <td height="25" align="center" valign="top" nowrap="nowrap"><span class="mainmenu">&nbsp;<a href="{U_PROFILE}" class="mainmenu"><img src="templates/subSilver/images/icon_mini_profile.gif" width="12" height="13" border="0" alt="{L_PROFILE}" hspace="3" />{L_PROFILE}</a>&nbsp; &nbsp;<a href="{U_PRIVATEMSGS}" class="mainmenu"><img src="{PRIVMSG_IMG}" width="12" height="13" border="0" alt="{PRIVATE_MESSAGE_INFO}" hspace="3" />{PRIVATE_MESSAGE_INFO}</a>&nbsp; &nbsp;<a href="{U_LOGIN_LOGOUT}" class="mainmenu"><img src="templates/subSilver/images/icon_mini_login.gif" width="12" height="13" border="0" alt="{L_LOGIN_LOGOUT}" hspace="3" />{L_LOGIN_LOGOUT}</a>&nbsp;</span></td>
#
#-----[ AFTER, ADD ]-----------------------------------
#
<br />{LINKS}

#
#-----[ OPEN ]------------------------------
#
admin/admin_board.php

#
#-----[ FIND ]-----------------------------------
#
      if( isset($HTTP_POST_VARS['submit']) )
      {

#
#-----[ AFTER, ADD ]-----------------------------------
#
            if ($config_name == 'links')
            {
              $sql = "UPDATE phpbb_top SET value = '$new[links]' WHERE name = 'links'";
            if( !$db->sql_query($sql) )
               {
            message_die(GENERAL_ERROR, "Failed to update general configuration for phpbb_top", "", __LINE__, __FILE__, $sql);
               }
            }
            
            
            if ($config_name == 'topp')
            {
              $sql = "UPDATE phpbb_top SET value = '$new[topp]' WHERE name = 'top'";
            if( !$db->sql_query($sql) )
               {
            message_die(GENERAL_ERROR, "Failed to update general configuration for phpbb_top", "", __LINE__, __FILE__, $sql);
               }
            }

#
#-----[ FIND ]-----------------------------------
#
   if( isset($HTTP_POST_VARS['submit']) )
   {         
      $message = $lang['Config_updated'] . "<br /><br />" . sprintf($lang['Click_return_config'], "<a href=\"" . append_sid("admin_board.$phpEx") . "\">", "</a>") . "<br /><br />" . sprintf($lang['Click_return_admin_index'], "<a href=\"" . append_sid("index.$phpEx?pane=right") . "\">", "</a>");

      message_die(GENERAL_MESSAGE, $message);
   }
}

#
#-----[ AFTER, ADD ]-----------------------------------
#
$sql = "SELECT * FROM phpbb_top WHERE name = 'links'";
   if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, "Could not obtain top or links information.", '', __LINE__, __FILE__, $sql);
}

$postrow = $db->sql_fetchrow($result);
$new[links] = $postrow['value'];
$sql = "SELECT * FROM phpbb_top WHERE name = 'top'";
   if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, "Could not obtain top or links information.", '', __LINE__, __FILE__, $sql);
}

$postrow = $db->sql_fetchrow($result);
$new[topp] = $postrow['value'];       

#
#-----[ FIND ]-----------------------------------
#
$template->pparse("body");

include('./page_footer_admin.'.$phpEx);

#
#-----[ BEFORE, ADD ]------------------------------------------
#
$template->assign_vars(array(
   "LINKS" => $new['links'],
   "TOPP" => $new['topp']));
));

#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/admin/board_config_body.tpl

#
#-----[ FIND ]------------------------------------------
#
   <tr>
      <td class="row1">{L_DISABLE_BOARD}<br /><span class="gensmall">{L_DISABLE_BOARD_EXPLAIN}</span></td>
      <td class="row2"><input type="radio" name="board_disable" value="1" {S_DISABLE_BOARD_YES} /> {L_YES}&nbsp;&nbsp;<input type="radio" name="board_disable" value="0" {S_DISABLE_BOARD_NO} /> {L_NO}</td>
   </tr>
#
#-----[ AFTER, ADD ]-----------------------------------
#

   <tr>
      <td class="row1">Ссылки<br /><span class="gensmall">Добавление ссылок вверху страницы</span></td>
      <td class="row2"><textarea name="links" rows="5" cols="60">{LINKS}</textarea></td>
   </tr>
   <tr>
      <td class="row1">top<br /><span class="gensmall">Добавление кода в самый верх страницы</span></td>
      <td class="row2"><textarea name="topp" rows="5" cols="60">{TOPP}</textarea></td>
   </tr>
#
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM

Я уверен, что надопускал кучу ошибок, особенно в sql запросах.
Интересно что скажут более опытные.
Последний раз редактировалось svk 21.07.2005 19:51, всего редактировалось 1 раз.
NETBYNET Holding system administrator
Аватара пользователя
svk
phpBB 2.0.10
 
Сообщения: 441
Зарегистрирован: 03.07.2005 13:08
Откуда: Москва, Fortuna-net

Сообщение [R: R@m$e$ :U] 21.07.2005 16:43

почитай http://www.phpbb.com/phpBB/viewtopic.php?t=218443 =))) если не ошибся ссылка на статью про защиту... =)
в общем тут SQL-injection =)))

Добавлено спустя 1 минуту 13 секунд:

если я не просмотрел =)
Руководство пользователя | FAQ | Правила | Как устанавливать MOD'ы
ВОСПОЛЬЗУЙСЯ ПОИСКОМ, ТАМ ЕСТЬ БОЛЬШИНСТВО ОТВЕТОВ
ЕСЛИ НЕ ПОМОГЛО, ИСПОЛЬЗУЙ ШАБЛОН ЗАПРОСА, ПОМОГИ В РЕШЕНИИ ЗАДАЧИ
БЕСПЛАТНО ПОМОГУ ТОЛЬКО НА ФОРУМЕ!!! (ЛС НЕ В СЧЕТ)

Оставь благодарность, подтверди работоспособность совета.

ВСЕ ПРАВА НА МОДЫ ОТДАНЫ m157y
Аватара пользователя
[R: R@m$e$ :U]
phpBB Maniac
 
Сообщения: 1516
Зарегистрирован: 16.01.2005 14:04
Откуда: Novosibirsk,RU

Сообщение svk 21.07.2005 16:58

Эм...
Мона канечна в админской панели, но смысл админу это делать? он и так базу может снести восстановив из пустого бэкапа )))

Как исправить лучше подскажи, тут же html код идет, глупо спец символы удалять :)
NETBYNET Holding system administrator
Аватара пользователя
svk
phpBB 2.0.10
 
Сообщения: 441
Зарегистрирован: 03.07.2005 13:08
Откуда: Москва, Fortuna-net

Сообщение [R: R@m$e$ :U] 21.07.2005 19:05

svk
админ конечно делать не будет... но если я у тебя все же отбрутил хеш от админского акка? просто код должен быть от этого защищен...

я не про удаление спец.символов... а, например, про
Код: Выделить всё
str_replace("'", "\'", $new[topp]);

который у тебя отсутствует...
Руководство пользователя | FAQ | Правила | Как устанавливать MOD'ы
ВОСПОЛЬЗУЙСЯ ПОИСКОМ, ТАМ ЕСТЬ БОЛЬШИНСТВО ОТВЕТОВ
ЕСЛИ НЕ ПОМОГЛО, ИСПОЛЬЗУЙ ШАБЛОН ЗАПРОСА, ПОМОГИ В РЕШЕНИИ ЗАДАЧИ
БЕСПЛАТНО ПОМОГУ ТОЛЬКО НА ФОРУМЕ!!! (ЛС НЕ В СЧЕТ)

Оставь благодарность, подтверди работоспособность совета.

ВСЕ ПРАВА НА МОДЫ ОТДАНЫ m157y
Аватара пользователя
[R: R@m$e$ :U]
phpBB Maniac
 
Сообщения: 1516
Зарегистрирован: 16.01.2005 14:04
Откуда: Novosibirsk,RU

Сообщение svk 21.07.2005 19:51

Так? (Поправил первый пост)
NETBYNET Holding system administrator
Аватара пользователя
svk
phpBB 2.0.10
 
Сообщения: 441
Зарегистрирован: 03.07.2005 13:08
Откуда: Москва, Fortuna-net

Сообщение quazi 21.07.2005 20:01

quazi
phpBB 2.0.8
 
Сообщения: 313
Зарегистрирован: 15.03.2005 19:49

Сообщение Xpert 21.07.2005 21:27

[R: R@m$e$ :U]
Так phpBB стандартно делает addslashes. Можно посмотреть в сторону замены \' на '' (две одинарные).

svk писал(а):FROM phpbb_top

svk писал(а):FROM phpbb_config

Эти две таблицы надо вызывать как CONFIG_TABLE и TOP_TABLE, предварительно прописав последнюю в includes/constants.php

svk писал(а):$new[topp]

Имхо $new['topp']

Вроде пока все. Хотя я бы, честно говоря, вынес все это в отдельный модуль. Да и сама цель мода кроме учебной мне сомнительна. phpBB не терпит ламеров, за ним как за любимым домашним животным ухаживать надо.

Вот еще. Чтобы меньше было багов, особенного логических на время написания и тестирования мода отключай в common.php отключение проверки ошибок. Короче вместо
Код: Выделить всё
error_reporting  (E_ERROR | E_WARNING | E_PARSE); // This will NOT report uninitialized variables

... надо
Код: Выделить всё
error_reporting  (E_ALL); // This will report all errors
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5710
Зарегистрирован: 13.03.2004 22:27
Откуда: msk.ru

Сообщение svk 22.07.2005 10:42

Xpert писал(а):Имхо $new['topp']

имхо синтаксис php допускает и так и так :?
Xpert писал(а):Да и сама цель мода кроме учебной мне сомнительна. phpBB не терпит ламеров, за ним как за любимым домашним животным ухаживать надо.

По этому же форуму видно, что и ла.... деревья держат свои форумы с модами.
Хотя ты прав, я писал его в основном для учебных целей :)
NETBYNET Holding system administrator
Аватара пользователя
svk
phpBB 2.0.10
 
Сообщения: 441
Зарегистрирован: 03.07.2005 13:08
Откуда: Москва, Fortuna-net

Сообщение Xpert 22.07.2005 10:46

svk писал(а):синтаксис php допускает и так и так

Вот как раз так он не допускает, это считается ошибкой. Единственный случай, когда такой синтаксис возможен - если переменная является частью строки, т.е.:
Код: Выделить всё
$text = "Title: $row[title]";
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5710
Зарегистрирован: 13.03.2004 22:27
Откуда: msk.ru

Сообщение peter 16.01.2006 23:37

Господа Гуру, а для лохов окончательный вариант будет?
Аватара пользователя
peter
phpBB 1.4.1
 
Сообщения: 44
Зарегистрирован: 05.07.2005 17:39
Откуда: Moscow

Сообщение SugutorBatia 26.01.2006 22:47

Мне понравился мод! Я бы тоже хотел иметь возможность из админки менять headers.tpl - чтоб там можно было баннер или объявление рекламное впихнуть.

Полезный мод! Сам хотел написать, но знаний конечно нехватило.... :lol:
Буду ждать релиза рабочей версии.
http://batia.info
Быстрое решение проблемы с PhpBB3: Кодировки
Аватара пользователя
SugutorBatia
phpBB 2.0.2
 
Сообщения: 153
Зарегистрирован: 31.08.2005 12:23

Сообщение Filippok 07.03.2006 11:20

Сделал все так как описано в первом посту и вот что получилось: Parse error: parse error, unexpected '/' in /pub/home/ДОМЕН/ПАПКА/forum/includes/page_header.php on line 23
Аватара пользователя
Filippok
phpBB 2.0.0
 
Сообщения: 124
Зарегистрирован: 01.03.2006 19:16

Сообщение Nemo1987 07.03.2006 11:29

Filippok, у тя ковычка одиночная осталась открытая... там же глюк был в начале.. его ииспавили... посмотри внимательнее Строка 23
grammatica falsa non vitiat chartam
Моя хата www.vowik.ru
Аватара пользователя
Nemo1987
phpBB 2.0.13
 
Сообщения: 601
Зарегистрирован: 14.02.2006 11:20
Откуда: Москва
Предупреждения: 1

Сообщение Filippok 07.03.2006 13:17

Nemo1987 писал(а):посмотри внимательнее Строка 23

А можно носом ткнуть?:)
Первый пост это уже полностью работоспособный МОД?
Аватара пользователя
Filippok
phpBB 2.0.0
 
Сообщения: 124
Зарегистрирован: 01.03.2006 19:16

Сообщение Nemo1987 07.03.2006 14:18

Да, полностью :) Я не ставил, потому ненаю :) Просто перед ' поставть \ должно быть так= \'
grammatica falsa non vitiat chartam
Моя хата www.vowik.ru
Аватара пользователя
Nemo1987
phpBB 2.0.13
 
Сообщения: 601
Зарегистрирован: 14.02.2006 11:20
Откуда: Москва
Предупреждения: 1

След.

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0