Как создать интернет-конкурс на Drupal
07.12.2014Подробная инструкция по созданию интернет-конкурсов на Drupal 7. Статья предназначена для веб-разработчиков, о социальных и медийных аспектах написано много где, поэтому я их не рассматриваю. Предполагается, что у вас есть базовые знания по cms/cmf, продвинутые по Drupal, вы без проблем читаете технический английский, у вас есть ТЗ, вы чётко представляете какой результат вам нужен и конкурс для вас это цель, а не средство раскрутки или заработка, что разумеется не исключает прикручивание такого функционала.
Конкурсы «у кого больше друзей в соц.сетях» — это область SEO, голосования «отправь смс _нелох_ на номер 5555» — это заработок в сети, об этом я может быть напишу как-нибудь в другой раз. В этой статье я исхожу из предположения, что ваша цель выявить реального победителя с помощью компетентного жюри.
Обращаю ваше внимание, что это сборник решений и советов, но НЕ пошаговое howto — для того чтобы написать оное для вашего конкретного случая придётся для начала сделать этот ваш конкретный случай:) Пошагово описывать мои случаи смысла нет — вам это не подойдёт, если конечно вы не хотите полностью повторить мои проекты, чего не хочу уже я. Все модули и настройки приведены для Drupal 7, в случае D6 потребуется установить cck — дальше примерно также. На D8 на данный момент конкурсы НЕ реализуются по причине отсутствия нужных модулей.
Всё нижеследующее было использовано и внедрено на двух реальных проектах:
- Интернет-конкурс бардовской песни от КСП «Самарские Барды
- Международный интернет-конкурс Грушинского фестиваля
0. Предисловие
Что такое Drupal — это гемор,
Гемор с разнотипными полями…
Друпал я не люблю. И никогда не любил. И не полюблю, но приходится. Когда не хватает CMS (content managment system) в бой идут CMF (content managment framework).
Поскольку более-менее сложный интернет-конкурс изначально по своей природе подразумевает уникальность, то для его реализации потребуется cmf, например Drupal. Впрочем это не правило, можно использовать расширения для других движков, например ACF — advanced custom fields для WordPress, но в этом случае придётся очень сильно поубавить свои хотелки и отталкиваться от функционала заложенного разработчиками.
1. ТЗ
Обойтись без технического задания конечно можно, но последующие переделки потребуют намного больше человекочасов работы.
В ТЗ должно быть прописано главное: собственно как должна выглядеть форма заявки и в виде какой структуры необходимо это выводить на сайте. Именно отталкиваясь от этих данных будет происходить вся разработка.
Если заказчик вместо ТЗ рисует в воздухе фигуры — смело увеличивайте прайс в полтора-два раза — где-то столько времени и уйдёт на переработку того что сделано в то что нужно было сделать.
2. Суть, структура и терминология
Главным элементом, на котором будет держаться логическая структура конкурса является Заявка. Под Заявкой понимается отдельный тип материала, у которого существуют разнообразные дополнительные поля.
Одна часть этих полей является информационной, например страна участника конкурса. Собственно поле с файлом, ссылкой на ютуб, или просто текстовое для рассказа это тоже информационная составляющая. Большая их часть заполняется пользователем.
Не плодите излишне много полей, чем их больше, тем больше людей со словами «да ну к чёрту эту форму два заполнять!» покинут ваш проект не поучаствовав.
Другая часть полей является структурной — именно на основе этих значений выстраивается логика вывода. Например год или тур или галочка победитель.
В основном они заполняются автоматически (см. Default Value) или администратором, а пользователю при заполнении даже не показываются, поэтому не скупитесь — лучше потом убрать лишнее, чем долго добавлять пытаясь организовать вывод так как хочется.
Пример простейшей заявки для фотоконкурса:
- Имя — собственно node title, т.е. просто используем заголовок материала
- Описание — body, текст материала
Это базовые поля, которые есть у любого материала и мы их используем, но добавим ещё и такие:
- Файл — тип поля изображение
- Номинация — список, например: «пейзаж, портрет, дети»
- Год — даже если вы делаете проект на один год — поставьте, вероятность того что он станет многолетним сильно выше чем можно представить… проще сделать списком и скрыть от пользователя
- Победитель — логическое да/нет, будет использовано при выводе победителей, всегда ваш К.О.
Первые три являются информационными, оставшиеся три структурными (хотя и несут информацию).
3. ПОЕХАЛИ!
Необходимые модули
То без чего совсем не обойтись или обойтись трудно:
- uLogin — типа loginza, только в отличие от последней нормально работает под Drupal’ом. Настоятельно рекомендую, через него авторизация получается в один клик.
- Field Permissions — доступ к полям по ролям. Если это именно конкурс, а не сборник чего-либо, то потребуется обязательно, банально чтобы дать пользователю увидеть галочку «победитель», но не дать её ставить самому. Также это понадобиться дабы
не палить канторуследовать ФЗ №152. - Conditional Fields — связанные поля, не обязательно, но очень вероятно, позволяет настроить видимость одних полей относительно других, например в фотоконкурсе с номинациями «города нашей Родины» и «фонтаны Москвы» потребуется поле «город» только в первом случае.
- views — то с чем вам придётся сидеть дольше всего — позволяет настроить вывод в том виде, в котором хочет заказчик или вы сами или так как скажет ваша бабушка-бетатестер.
Здесь и далее рассмотрены сами модули, БЕЗ указания зависимостей. Я считаю, что если вы дочитали до этого места, то умеете сами ставить модули.
Модули для корректной заливки файлов
- Transliteration — пользователи очень любят обзывать файлы в стиле «я и моя сраная кошка на фоне сраного ковра ^_^.jpg» и это далеко не самый страшный вариант, катакана и прочее встречается. Модуль позволяет транслитерировать текст и отрезать прочую гадость.
- File (Field) Paths — этот модуль служит для составления пути к файлу на основе любых полей, также с его помощью можно задать шаблон имени самого файла. НЕ заменяет предыдущий, так как некоторые имена друпал не станет грузить и до перемещения/переименования файла просто не дойдёт.
Вообщем-то абсолютно необходимыми не являются, но без них потом тяжко, да и не объяснишь юзверю что по правилам хорошего тона файлы обзывают только 0-9, a-z.
ВАЖНО! Второй модуль можно прикрутить на уже работающий проект и поставив галочку retroactive заставить друпал переименовать/переместить все файлы у предыдущих заявок, только… для начала отбэкапьтесь, дабы не было мучительно больно.
Модули для фотоконкурса
- ColorBox или Lightbox или… на ваш вкус. Собственно всё.
- exif — теоретически может потребоваться для профессионального фотоконкурса, выводит метаданные из файла, как-то экспозиция, фокусное расстояние, етц.
Вообщем-то даже первый необязателен, это только лишь вывод в модальном окне, основной функционал Drupal 7 умеет «искаропки».
Модули для видеоконкурса
- YouTube Field, либо аналог, но аналоги мне меньше понравились и в этом я не наткнулся на мелкие баги как в других.
Добавляет поле для ссылки на ютуб, выводит в материалах плеер, причём умеет выводить картинку с превью и по клику открывать модальное окно ColorBox с самим плеером — сильно востребовано если у вас штук 50 видео на страницу (пользователи зашедшие с мобильных устройств в этом случае начинают орать благим матом)). Существуют модули позволяющие работать с другими видеохостингами, но по опыту ведения различных проектов настоятельно рекомендую пользоваться только одним видеохостингом и лучше бы это был именно ютуб.
У вас может возникнуть необходимость в поднятии своего видеосервера, например по причинам лицензионной политики, однако это будет означать что вы в состоянии потратить неслабое количество денег на собственный сервер и на аренду места в датацентре, что у вас есть знания как настроить его, а ещё вам похоже скучно, раз вы читаете эту статью для новичков:)
Модули для песенного конкурса
- audio.js — самый вменяемый из плееров, поддерживает html5, т.е. играет на ведрофонах и гейфонах
- Audio Converter — это на случай любителей ogg и других форматов, но проще прописать в правилах, если пользователь в состоянии записать аудио, то конвертировать в mp3 он сможет самостоятельно, используя мощности своего компа, а не вашего сервера.
Существует довольно много решений, но кроме audio.js все кривоваты. Особенно НЕ рекомендую mp3player — он похоже вечно в стадии dev и выдаёт всякие разные ошибки.
Модули для поиска
- Auto-Index — индексирование заявки при добавлении.
позволяет забить на крон и заставить друпал индексировать материал сразу при добавлении или при изменении, очень полезная штука безотносительно конкурсов.
Модули для меню
- DHTML Menu — красиво складывает и раскладывает.
В нормальном конкурсе с кучей номинаций через пару лет меню разрастается до совсем уж неприличных размеров — это удобный способ спасти ситуацию.
Вопрос автоматического построения меню в теории решается через хитрый вывод модулем views (целесообразность под вопросом, забить десяток-другой пунктов раз в год можно и ручками), отдельного модуля удовлетворяющего критериям не найдено.
Модули для голосования
- Vote Up/Down — это чтобы заминусовать карму:)
- Fivestar — а это чтобы наставить единиц:)
Вопрос о построении на их основе структуры весьма тёмный и, вероятно, потребует дописывания дополнительных своих модулей — как иначе автоматизировать работу жюри я не представляю. Однако идеально пригодно для разогрева интереса у публики.
4. Настройка views
Это самое сложное, если раньше не работали — придётся много тыкать в попытках выдрессировать это жывотнае показывать то что вы хотите.
Сам по себе модуль служит для вывода списка материалов по тем критериям и с теми полями, которые вам нужны. Вывод материала настраивается в заявке через «типы материалов/заявка/управление отображением«.
В общем случае потребуются следующие настройки:
- Заголовок — матерное сообщение вверху страницы, например «Присланная хрень«.
- Формат — например HTML list.
- FIELDS — собственно какие поля мы выводим. Именно здесь настраивается то как оно будет выглядеть. Обратите внимание на «STYLE SETTINGS/Customize field HTML» — тут можно переделать вывод, например поставить тег H3.
- FILTER CRITERIA — чего будем выводить.
- SORT CRITERIA — по каким критериям сортировать, например по дате или по алфавиту.
- PAGE SETTINGS/Путь — путь по которому будет работать настроенный вами вывод, необходим для составления менюшек.
- CONTEXTUAL FILTERS — в отличие от критериев фильтрации этот пункт позволяет фильтровать на основе адреса. Например если добавить туда поле «номинация«, то в адресе можно будет указать «example.com/ik/video/xxx» где xxx это значение поля из базы данных, которое задано в настройках поля типа список, например «xxx|видеомануалы по настройке drupal«.
Обратите внимание на галочку Auto preview — имеет смысл её снять, так как при некорректных настройках (например вывести все заявки, коих 100500, с плеером, оно без проблем крашит браузеры). Там же рядом Preview with contextual filters — позволяет посмотреть как оно будет на основе адреса.
Собственно это базис. Более подробно читайте в инструкции к views — там можно настроить много всякого интересного, практические ограничения есть, но сомневаюсь что вы в них упрётесь.
Пример того как у меня настроен один из выводов:
В принципе, обычно требуется от трёх до пяти различных выводов с разными условиями, например: по номинациям, по времени добавления, по алфавиту, таблица победителей, етц…
Поговаривают, что им же можно нормально вывести последние камменты, потому что штатный модуль это просто песня ниачом. Пока не пробовал, обходился самописным php кодом.
5. Размышления о том как оно может быть
Существует несколько альтернативных вариантов организации структуры. Я пришёл к определённым выводам, но они не окончательны и могут сильно зависеть от конкретного проекта.
Название материала
Тут встаёт вопрос выбора, а что собственно использовать в качестве node title — имя участника или название его работы? Я выбрал имя, потому что «Иванов Иван Иванович» это более редкая комбинация, чем песТня с оригинальным названием «Осень».
Существует вариант автоматической нумерации, например «Заявка №1351», а и название и фио убрать в дополнительные поля. Правда это во-первых потребует дополнительных модулей, например Automatic Nodetitles, во-вторых тоже не без проблем — в паттернах конечно можно прописать nid, но он включает все типы материалов, а не только заявки, что приведёт к кривоватой нумерации (и чем больше у вас страниц, тем кривее).
Типы заявок
В случае конкурса включающего несколько типов заявок (например аудио и видео) можно создать один тип материала и обойтись связанными полями — это позволит обойтись одним типом, но может вызвать проблемы с разными обработчиками полей (к примеру mp3player не понимает связанных полей и валит критические ошибки). Можно создать несколько типов с разными полями, но это в свою очередь существенно усложняет настройку views — придётся создавать в разы больше выводов или же настраивать хитрее.
Структура и таксономия
Можно пойти двумя путями: использовать для создания структуры дополнительные поля, либо использовать стоковую таксономию со словарями и терминами. Первое позволяет отделить конкурсные работы от остального контента, второе наоборот увязать с остальным контентом. Сильно зависит от того что собственно хотим, я юзал первый вариант.
Стоит ли овчинка выделки?
Реализация всего этого добра далеко не всегда имеет смысл, в большинстве случаев достаточно просто создать группу вконтактике и определять победителя рандомайзером. Собственно ценность победителей это лакмусовая бумажка, если вам глубоко фияблетава какая заявка всех уделала — следует задуматься о реальной необходимости.
Подобного рода проекты нужны лишь в том случае, если контент присылаемый пользователями имеет ценность сам по себе, например как в случае с двумя моими проектами. Если конкурс служит средством для раскрутки, заработка, и т.п., а контент вторичен, либо в принципе не важен, городить ради этого сложную систему совершенно точно не имеет никакого смысла.
6. Я ниасилил, чопочём?
Под ключ
В зависимости от ваших требований цена на готовый проект начинается от $500.
Помощь
Зависит от того что вы сделали сами, в худшем случае переделка может стоить даже дороже разработки с нуля. В любом случае разговор начинается от $50, за меньшие деньги тратить минимум час чтобы разобраться в вашей реализации как-то не хочется.
Совет
Хоть у нас уже и не страна советов, но по прежнему бесплатно (в камментах). Писать в личку не надо.