Модуль Промокодов для клуба

Аватар пользователя Softovick Softovick 31 июля 2011 в 13:44

Кто помнит или не помнит - я писал когда то, что под заказ пишу модуль для Промокодов (пруфлинк).
Собственно постепенно я его дописываю и сегодня ударным темпом закрыл одну из хотелок.

В чем профит модуля, спросите вы?
Все просто. Если вам нужно пользователю присвоить уникальный номер из заданного диапазона и присвоить ему роль - этот модуль предназначен именно для этого. Администратор генерит промокоды через админку, выдает людям. При регистрации или при редактировании профиля пользователь может указать в специальном поле промокод и получить номер и роль. Полученный номер можно использовать, к примеру, для выдачи значков или футболок и т.п. На роль можно повесить специфические права и доступы.

Для проекта открыл sandbox http://drupal.org/sandbox/softovick/1190802 - если кто желает, может поучаствовать в тестировании и фидбеке. На всякий случай прикрепил к посту архив с модулем.

UPD:
+ добавлен выбор роли, которая присваивается при активации промокода
+ сделан прототип более детального списка промокодов в виде таблицы с ссылкой на профиль пользователя.

ВложениеРазмер
Иконка пакета promocode.zip49.19 КБ
0 Thanks

Комментарии

Аватар пользователя Softovick Softovick 31 июля 2011 в 14:23
ibarracuda wrote:

для 7-ки делать не будете?

Сначала надо довести до ума текущую версию, чтобы оно было хотя бы с минимальными удобствами. А потом уже да, буду портировать и для 7.

Аватар пользователя Softovick Softovick 31 июля 2011 в 16:55
WiseMan wrote:

А вроде есть уже такое:

или не то?

Нет, не совсем то. Regcode внешне аналогичен, но работает не так, он просто дает возможность зарегистрироватся, если введешь код (насколько я помню). А Rolekey только присваивает роль по вводу кода. Ни тот ни другой не дает возможности присвоить или назначить номер пользователю.

Аватар пользователя Softovick Softovick 1 августа 2011 в 12:15
iNFerNo wrote:

а можно пример использования какой нить попонятнее и на пальцах.

Клуб болельщиков, членам клуба раздаются открытки и пригласительные с промокодами, а при регистрации ему выдается произвольным образом номер из указанных диапазонов. В реале выдается клубный значек с соответствующим номером.

Аватар пользователя iNFerNo iNFerNo 1 августа 2011 в 13:06
"Softovick" wrote:

Клуб болельщиков, членам клуба раздаются открытки и пригласительные с промокодами, а при регистрации ему выдается произвольным образом номер из указанных диапазонов. В реале выдается клубный значек с соответствующим номером.

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

Аватар пользователя Softovick Softovick 1 августа 2011 в 13:38
iNFerNo wrote:
"Softovick" wrote:

Клуб болельщиков, членам клуба раздаются открытки и пригласительные с промокодами, а при регистрации ему выдается произвольным образом номер из указанных диапазонов. В реале выдается клубный значек с соответствующим номером.

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

В данном случае да, как и большинство модулей на d.org. Возможно и другие области применения есть, у меня другими мыслями голова занята, чем выискивать их.

Аватар пользователя Softovick Softovick 1 августа 2011 в 13:52
RxB wrote:

Вьюс говно под конкретную задачу, никуда не применить, блоки последних новостей мне не нужны, а вывод тизерами тем более

Как же так, а у меня одна из запланированных фич - интеграция модуля с Views.... :(

Аватар пользователя deb deb 7 августа 2011 в 17:08

1. Нет индексов по полям uid и promonumber
2. Нет механизма удаления промокодов
3. Бредовый алгоритм присвоения случайного номера. Вы хотите до 15 тысяч раз выполнять запрос к базе, чтобы получить свободные номера? Бугога.

Аватар пользователя Softovick Softovick 7 августа 2011 в 18:28
deb wrote:

1. Нет индексов по полям uid и promonumber
2. Нет механизма удаления промокодов
3. Бредовый алгоритм присвоения случайного номера. Вы хотите до 15 тысяч раз выполнять запрос к базе, чтобы получить свободные номера? Бугога.

Вы в самом деле посмотрели код и список issue или "не смотрел, но осуждаю"?
1. И насколько это даст прирост производительности? В каком месте?
2. Собственно это есть в планах, перечислено в issue.
3. Функция _promocode_user_insert. Реально, там при присвоении номера пользователю запрос только один на получение списка промокодов, в дальнейшем работа с массивом и потом уже UPDATE. Где вы там увидели 15 тысяч обращений, я хз. А если вы имеете в виду получение случайного промокода, чтобы он был именно уникальным - возможно вы и правы, я подумаю над использованием аналогичного алгоритма с массивом, спасибо.

Собственно я не зря сделал песочницу - не хотите туда оформить ваши пожелания в виде issue?

Аватар пользователя deb deb 7 августа 2011 в 17:32

И кстати я так и не понял, зачем номер должен быть случайным. Почему не по порядку? Есть, конечно, хорошие алгоримты получения случайного номера, но по порядку всегда лучше.

Аватар пользователя Softovick Softovick 7 августа 2011 в 18:29
deb wrote:

И кстати я так и не понял, зачем номер должен быть случайным. Почему не по порядку? Есть, конечно, хорошие алгоримты получения случайного номера, но по порядку всегда лучше.

В данном случае это было изначальное требование. В планах добавить варианты выбора в настройках - случайный отбор или по порядку. Сама идея случайности выходит из того, что никто заранее не знает, какой номер будет у человека, даже тот, кто выдает промокод, соответственно и никаких обидок не будет при получении значков и т.п.

Аватар пользователя deb deb 7 августа 2011 в 20:02

А я туды не заходил, как-то скачал посмотрел и усё.

Индексы таки не лишние, хотя бы потому что если ляжет у кого-нить бд, он первым делом увидит что у него откуда-то куча запросов без индексов, и будт думать, что это и откуда.

Ну а про запросы, я скачивал модуль из этой темы, не из репозитария. Там при обновлении аккаунта есть нечто вроде:

for ($i = $min; $i < $max; $i++) {
'SELECT COUNT() ...
}

Капитан очевидность шепнул мне на ушко, что если диапазон номеров будет 100-15000, то соответственно и запросов будет 14900 штук.

Аватар пользователя Dan Dan 7 августа 2011 в 22:18

Критика приветствуется? :)

t('<strong>Promocode "%pcode":<strong> Is not valid;', array('%pcode' => $pcode)) Зачем тут <strong>? У тебя уже %pcode оборачивается в theme_placeholder(), а выделять ещё какой-то текст некамильфо - не так он важен в данном случае, а смотреться может в разных темах по-разному.

Код надо изменить:

  $flagunique = 0;
  while ($flagunique == 0) {
    $q = db_result(db_query("SELECT COUNT(promocode) FROM {promocodes} WHERE promocode = '%s'", $pcode));
    if ($q != 0) {
      $pcode = sprintf("%09d", rand(1, 999999999));
    }
    else {
      $flagunique = 1;
    }
  }

Во-первых непонятно зачем нужна агрегатная функция, много она, в данном случае, не съест, но всё равно - незачем.
Во-вторых, зачем столко кода?
Давай перепишем примерно так:

  do{
    $pcode = sprintf("%09d", rand(1, 999999999));
  }while(db_result(db_query("SELECT promocode FROM {promocodes} WHERE promocode = '%s'", $pcode)));

Ну и вообще идея такого перебора мне кажется не очень удачной. Ты тестил на таблице с несколькими десятками тысяч юзеров и промокодов?
Можно сделать алгоритм примерно O(ln(n)) в худшем случае.

Больше ничего не смотрел, т.к. у тебя виндовые переносы, у мну на них аллергия ;)

Аватар пользователя S_F S_F 25 августа 2011 в 16:22

Посмотрел, задумка правильная.
Из непонятного:
диапозоны 11-50 итд это что и нафига?
это присовеное число что ли?
Идеи по улучьшению (заодно увеличение сфер применения):
-поставить галку присваивать или нет номер. Мне например нафиг не надо уникальный номер в очереди, а вот присвоение роли очень актуально.
- сделать пакетную генерацию кодов. Тоесть выбираем 10-20-мулион кодов нам надо и список их собсвенно появляется (применительно какраз в случае использования в промо акциях) если будет экспортироваться в какой то формат вообще супер.
- Ну и добавить фишку из серии "отправь другу промокод со своим айди получи плюшку" (кстати, наверняка уже есть подобный? не подскажете)

Аватар пользователя Softovick Softovick 25 августа 2011 в 16:40

Вся фича именно в присвоении кода и роли. Отдельно для роли есть уже модуль, вполне рабочий.

Аватар пользователя S_F S_F 25 августа 2011 в 19:41

Вопрос то в универсальности. Допусим для вручения футболок мне нужен код, а завтра я футболки не буду вручать, а буду давать права на распечатку флаеров. Мне кажется так будет универсальнее..
Логично же. И не надо будет ставить вагон модулей на разные случаи...

Аватар пользователя php5eng php5eng 6 сентября 2011 в 14:53

У меня вопрос к автору этого модуля и к остальным программистам drupal.ru.
Почему вы не выкладываете модули на основной сайт друпала?
Вот как вы ищите модули для друпала? Например модуль генерации приглашений?
Я набираю в гугле drupal generate invites. И в большинстве случаев с первой же формулировки поискового запроса перехожу или на страницу нужного модуля или на страницу форума drupal.org
Теперь скажите, найдется ли этот модуль промокодов с одного запроса? Вы тратите много времени на написание модуля и после этого решаете помочь другим пользователям которые столкнутся с такой же задачей. Так почему бы не увеличить количество людей, которым вы поможете, выложив модуль в то место, где его увидят больше пользователей?

Аватар пользователя Softovick Softovick 6 сентября 2011 в 17:00
php5eng wrote:

У меня вопрос к автору этого модуля и к остальным программистам drupal.ru.
Почему вы не выкладываете модули на основной сайт друпала?
Вот как вы ищите модули для друпала? Например модуль генерации приглашений?
Я набираю в гугле drupal generate invites. И в большинстве случаев с первой же формулировки поискового запроса перехожу или на страницу нужного модуля или на страницу форума drupal.org
Теперь скажите, найдется ли этот модуль промокодов с одного запроса? Вы тратите много времени на написание модуля и после этого решаете помочь другим пользователям которые столкнутся с такой же задачей. Так почему бы не увеличить количество людей, которым вы поможете, выложив модуль в то место, где его увидят больше пользователей?

Как то вот вопрос не по адресу, ибо http://drupal.org/sandbox/softovick/1190802
В песочнице, потому что не считаю его пригодным для использования широкой общественностью. Тем не менее по ключевым словам drupal promocode ссылка находит в первой десятке.

Аватар пользователя Dan Dan 6 сентября 2011 в 15:50

Было бы просто - выкладывали бы и модули и темы.
Плюс выложить модуль - это не просто записать на drupal.org, его ещё и поддерживать надо, на что надо уйму времени.

Аватар пользователя php5eng php5eng 6 сентября 2011 в 15:58

Даже если не в модули, а на форум друпал.орг (он первый в результатах поиска) или хотя бы на этом форуме описание на английском кто нибудь выкладывал бы от этого всё равно была бы польза