Знатокам рнр. У самой не получилось... Нужно сделать регистрацию данных неких счетов, разрешённую только зарегистрированным на форуме пользователям (из "профиля" пользователя или страницы по переходу из профиля). При регистрации:
- отправляется письмо с уведомлением на адрес админа
- данные, введённые в форму регистрации, в файлах форума не должны сохраняться (или сохраняться в отдельной папке, для последующего удаления)
- в "своей" папке создаётся дефолтный файл со своим ID и ID пользователя, зарегистрировавшего счёт. Остальные данные нулевые (они будут обновляться сторонним скриптом) и с возможностью последующего ранжирования (сортировки) по ним.
С выводом данных из папки в таблицу ранжирования вроде разобралась, работает. Регистрацию попробовала срисовать с форума, но там чёрт ногу сломит и пара комментов для "дня рождения".
Как это сделать?
1. Светлана - 21 ноября 2009 — 10:44 - перейти к сообщению
2. yura3d - 21 ноября 2009 — 18:32 - перейти к сообщению
Светлана пишет:
- отправляется письмо с уведомлением на адрес админа
Можно применить стандартную функцию PHP mail(), либо воспользоваться готовой обёрткой для неё, встроенной в ядро форума ($fm->_Mail() в файле include/fm.class.php)
Светлана пишет:
- данные, введённые в форму регистрации, в файлах форума не должны сохраняться (или сохраняться в отдельной папке, для последующего удаления)
Для работы с файлами в ядре форума есть 5 основных функций:
- mixed $fm->_Read(string $filename) - принимает в качестве аргумента строку с указанием пути к файлу относительно корня форума, открывает файл для чтения (если файла не существует, то функция возвращает пустой массив), считывает из него данные и возвращает их
- mixed $fm->_Read2Write(resource &$fp, string $filename) - принимает 2 аргумента, первым идёт ссылка на дескриптор открытого файла, вторым - путь к файлу (аналогично предыдущей функции). Функция открывает файл для чтения и записи (если файла не существует, то он создаётся), считывает из него данные и возвращает их (аналогично предыдущей функции), попутно по ссылке первого аргумента будет записан дескриптор открытого файла для дальнейшей работы с файлом (записи)
- void $fm->_Write(resource $fp, mixed $data) - функция записывает данные, переданные ей во втором аргументе, в файл, дескриптор которого передаётся первым аргуметом. После записи файл закрывается. Дескриптор должен быть получен по ссылке в первом аргументе функции $fm->_Read2Write()
- void $fm->_Fclose(resource $fp) - закрывает файл, дескриптор которого передётся первым аргументом. Дескриптор должен быть получен по ссылке в первом аргументе функции $fm->_Read2Write()
- void $fm->_FcloseAll() - закрывает все файлы, открытые функцией $fm->_Read2Write()
Таким образом, для реализации хранения данных подойдёт такой пример реализации:
CODE:
// Формируем некоторый массив, который затем запишем в файл
$array = array('account1' => 'счёт № 1');
// Создаём файл в папке svetlana относительно корня форума с именем $id.php, где $id - некоторое число-идентификатор
$fm->_Read2Write($fp, 'svetlana/'.$id.'.php');
// Записываем массив $array в файл с дескриптором $fp (см. предыдущую строку)
$fm->_Write($fp, $array);
$array = array('account1' => 'счёт № 1');
// Создаём файл в папке svetlana относительно корня форума с именем $id.php, где $id - некоторое число-идентификатор
$fm->_Read2Write($fp, 'svetlana/'.$id.'.php');
// Записываем массив $array в файл с дескриптором $fp (см. предыдущую строку)
$fm->_Write($fp, $array);
Имеется несколько важных особенностей работы файловых функций из ядра ExBB:
- После открытия файла функцией $fm->_Read2Write() на него устанавливается исключительная блокировка, это значит, что ни один из процессов не сможет обращаться к этому файлу, пока текущий процесс (под которым был открыт файл) не запишет или не закроет его (это необходимо, поскольку если несколько процессов получат одновременный доступ к файлу на запись, то целостность данных будет нарушена). Таким образом логика работы должна быть таковой: заранее сформировать данные (например, массив), которые требуется записать, открыть файл функцией $fm->_Read2Write() и тут же их записать функцией $fm->_Write(). В противном случае все другие процессы будут подвисать в процессе ожидания снятия исключительной блокировке, что существенно скажется на скорости работы Вашего приложения
- Всем создаваемым файлам давайте расширения php - функции по работе с файлами из ядра ExBB автоматически добавляют в файлы инструкции-терминаторы языка PHP, которые предотвращают получение содержимого файлов при помощи прямого обращения к ним по HTTP. Таким образом Вы избавитесь от необходимости использования htaccess-файлов в папке с Вашими файлами
3. Светлана - 21 ноября 2009 — 19:34 - перейти к сообщению
Спасибо... Это объяснение для программиста. Но всё-равно - спасибо, нахОдите время. Буду пытаться не запутаться ещё больше ... второй аргумент... надцатый... создавать файлы... Создадим, создадим... Бум пытаться...
4. yura3d - 21 ноября 2009 — 19:47 - перейти к сообщению
Светлана пишет:
Спасибо... Это объяснение для программиста. Но всё-равно - спасибо, нахОдите время. Буду пытаться не запутаться ещё больше ... второй аргумент... надцатый... создавать файлы... Создадим, создадим... Бум пытаться...
Ну Вы просто напишите здесь задачу, желательно опишите в понятиях, близких к программированию (например, создать файл и записать туда такие-то данные), тогда я постараюсь помочь с реализацией (и по возможности прокомментирую участки кода, чтобы было понятно, что они делают). Просто понятия типа счёт мне также ничего не говорят , PHP поддерживает ограниченное кол-во типов данных и только этими типами он может оперировать, не знаю как именно представляется Ваш счёт, но для сохранения его в файл необходимо его представить как объект типа, поддерживаемого PHP (или совокупностью объектов таких типов)
5. Светлана - 21 ноября 2009 — 19:54 - перейти к сообщению
yura3d пишет:
О! Вот, вот! Было бы шикарно! Постараюсь написать на эсперанто и по возможности прокомментирую участки кода, чтобы было понятно, что они делают
(Добавление)
Пробую... Что присутствует в форме: радиогруппа выбора - 'R' или 'D', поля для данных 'N', 'P', 'S'.
При нажатии на кнопку (я уж так пишу) "зарегистрировать", отправляется письмо администратору с именем Пользователя, категорией счёта 'R' или 'D', данными счёта 'N', 'P', 'S' и датой регистрации.
Создаётся 2 файла. В файл 'N' записываются: ник пользователя на форуме и дата регистрации. В файл 'N'_data: данные 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' равные 0. Каждый из данных файла №_data будет использован для ранжирования (сортировки по ним) в файле, подобном members.php. Можно при создании этого файла ничего в него не записывать (и даже не создавать), т.к. он будет полностью обновляться через фтп специальным скриптом торгового терминала.
В зависимости от выбора пользователем категории 'R' или 'D', файлы создаются в заранее созданных папках 'R' или 'D' в папке counts.
Надеюсь, сейчас написала более/менее правильно...
6. Светлана - 27 ноября 2009 — 14:36 - перейти к сообщению
Может быть всё же кто-то объяснит, поможет? Неужели один Юра спец по РНР? Вроде бы не должно быть сложным...
7. 1Bot - 27 ноября 2009 — 14:51 - перейти к сообщению
Светлана пишет:
Создаётся 2 файла. В файл 'N' записываются: ник пользователя на форуме и дата регистрации. В файл 'N'_data: данные 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' равные 0. Каждый из данных файла №_data будет использован для ранжирования (сортировки по ним) в файле, подобном members.php. Можно при создании этого файла ничего в него не записывать (и даже не создавать), т.к. он будет полностью обновляться через фтп специальным скриптом торгового терминала
Телепатов здесь нет
(Добавление)
Светлана не нужно давать информацию. не относящуюся к вопросу - подробнее распишите исходную информацию, действия и форматы файлов, которые необходимо создавать - тогда можно надеяться на скорую помощь и будет уверенность в том, что сделано именно то, что Вам нужно.
8. Светлана - 27 ноября 2009 — 15:13 - перейти к сообщению
1Bot пишет:
Видите ли... Когда я узнаю, что именно вы подразумеваете под "исходной информацией, действиями (!)... " и т.д. и что именно "не относящееся к вопросу" по вашему мнению... надеюсь, по дороге к этому я смогу написать сама. Боюсь, что вы пожелали мне доброго пути! Спасибо. Я стараюсь. Но пока вот никак. Трудозатраты, к сожалению, колоссальны.
Телепатов здесь нет
(Добавление)
Светлана не нужно давать информацию. не относящуюся к вопросу - подробнее распишите исходную информацию, действия и форматы файлов, которые необходимо создавать - тогда можно надеяться на скорую помощь и будет уверенность в том, что сделано именно то, что Вам нужно.
(Добавление)
Светлана не нужно давать информацию. не относящуюся к вопросу - подробнее распишите исходную информацию, действия и форматы файлов, которые необходимо создавать - тогда можно надеяться на скорую помощь и будет уверенность в том, что сделано именно то, что Вам нужно.
9. 1Bot - 27 ноября 2009 — 15:55 - перейти к сообщению
Светлана Попробую описать обработчик регистрационных данных с комментариями:
Техническое задание
Что присутствует в форме: радиогруппа выбора - 'R' или 'D', поля для данных 'N', 'P', 'S'.
При нажатии на кнопку "зарегистрировать", отправляется письмо администратору с именем Пользователя, категорией счёта 'R' или 'D', данными счёта 'N', 'P', 'S' и датой регистрации.
Создаётся 2 файла:
* В файл 'N' записываются: ник пользователя на форуме и дата регистрации.
* В файл 'N'_data: данные 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' равные 0.
В зависимости от выбора пользователем категории 'R' или 'D', файлы создаются в заранее созданных папках 'R' или 'D' в папке counts
Обработчик регистрационных данных
register_post.php
Техническое задание
Что присутствует в форме: радиогруппа выбора - 'R' или 'D', поля для данных 'N', 'P', 'S'.
При нажатии на кнопку "зарегистрировать", отправляется письмо администратору с именем Пользователя, категорией счёта 'R' или 'D', данными счёта 'N', 'P', 'S' и датой регистрации.
Создаётся 2 файла:
* В файл 'N' записываются: ник пользователя на форуме и дата регистрации.
* В файл 'N'_data: данные 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' равные 0.
В зависимости от выбора пользователем категории 'R' или 'D', файлы создаются в заранее созданных папках 'R' или 'D' в папке counts
Обработчик регистрационных данных
register_post.php
PHP:
<?php
# настройки
$folder = 'c:\webserv\rc1.ru\www\forum\counts\'; // путь к директории счетчиков
// поля из формы
$category = _REQUEST['category']; // категория счета (R или D)
$n = _REQUEST['N']; // номер счета
$nick = _REQUEST['nick']; // ник пользователя, который регистрируется
// ДЕЙСТВИЯ
// 1 - создание файла
$template = array( // шаблон данных для файла N_data
'a' => 0,
'b' => 0,
'c' => 0,
'd' => 0,
'e' => 0,
'f' = 0,
'g' => 0,
'h' => 0
);
$n_data = array( // ник и дата регистрации
'nick' => $nick,
'reg_date' => time()
);
if (($category === 'D') or ($category === 'R')) {
// В файл 'N' записываются: ник пользователя на форуме и дата регистрации
$fp = @fopen($folder.$category.'\'.$n, 'a+');
flock($fp, 2);
fwrite($fp, serialize($n_data));
fflush($fp);
flock($fp, 3);
fclose($fp);
// В файл 'N'_data: данные 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' равные 0
$fp = @fopen($folder.$category.'\'.$n.'_data', 'a+');
flock($fp, 2);
fwrite($fp, serialize($template));
fflush($fp);
flock($fp, 3);
fclose($fp);
}
// 2 - отправка почты администратору
// пока не ясно
?>
10. yura3d - 28 ноября 2009 — 12:45 - перейти к сообщению
Светлана
Для начала определимся с формой. Мой шаблон с формой будет содержать только сами поля формы с кнопкой отправки, и более ничего, Вам конечно же нужно будет доверстать страницу самостоятельно. Создайте шаблон templates/ваш_скин/reg_table.tpl, форма в нём примет вид:
Далее создаём скрипт reg_table.php, который будет выводить нашу форму, а также отправлять введённые данные на e-mail администратору и создавать необходимые файлы с информацией. Сам скрипт будет выглядеть примерно так:
Конечно, это не конечный вариант, а только каркас. Конечный вариант (с проверкой всех возможных значений вводимых данных) будет несколько длиннее
Для начала определимся с формой. Мой шаблон с формой будет содержать только сами поля формы с кнопкой отправки, и более ничего, Вам конечно же нужно будет доверстать страницу самостоятельно. Создайте шаблон templates/ваш_скин/reg_table.tpl, форма в нём примет вид:
CODE:
<form method="post">
<input type="radio" name="radio" value="R">
<input type="radio" name="radio" value="D">
<input type="text" name="N">
<input type="text" name="P">
<input type="text" name="S">
<input type="submit">
</form>
<input type="radio" name="radio" value="R">
<input type="radio" name="radio" value="D">
<input type="text" name="N">
<input type="text" name="P">
<input type="text" name="S">
<input type="submit">
</form>
Далее создаём скрипт reg_table.php, который будет выводить нашу форму, а также отправлять введённые данные на e-mail администратору и создавать необходимые файлы с информацией. Сам скрипт будет выглядеть примерно так:
CODE:
<?php
define('IN_EXBB', 1); // Скрипт относится к ExBB
require_once('include/common.php'); // Подключаем ядро ExBB
$fm->_GetVars(); // Получаем входящие данные
if ($fm->__POST !== true) { // Если форма не отправлена
// Выводим форму
$fm->_Title = ' :: Регистрация счёта'; // Заголовок страницы будет добавлен за названием форума
// Далее идёт подключение шаблонов
include('./templates/'.DEF_SKIN.'/all_header.tpl'); // Заголовки страницы
include('./templates/'.DEF_SKIN.'/logos.tpl'); // Шапка форума
include('./templates/'.DEF_SKIN.'/reg_table.tpl'); // Регистрационная форма
include('./templates/'.DEF_SKIN.'/footer.tpl'); // Футер
}
else { // Форма отправлена
// Действия, если форма отправлена
$radio = $fm->_String('radio'); // Получаем значение радиогруппы (R или D)
$n = $fm->_String('N'); // Получаем значение поля N
$p = $fm->_String('P'); // Тоже самое для поля P
$s = $fm->_String('S'); // Для S
if ($radio != 'R' && $radio != 'D') {
header('Location: reg_table.php'); // Введён неверный тип счёта, возвращаемся к форме
die;
}
// Получаем текущие дату и время на сервере, которые будут использоваться как регистрационные для счёта
$regtime = $fm->_Nowtime;
// Создание ассоциативного массива с данными для 1-го файла
$data = array(
'name' => $fm->user['name'], // Имя пользователя на форуме
'regtime' => $regtime // Дата регистрации счёта
);
// Создание файла counts/<radio>/<N>.php (radio - тип счёта, N - id пользователя на форуме)
$fm->_Read2Write($fp, 'counts/'.$radio.'/'.$fm->user['id'].'.php');
// Запись содержимого массива в файл
$fm->_Write($fp, $data);
// Создание ассоциативного массива с данными для 2-го файла
$data = array(
'a' => 0,
'b' => 0,
'c' => 0,
'd' => 0,
'e' => 0,
'f' => 0,
'g' => 0,
'h' => 0
);
// Создание файла counts/<radio>/<N>_data.php (radio - тип счёта, N - id пользователя на форуме)
$fm->_Read2Write($fp, 'counts/'.$radio.'/'.$fm->user['id'].'_data.php');
// Запись содержимого массива в файл
$fm->_Write($fp, $data);
// Создаём переменную с текстом для отправки админу
$email = sprintf('Имя: %s
Категория счёта: %s
Данные счёта N: %s
Данные счёта P: %s
Данные счёта S: %s
Дата регистрации: %s',
$fm->user['name'], $radio, $n, $p, $s, date('H:i:s, d.m.Y', $regtime));
// Отправка админу почты с информацией о регистрации
$fm->_Mail($fm->exbb['boardname'], $fm->exbb['adminemail'], $fm->exbb['adminemail'], 'Регистрация счёта', $email);
// Вывод сообщения о завершении регистрации
$fm->_Message('Регистрация счёта', 'Счёт успешно зарегистрирован', 'index.php');
}
require_once('include/page_tail.php'); // Подключение части ядра ExBB, выполняющей вывод данных
?>
define('IN_EXBB', 1); // Скрипт относится к ExBB
require_once('include/common.php'); // Подключаем ядро ExBB
$fm->_GetVars(); // Получаем входящие данные
if ($fm->__POST !== true) { // Если форма не отправлена
// Выводим форму
$fm->_Title = ' :: Регистрация счёта'; // Заголовок страницы будет добавлен за названием форума
// Далее идёт подключение шаблонов
include('./templates/'.DEF_SKIN.'/all_header.tpl'); // Заголовки страницы
include('./templates/'.DEF_SKIN.'/logos.tpl'); // Шапка форума
include('./templates/'.DEF_SKIN.'/reg_table.tpl'); // Регистрационная форма
include('./templates/'.DEF_SKIN.'/footer.tpl'); // Футер
}
else { // Форма отправлена
// Действия, если форма отправлена
$radio = $fm->_String('radio'); // Получаем значение радиогруппы (R или D)
$n = $fm->_String('N'); // Получаем значение поля N
$p = $fm->_String('P'); // Тоже самое для поля P
$s = $fm->_String('S'); // Для S
if ($radio != 'R' && $radio != 'D') {
header('Location: reg_table.php'); // Введён неверный тип счёта, возвращаемся к форме
die;
}
// Получаем текущие дату и время на сервере, которые будут использоваться как регистрационные для счёта
$regtime = $fm->_Nowtime;
// Создание ассоциативного массива с данными для 1-го файла
$data = array(
'name' => $fm->user['name'], // Имя пользователя на форуме
'regtime' => $regtime // Дата регистрации счёта
);
// Создание файла counts/<radio>/<N>.php (radio - тип счёта, N - id пользователя на форуме)
$fm->_Read2Write($fp, 'counts/'.$radio.'/'.$fm->user['id'].'.php');
// Запись содержимого массива в файл
$fm->_Write($fp, $data);
// Создание ассоциативного массива с данными для 2-го файла
$data = array(
'a' => 0,
'b' => 0,
'c' => 0,
'd' => 0,
'e' => 0,
'f' => 0,
'g' => 0,
'h' => 0
);
// Создание файла counts/<radio>/<N>_data.php (radio - тип счёта, N - id пользователя на форуме)
$fm->_Read2Write($fp, 'counts/'.$radio.'/'.$fm->user['id'].'_data.php');
// Запись содержимого массива в файл
$fm->_Write($fp, $data);
// Создаём переменную с текстом для отправки админу
$email = sprintf('Имя: %s
Категория счёта: %s
Данные счёта N: %s
Данные счёта P: %s
Данные счёта S: %s
Дата регистрации: %s',
$fm->user['name'], $radio, $n, $p, $s, date('H:i:s, d.m.Y', $regtime));
// Отправка админу почты с информацией о регистрации
$fm->_Mail($fm->exbb['boardname'], $fm->exbb['adminemail'], $fm->exbb['adminemail'], 'Регистрация счёта', $email);
// Вывод сообщения о завершении регистрации
$fm->_Message('Регистрация счёта', 'Счёт успешно зарегистрирован', 'index.php');
}
require_once('include/page_tail.php'); // Подключение части ядра ExBB, выполняющей вывод данных
?>
Конечно, это не конечный вариант, а только каркас. Конечный вариант (с проверкой всех возможных значений вводимых данных) будет несколько длиннее
11. Светлана - 28 ноября 2009 — 17:04 - перейти к сообщению
Большое спасибо! С валидацией, думаю, справлюсь. Но столкнулась (опять и снова) с непонятным моментом. При нажатии кнопки - "Could not write in the file uccounts/R/1_data.php". Но файл создан. При 'a' => 0, в файл записывается параметр, равный 0 или нет записи? К сожалению, может регистрировать счёт не только зарегистрированный на форуме пользователь.
Попробуем справиться.
CODE:
<?die;?>a:2:{s:4:"name";s:5:"Гость";s:7:"regtime";i:1259425591;}
Попробуем справиться.
12. yura3d - 28 ноября 2009 — 17:18 - перейти к сообщению
Светлана пишет:
При нажатии кнопки - "Could not write in the file uccounts/R/1_data.php". Но файл создан.
Нужно на папки uccounts/R и uccounts/D поставить права на запись
Светлана пишет:
При 'a' => 0, в файл записывается параметр, равный 0 или нет записи?
Записывается 0
Светлана пишет:
К сожалению, может регистрировать счёт не только зарегистрированный на форуме пользователь.
Нет проблем, в файле reg_table.php после строки:
CODE:
$fm->_GetVars(); // Получаем входящие данные
добавим проверку на авторизацию пользователя:
CODE:
if (!$fm->user['id']) // Если пользователь не авторизован
$fm->_Message('Регистрация счёта', 'Гости не могут регистрировать счета'); // Ошибка: гости не могут регистрировать счета
$fm->_Message('Регистрация счёта', 'Гости не могут регистрировать счета'); // Ошибка: гости не могут регистрировать счета
13. Светлана - 28 ноября 2009 — 17:30 - перейти к сообщению
Очень оперативно. Нет слов
Проверю на хосте.
(Добавление)
При любых правах на запись - то же самое. А по умолчанию на хосте были выставлены права такие же как у папки members.
Проверю на хосте.
(Добавление)
При любых правах на запись - то же самое. А по умолчанию на хосте были выставлены права такие же как у папки members.
14. yura3d - 28 ноября 2009 — 18:34 - перейти к сообщению
Светлана пишет:
При любых правах на запись - то же самое. А по умолчанию на хосте были выставлены права такие же как у папки members.
Хм, странно, сейчас проверил, никаких проблем нет. Это сообщение выводится только для файла <N>_data.php, или для <N>.php тоже?
15. Светлана - 28 ноября 2009 — 19:41 - перейти к сообщению
Нет, только <N>_data.php
(Добавление)
В конце нужна фигурная скобка?
(Добавление)
Юра!!! Да вы же текст файла поправили, а не сообщили Всё работает! Уф! Но радует, что направление поиска ошибки было верным Ещё бы ограничение на кол-во открываемых счетов (регулируется админом) одним пользователем и запрет на повтор ай-пи адресов, а то ведь хитрых много и они для открытия дополнительных аккаунтов (чтоб на удачу получить деньги инвестора) будут регистрироваться как новые пользователи форума. Ссылку тогда "увековечим" именную . В связи с этим вопрос: ссылку с именем yura3d куда собственно... посылать. Не на ЕхВВ же.
(Добавление)
(Добавление)
В конце нужна фигурная скобка?
CODE:
if ($radio != 'R' && $radio != 'D')
header('Location: reg_table.php'); // Введён неверный тип счёта, возвращаемся к форме
header('Location: reg_table.php'); // Введён неверный тип счёта, возвращаемся к форме
(Добавление)
Юра!!! Да вы же текст файла поправили, а не сообщили Всё работает! Уф! Но радует, что направление поиска ошибки было верным Ещё бы ограничение на кол-во открываемых счетов (регулируется админом) одним пользователем и запрет на повтор ай-пи адресов, а то ведь хитрых много и они для открытия дополнительных аккаунтов (чтоб на удачу получить деньги инвестора) будут регистрироваться как новые пользователи форума. Ссылку тогда "увековечим" именную . В связи с этим вопрос: ссылку с именем yura3d куда собственно... посылать. Не на ЕхВВ же.
(Добавление)
Светлана пишет:
или кол-во просто в файле менять. Совсем не критично.
Ещё бы ограничение на кол-во открываемых счетов (регулируется админом) одним пользователем