Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Подтверждение номера на DLE
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2014 Откуда: Saint-Petersburg
Помог: 0 раз(а)
Всем здрасьте! Скажу сразу, код предоставлен в ознакомительных целях. Умников просьба не умничать. комментарии по факту - приветствуются.
Предыстория... Я долго искал варианты подтверждения телефонного номера клиента под DLE собственноручно, без использования громоздких модулей и sms-шлюзов (не редки случаи, когда начинают "переподтверждать" свой номер, дабы нанести материальный ущерб владельцу сайта). Мне это нужно, чтобы пользователь без подтвержденного номера, не мог оставить заказ на выполнение работ (сами понимаете, сложно созвониться с тем, чего номера нет). Собственно толкового ничего не было, поэтому пришлось калдырить самому. Сразу скажу, для поля с телефонным номером я использовал уже устаревшее поле ICQ. Правку текста "ICQ" на "Телефон" описывать не стану. Скажу лишь, что переменные в БД и шаблоне ({icq}) остались такие же.
Для начала, я подправил шаблон registration.tpl таким образом, чтоб поля
напоминаю, id и name у инпута я специально оставил старыми, чтоб меньше было искать по всем остальным модулям. Однако, не стоит забывать, что юзверь - переменная не постоянная и один и тот же номер может ввести по-разному. А нам нужны только цифры (ровно 11 штук). Поэтому, поискав на просторах необъятной паутины, нашел интересное решение на jQuery от товарища по имени Леонид. Ссылка на решение (Не реклама!)
Плюс, по какому-то кодексу, пользователь должен дать своё согласие на обработку своих данных. Так в шаблоне появился еще и чекбокс (код будет ниже). Однако, Великому господину надо бы сообщить, что будет, если он не захочет подтверждать номер. Таким образом ещё одна конструкция с алертами на JS была пришпилена к шаблону...
Понимаю, заскучали. Скоро конец)
финальный вид части кода моего шаблона:
Собственно, с шаблоном всё! можно залить на хостинг и проверить, работает или нет. Теперь нам необходимо знать, отправил ли нам Юзер телефон и хочет ли он его подтвердить...
ищем файл ../engine/modules/register.php
копируем к себе и правим.
находим строчки
коментим или удаляем. поясняю: в том месте где они сейчас стоят толку от них не будет, да и проверка на 20 символов (такое поле у таблицы в БД) тоже не к чему, когда используем модифицированный инпут.
также ищем
$db->query("UPDATE ". USERPREFIX ."_users SET fullname='$fullname', info='$info', land='$land', xfields='$filecontents' WHERE user_id='{$row['user_id']}'");
отформатировали? замечательно.
скроллим этот же файл в самый верх, находим все функции check_reg (3) и в скобки, после $email, дописываем $icq. Зачем? чтобы задать проверку на повторение номера.
теперь ищем строчку
пояснялка, по строчка:
1. Получаем значение поля из формы
2. Поверяем, не пустое ли
3. если нет, формируем массив выборки цифр (если помним, в форме есть скобки, пробелы и дефисы)
4. Делаем выборку
5. Получаем значение чекбокса (хочет ли пользователь подтвердить номер - планирую использовать познее)
6. если всё-таки пустое
7. задаем пустое поле для номера телефона
8. задаем нулевое значение (использую позднее)
второй запрос нужен для последующих манипуляций, которые описаны будут позднее, ибо время уже позднее...
Ts.Saltan
Отправлено: 11 Августа, 2014 - 23:41:57
Посетитель
Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013 Откуда: Belarus
Помог: 22 раз(а)
Когда мне понадобилось подтверждать номера телефонов, искал сайты с бесплатной отправкой смс и писал к ним парсер, находились даже без капчи. Минусы в том, что доходили смс одна из 5-10.
Но потом пришлось переделать. Большинство операторов предлагают услугу смс с сайта. В таком случае смс точно доходит, но есть и свои камни: ограничение на ip (прокси), у абонента должна быть подключена эта услуга (чаще бесплатно), капча. Вот с капчей пришлось повозиться, только один оператор хранил код зашифрованным в get параметре, под остальные пришлось либо писать распознаватели (долго, нудно, громоздко, кпд около 60%), либо прогонять через сервисы распознавания (быстро, кпд под 95, но платно - 1$/1000картинок)
Mordent
Отправлено: 13 Августа, 2014 - 17:57:19
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2014 Откуда: Saint-Petersburg
Помог: 0 раз(а)
Сорри за задержку в обновлении. вчера работал.
для начала, небольшой апдейт по первой части:
код
ну или можно все 3 объединить в 1. кому как удобнее.
Едем дальше!
сейчас поясняю, зачем мне нужна была переменная $QuestConfirm и $rand_ome.
Как я и писал ранее, подтверждать номер я хочу с минимумом затрат, однако сидеть и смотреть зарегился кто на сайте и хочет ли он подтвердить свой телефон целый день желания нет. поэтому, при наилучшем варианте (Юзверь ввел телефон и нажал галочку "Хочу подтвердить"), нам будет падать на e-mail сообщение.
итак. мы помним, как добавляли в запрос к базе номер телефона (icq) и questconfirm
ниже должна быть строчка
теперь понятно, зачем нужна была лишняя переменная? e-mail будет отправляться только при выполнении 2х условий: номер не пустой и стоит галочка. при других вариантах: номер пуст, но галочку пользователь зачем-то поставил, или номер пуст и нет галочки, или номер есть, но нет галочки - смотрим выше: либо $QuestConfirm скрипт принудительно присвоит 0, либо "возьмет" 0 из формы.
Собственно на этом работа с модулем регистрации закончена.
Повторюсь, переделка ведется для DLE 10.0. за работоспособность младших версий не отвечаю, как и за адекватную работу в других системах!
Почитали, испугались... не закрыли?
кулибничаем дальше)
вот пользователь ввел свой номер, захотел его подтвердить, нам на почту упало сообщение. всё чудесно. но как админу подтвердить номер?
ищем в папке ./engine/inc. файл editusers.php. перекачиваем для правки
ищем в нем строчку
$editNumHTML="<input type=\"checkbox\" name=\"editNum\" value=\"1\"><span> Пользователь хочет изменить номер!</span>";
как обыно, поснялка:
1-2. если пользователь не отправлял запрос, мы и подтверждать ничего не будем.
3. если отправлял, то проверяем, не был ли уже номер подтвержден
4-5. если да - выводим в форму инфу о ненадобности подтверждать
6-7. нет - выводится номер телефона (с возможностью правки) и 2 радио-кнопки: подтвердил юзер или нет
следует понимать, что после подтверждения номер редактировать уже нельзя. поэтому
10. добавляем чекбокс с подписью что пользователь хочет сменить номер (после сохранения номер телефона будет сброшен и станет доступен для регистрации).
это - форма. теперь нам надо её вывести.
ищем
if($editNum== 1)$db->query("UPDATE ". USERPREFIX ."_users set icq='', confirm_num='0', questconfirm='1' WHERE user_id='$id'");
Стандартненько:
1. Проверка, пришло ли что-нибудь из формы с именем editicq (немного выше, мы сделали так, что name="editicq" было только в момент подтверждения номера. таким образом мы облегчили скрипт от постоянной проверки и перезаписи БД). если да, то
2. "оцифровываем" номер из поля инпут
3. ищем, где стоит радиокнопка
13. обновляем данные в БД
15-16. проверка флажка о том что пользователь хочет ИЗМЕНИТЬ номер. если стоит флажок, обновляем значения в БД для редактирования
закоменченная $editlevel это уже длань моей фантазии. перед переделкой скриптов, я переназвал 3 и 4 группы на "Клиенты (номер подтвержден)" и "Клиенты (номер не подтвержден)" соответственно. таким образом, при подтверждении номера, автоматически повышается группа (соответственно становятся доступны новые плюшки).
на этом правка этого модуля закончена.
но не закончен мой анализ действий пользователя. Пример: Гость зарегился на сайте, но номер указывать не стал, или указал, но не захотел подтверждать. как ему это сделать позднее? только из своего профиля. поэтому, ищем файл ./engine/modules/profile.php
для начала закрываем доступ к профилям других пользователей, кроме своего, если ты не админ (мы же не хотим, чтоб какой-нибудь спамер на нашем сайте сколотил себе телефонную базу )
ищем строчку
$numHTML="<div>Номер подтвержден!<br><span style=\"color:#F8070B\">Изменить номер можно только через <a href=\"$PHP_SELF?do=pm&doaction=newpm&user=1\">Заявку Администратору</a></span></div>";
}else{
if($row['questconfirm']== 1 ){
$numHTML="<div>Запрос на подтверждение отправлен! Ваш Код Подтверждения: <span style=\"color:#F8070B\">".$row['randconfirm']."</span></div>";
открываем файл шаблона userinfo.tpl. Меняем ICQ на Телефон, ниже добавляем<li>{numhtml}</li>.
находим поле для редактирования icq (input name=icq) и закрываем его (в диве, где объявляется инпут, дописать disabled="disable") а рядом вставляем {numhtmlb}.
все. мы настроили регистрацию, подтверждение и вывод различной информации о номере телефона пользователя.
краткое пояснение по последним действиям:
мы настроили вывод разного рода информационных сообщений исходя из различных условий (есть телефон - нет подтверждения - нет запроса; есть телефон - нет подтверждения - есть запрос; есть телефон - есть подтверждение; нет телефона).
вот, собственно и всё.
может кому понадобится.
всем Бобра!
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.