Уважаемые пользователи!
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 2.0.x.
Аватара пользователя
RedScorp
phpBB 1.4.1
Сообщения: 43
Стаж: 18 лет 5 месяцев
Откуда: г. Уральск

Правильное написание кода сохранения отдельных данных

Сообщение RedScorp »

Доброго Времени суток.
Почему, прошу помощи у авторов модов - просто я с этой областью еще не работал. В частности имеется форма на которой расположено три элемента: Edit (текстовое поле), ComboBox (раскрывающийся список), Edit (текстовое поле). Соответственно есть кнопки Ok и Cancel. Как правильно описать процедуру сохранения введенных данных в определенную базу. В принципе аналог данной ситуации видел в моде "день рождения", правда там все хранится и управляется в админке, а мне надо на отдельно форме и в свою базу (т.е. что и как прописывать на кнопку Ок).
Заранее спасибо. И извините если я повторился (в поиске не нашел, точнее даже не знаю как толком указать запрос на эту тематику).
Изображение Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16370
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Сообщение rxu »

RedScorp писал(а):Как правильно описать процедуру сохранения введенных данных в определенную базу.
Уточните, вопрос не совсем понятен.
Вам нужно, чтобы введённые в форму данные были сохранены в базе данных, или что-то другое?
Изображение
Аватара пользователя
RedScorp
phpBB 1.4.1
Сообщения: 43
Стаж: 18 лет 5 месяцев
Откуда: г. Уральск

Сообщение RedScorp »

rxu писал(а):Вам нужно, чтобы введённые в форму данные были сохранены в базе данных
Именно это и надо. Своя форма, своя таблица (естесно в базе форума). Структура проста:
  • 1. ключ
    2. код пользователя
    3. дата/время
    4. |
    5. |
    6. |-> необходимые поля
    7. |
    8. |
Просто я малость запутался, ведь на кнопках типа "Сохранить", "Ок" весит valid="Submit" и т.д., а вот что должно выполнится и где, чет не разберусь... Поэтому хотелось бы видеть наглядный пример авторов модов. Скажем в таком то место прописать то-то, в таком-то то-то, в своей форме то-то. Ведь написать сохранение можно быстро, но хочется чтобы это было в стиле phpBB и естественно не нарушало его уровень безопасности.
Изображение Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16370
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Сообщение rxu »

RedScorp
Если знакомы с общими принципами передачи данных из форм, то этого будет достаточно.
Например, имеем кнопки:

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

<form action="{S_ACTION}" method="post">

<table align="center" cellspacing="0" cellpadding="1" border="1">
	<tr>
		<td class="catBottom" colspan="2" align="center" height="28"><input class="post" type="text" name="var" size="7" maxlength="7" value="" />&nbsp<input type="submit" name="submit" value="{L_SUBMIT}" class="mainoption" /></td>
	</tr>
	
</table>
</form>
Начинаете с формы. {S_ACTION} - переменная передаётся в шаблон из рнр файла стандартным способом, например

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

$template->assign_vars(array(
	'S_ACTION' => append_sid('file.'.$phpEx) )
);
Т.е. по нажатию на кнопку в форме будет запущен файл file.php. При этом из формы методом method="post" в этот файл будет передана переменная name="var", получить которую там можно также стандартным способом, например:

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

if (!empty($HTTP_POST_VARS['var']) )
{
	$var = $HTTP_POST_VARS['var'];
}
else
{
	$var = 0;
}
Далее с переменной var можете поступать как вздумается, в т.ч. записывать в БД.
Изображение
Аватара пользователя
RedScorp
phpBB 1.4.1
Сообщения: 43
Стаж: 18 лет 5 месяцев
Откуда: г. Уральск

Сообщение RedScorp »

rxu писал(а):Т.е. по нажатию на кнопку в форме будет запущен файл file.php.
А после того как этот файл отработает все вернеться обратно в мою форму (ну если в file.php будет описан только процесс сохранения)? Потому что у меня так и происходит, или я где-то ошибся...

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

Упс. Извините, разобрался. У меня там ошибка была, просто движок технично ее убирал. Поэтому после нажатия "заветной кнопки" все сохранение срабатывает. Но все равно надо чтобы после сейва вернуть пользователя обратно в форму
Изображение Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16370
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Сообщение rxu »

Надо заключать блок, исполняемый по отправке формы, в соответствующее условие по передаваемой переменной, например

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

if($var)
{

.....


}
в котором предусматривать выходные процедуры, например, сообщение об успешном/неуспешном выполнении кода, такие, как message_die, или производить редирект, и пр.
Изображение
Аватара пользователя
RedScorp
phpBB 1.4.1
Сообщения: 43
Стаж: 18 лет 5 месяцев
Откуда: г. Уральск

Сообщение RedScorp »

Ура заработало. Кстати, я не стал выносить все в отдельный файл, а сделал все в своей форме, по принципу что Вы описали выше. Просто подвесил в самом начале обработку переменной $var

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

if (!empty($HTTP_POST_VARS['var']) ) {
    $var = $HTTP_POST_VARS['var'];
    ... Выполняем сохранение
}
... работаем над отображением
... и заполнением формы
А на счет записи в таблицу - это правильно:

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

$sql = 'INSERT INTO ' . MY_TABLE . " (my_id, my_user_id, <..> ) 
	VALUES ('$my_id', '$my_user_id', <..>)";
if (!$db->sql_query($sql))
{
	message_die(GENERAL_ERROR, 'Could not insert new information', '', __LINE__, __FILE__, $sql);
}
Добавлено спустя 5 минут 23 секунды:

Совсем забыл спросить про sid, когда я открываю свою форму у меня в адресной строке он не указывается (ну как на центральной странице). Обязателен ли он с точки зрения зашиты и безопасности? И плюс ко всему, в своем модуле я не могу использовать

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

if (defined('IN_PHPBB')) {
   die('Hacking attempt');
   exit;
}
потому что сразу пишет хакинг :(
Изображение Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16370
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Сообщение rxu »

RedScorp писал(а):потому что сразу пишет хакинг
Потому, что в условии должно быть не defined('IN_PHPBB'), а !defined('IN_PHPBB').
RedScorp писал(а):Обязателен ли он с точки зрения зашиты и безопасности?
С этой точки зрения - да. Несмотря на то, что sid отсутствует в адресной строке, идентификатор сессии всё равно имеется. Инициируется при старте сессии

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

//
// Start session management
//
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
//
// End session management
//
Изображение
Аватара пользователя
RedScorp
phpBB 1.4.1
Сообщения: 43
Стаж: 18 лет 5 месяцев
Откуда: г. Уральск

Сообщение RedScorp »

rxu писал(а):Потому, что в условии должно быть не defined('IN_PHPBB'), а !defined('IN_PHPBB').
Упс. Очепятался. Там действительно стоит "!". А ругается скорее всего вот почему (утром проверю) надо в page_header.php прописать строку к примеру

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

 'U_MYFILE' => append_sid('file.'.$phpEx),
и соответственно в overall_header.tpl добавить в меню

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

<a href="{U_MYFILE}">File</a>
Изображение Изображение
Аватара пользователя
RedScorp
phpBB 1.4.1
Сообщения: 43
Стаж: 18 лет 5 месяцев
Откуда: г. Уральск

Сообщение RedScorp »

Не помогло. Но не столь важно, я в модуле делаю проверку

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

if (!$userdata['session_logged_in']) {
   message_die(GENERAL_MESSAGE, 'Access denied!');
}
Зато возникли еще вопросы. К примеру, как отписать пользователю окно с сообщением что он что-то ввел не верно, в котором предложить вернуться обратно. Стандартная функция такая есть или окно самому писать?
Изображение Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16370
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Сообщение rxu »

RedScorp писал(а):Стандартная функция такая есть или окно самому писать?
RedScorp писал(а): message_die(GENERAL_MESSAGE, 'Access denied!')
Эта же и есть :)
Только строку сформируйте, например $message=блаблабла, и в качестве параметра туда передайте. А в строке этой ссылки и пр. и сделайте.
Изображение
Аватара пользователя
PavlegSS
phpBB 1.4.4
Сообщения: 160
Стаж: 16 лет 6 месяцев

Сообщение PavlegSS »

Всем здравствуйте. Извините, что поднимаю такую старую тему, но вопрос актуален. Итак, моя задача:

1.Ввести в базу данных в таблицу phpbb_users поле user_points, которое ни с чем не связано, просто от руки туда вбиваются поинты
2. Вывести в админку используя МОД admin_users_list (http://www.phpbbguru.net/mods/?download&id=2) ЭТО самое дополнитильное поле user_points с возможностью его (этого поля) редакитрования
3. Создать процедуру сохранения измененного поля user_points
4. Проверить правильность исполнения процедуры


Руководствуясь ЭТОЙ темой реализовал почти все до конца, т.е. поле в аминке есть, кнопка сохранить есть, как записывать в базу знаю, но:

не получается считать данные из НОВОГО поля user_points что в admin_user_list_body.tpl обозвано 'points'

Справка: МОД admin_users_list состоит из admin_users_list.php в forum/admin и admin_users_list_body.tpl в forum/templayts/subsilver/admin/(тут-то и прописаны имена полей для вывода информации). Там я присвоил полю user_points следующие реквизиты:

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

td class="row2"> 
		<input class="post" type="double" name="points" id="points" size="10" maxlength="10" value="{userrow.USER_POINT}" />
	  </td>
в файл admin_users_list.php для получения user_points из базы данных и вызова функции сохранения добавил:

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

$sql = "SELECT user_id, username, user_point, user_email, user_regdate, user_lastvisit, user_posts, user_active
.......
.......
		'USER_POINT' => $userrow[$i]['user_point'],
......
......
.....

// сохранить
$template->assign_vars(array( 
   'S_ACTION' => append_sid('save_point.'.$phpEx) ) 
);
// конец сохранить
Соотвественно содержимое файла save_point.php:

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

<?php
$var = $HTTP_POST_VARS['points']; 

$dbms = 'скрыто';
$dbhost = 'скрыто';
$dbname = 'скрыто';
$dbuser = 'скрыто';
$dbpasswd = 'скрыто';
mysql_connect ($dbhost,$dbuser,$dbpasswd );
mysql_select_db($dbname);
//  ... Выполняем сохранение для конкретного пользователя(проверка)
$query="update phpbb_users set user_point='$var' where username='Кто-то'";
mysql_query($query) or die(mysql_error());
print "<b>Данные сохраненны</b>";
?>

В принципе все вызывается и никаких ошибок не выскакивает, но поинты у выбранного пользователя обнуляются, т.е. $var=0, т.е. вывод: - данные из admin_users_list_body.tpl не считываются. Вопрос: объясните пожалуйста мне дураку что тут неправильно, стою по идее в 1-ом шаге от решения, но что-то не решается. Спасибо

P.S. Хотя умом понимаю, что если все сделать без .tpl в одном .php то проблем не будет, так как там явно можно будет присвоить имя полю для post и все, но хотелось бы понять принцип работы с .tpl

Еще раз заранее спасибо всем, кто откликнется

Т.е. еще раз спрошу попонятнее, извините:
КАК СЧИТАТЬ РЕДАКТИРУЕМЫЕ ДАННЫЕ ИЗ .TPL???
Аватара пользователя
PavlegSS
phpBB 1.4.4
Сообщения: 160
Стаж: 16 лет 6 месяцев

Сообщение PavlegSS »

Всем спасибо за отзывчивость, очень приятно.

Решил проблему сам, просто убрал из profile_add_body.tpl все что касается YIM (так как кому он нафик нужен?), а в forum/admin/adminuser_edit_body.tpl исправил заголовок нужной строчки на нужный (выделил другим цветом, сделал жирным, курсивным, подчеркнул), а в forum/admin/admin_users.php в строке, что ниже "$sql = "UPDATE " . USERS_TABLE . "" заменил "$yim =" на "$мой_параметр=" и все. Всем удачи.

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