Всем привет!
На днях запустил бетброкерский сайт
http://betbroker.ru/.
Довольно интересный проект, тк это уже не обычный сайт-визитка, а почти полноценное веб-приложение.
Совершенно не хочу рекламировать сайт, тк к ставкам отношусь ровно, а хочу поделиться историей разработки и опытом, который приобрел пока разрабатывал этот проект
Не знаю, с чего начать рассказ. Поэтому картинка для затравки))
Сразу скажу дальше идет много текста. Все картинки - в самом низу.
Для начала кратко поясню, что такое «бетброкерская система».
Это такая система, где посетитель может получать(бесплатно или за плату) прогнозы на различные спортивные (и не только спортивные) события. И основываясь на этих прогнозах делать ставки в букмекерских конторах.
Чем чаще прогнозист (бетброкер) угадывает с прогнозом, тем выше его рейтинг и больше доверия к нему. То есть: если поставить ставку на спорт по прогнозу бетброкера с рейтингом 90%, то есть большая вероятность того, что ставка сыграет.
Особенность этого проекта заключается в том, что всё самое интересное происходит в менеджерской части (обычному пользователю нельзя это увидеть, поэтому в самом конце топика я поставлю картинки). Обычный посетитель видит лишь сами прогнозы, может их фильтровать по разным критериям (спорт, мачт, команды и тд).
Когда встал вопрос как реализовывать менеджерскую часть, пришлось решить проблему с работой с ресурсами не из-под админки MODx’а, а как-нибудь из фронтенда.
Для этого решено было использовать связку Eform и docmanager (так сейчас все и работает). И кстати разобрался с загрузкой файлов через эту связку.
Сразу скажу — хотел сделать работу с ресурсами на AJAX’e, но во-первых: к моменту разработки не смог привязать Eform к AJAX’у. А во-вторых: не смог разобраться с аяксом))))
Теперь я могу точно сказать, как сделать аяксовое добавление данных из формы:
1. Делаем обычную форму. Причем делаем ее не в чанке, а в ресурсе.
2. Аяксом вызываем форму из ресурса (это проще, чем кажется))))
Для этого делаем отдельный сниппет. Причем желательно такой, чтобы он мог выдавать формы из любых ресурсв. Попросту говоря — универсальный
3. После заполнения формы отправляем ее аяксом в другой сниппет — принимающий, который с помощью docmanager’a записывает данные из нее куда нам надо.
Кстати, насчет аякса. Почти все сниппеты (кроме тех, в которых используются формы — типа EForm и WebLoginPE) работают на ура через runSnippet в сниппетах -бэкенда для аякса. И сама реализация довольно простая. Но сначала надо разобраться немного))
Еще очень хорошая вещь — JSon — отправляем данные аяксом с сервера в виде массива (простым языком). Советую разобраться со связкой JQuery-AJAX-JSON-PHP.
С аяксом пришлось очень серьезно разобраться, когда пришло время работать с селектами в формах. Например — в селете выбирается вид спорта, а во второй селект должны загрузиться все чемпионаты по этому виду спорта.
В инете есть хорошая статья на эту тему, не касательно MODx’а, но разобраться можно на раз. Ссылку сейчас не найду уже, но смысл такой:
1. Отслеживаем яваскриптом (JQuery — это вообще палка-выручалка) выбранный опшн:
у меня в аттрибуте «value» опшнов хранятся ID соотв. ресурсов (стран, видов спорта и тд.)
2. Далее аяксом отправляем это значение в сниппет, там ищем все ресурсы с этим родителем и тут два варианта возможны — сразу же на сервере формируем набор опшнов и отправляем обратно, либо же загоняем в массив пару «id-pagetitle» и отправляем(естественно упаковав JSon’ом) клиенту. И уже у клиента с помощью JQuery формируем и вставляем опшны куда надо.
У меня и тот и тот вариант реализованы.
Также аяксом у меня отправляются коды смс-ок. На сервере они проверяются и отправляется либо прогноз, либо сообщение об ошибке.
Еще аякс + JQuery — таймеры прогнозов. Обходим каждый прогноз, меняем значения таймеров(с этим я намучался вообще) и если матч уже начался — аяксом отправляем запрос на сервер и получаем прогноз. Дополнительно реализовал защиту от подмены времени — если подсунуть скрипту время отличное от времени начала матча — будет сообщение о несанкционированном доступе, тк на сервере проверяем полученную от клиента дату с датой начала матча, взятую из базы.
Хотелось бы рассказать о фильтрах по которым происходит поиск прогнозов. Их два:
— Быстрый: прогнозы фильтруются по верхним меню спорта, «вчера-сегодня-завтра» и по статусам, а также при нажатии на ссылки «матч-страна-спорт-бетброкер» и кнопки внизу карточки прогноза.
Быстрый фильтр (точнее верхние меню) блокируются в менеджере и при фильтрации из главного фильтра
— Главный фильтр — форма в правом сайдбаре — позволяет более точно выбирать критерии для фильтрования. Все критерии взаимосвязаны и динамически подгружаются. Например, если выбрать спорт, то подгрузятся только матчи или чемпионаты этого вида спорта.
Также форма фильтра стороны позволяет фильтровать все ресурсы в мэнеджере и в соответствии с определенным ресурсом блокируются ненужные поля.
В общем — благодаря этим фильтрам можно выбрать все что угодно и где угодно и не запутаться.
Как я реализовал филтры:
1. Сделал сниппет создания формы. Он нужен для того, чтобы создавать и отдавать клиенту форму с селектами в которых отмечены нужные поля.
Поясню — например я выбрал какой-либо спорт, в соответствии этому спорту в селекте чемпионатов загрузились чемпионаты по этому спорту. При отправке формы на сервер я бы хотел получить ее обратно с теми же выбранными селектами (это вот как раз второй вариант создания опшнов)
В сниппете я делаю выборку нужных данных при формировании набора опшнов и если очередное значение равно текущему, полученому из формы — меняю плэйсхолдер в опшене. А плэйсхолдеры такие: пустой: "" и «selected=selected»
Таким образом получаю набор опшнов в котором текуший вбран.
2. Делаю сниппет фильтрации:
Исходя из того, какие значения пришли от клиента — формирую строку «WHERE» для SQL запроса. Далее подставляю эту строку в запрос и получаю выборку ID прогнозов соответственно критериям фильтра.
3. Далей из этой выборки формирую строку и подставляю ее в парметр ’documents’ при вызове Дитто из сниппета филтра и получаю все документы.
Можно конечно обойтись и без Дитто, но самому было очень лень писать замену плэйсхолдеров. А тут и дитто делает сам)
Также не хотелось заморачиваться с Tv. Так как приходилось бы делать запросы в запросах. А так у меня все необходимые значения ресурсов хранятся в неиспользуемых полях))) Схитрил
Пока пожалуй все, но рассказать можно еще очень много.
Если есть вопросы — задавайте, с удовольствием отвечу.
Коды и примеры не выкладываю специально. Если есть конкретный вопрос по исходникам и реализации тех или иных моментов - спрашивайте.
Все вопросы об экономической целесообразности проекта — не ко мне.
Все упреки по поводу незавершенности сайта (отсутствие описания, разделов «О нас», контактов и тд) тоже не ко мне. В рамках соглашений я свою работу сделал
Время разработки — 1,5 месяца. Стоимость… кстати хотел бы вас спросить — сколько может стоить такой проект?)))
Проект будет постоянно совершенствоваться, сейчас я чищу и оптимизирую код, оптимизирую саму бизнес-логику и делаю небольшие косметические работы.
Дизайн мой, все иконки кроме иконок спорта и флагов — мои.