Продажа билетов «большой стадион»

10

Я хочу (нужно) реализовать продажу билетов на стадион.
Идея состоит в том, чтобы позволить клиенту выбрать количество билетов (ограничение может потребоваться, но это не большая проблема. Думаю, я смогу добиться этого с помощью максимального количества, допустимого в корзине). После этого клиент должен выбрать свои места из карты мест. После этого процесс оформления заказа должен идти как обычно.
Кто-нибудь знает расширение для этого? Я искал один, но я не нашел тот, который соответствует моим потребностям. Или, может быть, мои навыки в Google нуждаются в улучшении.
Если расширения нет, некоторые указатели на то, как это сделать, будут великолепны.
Моя идея на данный момент - создать продукт под названием «Билет» с некоторыми пользовательскими настройками (сектор, ряд, номер места и, возможно, другие).
Страница просмотра будет сделана на заказ, поэтому пользовательские параметры не будут отображаться. Выбор билета будет происходить во всплывающем окне или наложении, и на основе этого выбора я буду имитировать пользовательские параметры при добавлении в корзину.
Карта мест будет храниться в таблице, чтобы я мог отмечать забронированные места. Стадион всегда один и тот же, поэтому достаточно одной карты.
Это об этом до сих пор. Что-то швы пропустить. Любые указатели были бы великолепны.
[РЕДАКТИРОВАТЬ]
Существует возможность создать настраиваемый продукт с 3 атрибутами (сектор, ряд и номер места, каждая комбинация в кол-во доступно 1, поэтому они не будут доступны после их покупки), но это будет означать 30 000 + продуктов (за событие). Я не хочу туда ехать. Я держу это в качестве последнего отчаянного средства., (Это больше не вариант, потому что приведет к проблеме производительности huuuuge)

Мариус
источник

Ответы:

10

Я сделал что-то вроде этого, и это надуманный пример, упрощенный, чтобы понять, считаете ли вы это жизнеспособным решением:

Это похоже на определение сетки судоку, но открытые области сетки судоку являются открытыми местами:

$section1 = <<<SECTION

A,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
C,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
D,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
E,-,-,-,-,-,-,-,-,-,-,-,-

SECTION;

Эта таблица мест (сетка судоку) хранится отдельно для каждого продукта. Каждое событие - это новый продукт. Сетка обновляется, когда кто-то добавляет в корзину (или совершает покупки, в зависимости от бизнес-правил):

$section1 = <<<SECTION

A,-,-,x,-,-,-,-,-,x,-,-,x,x,x,x,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
B,-,-,-,-,-,-,-,-,-,-,-,-,-,x,-,-,-,-,-,-,-,-,-,-,-,-,-
C,-,-,-,-,-,x,x,x,-,x,-,x,-,-,-,-,-,-,-,-,-
D,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
E,-,-,-,-,-,x,-,x,-,x,-,x

SECTION;

Чтобы разделить наличие сидений в вашей модели бэкэнда, это просто explode:

$chart = array();

$section = trim(explode('\n', $product->getSeatingChart()));

foreach($section as $row){
    $seats = explode(',',$row);
    $rownum = array_shift($seats);
    $chart[$rownum] = $seats;
}

Мы можем превратить $chartв булевы:

array_walk($chart,function(&$s){
    $s = $s == "-" ? true : false;
});

Проверьте, доступен ли A14 (0 проиндексировано, помните):

function checkAvailability($row,$seatnum){

    return $chart[$row][$seatnum-1] == true;

}

Потенциал роста:

Реализация очень проста: ваш атрибут доступности места анализируется моделью бэкэнда. По сути, это собственный атрибут EAV. Вы также можете настроить цены на основе разделов. Каждый раздел - это новый SKU с новой ценой. Вы можете заблокировать места на некоторых мероприятиях, а не на других. Кроме того, нет необходимости проводить реальные запасы, установите только количество в позиции заказа клиента во время оформления заказа для расчета цены.

Уровни тоже будут работать, поэтому вы получаете скидки на оптовые покупки бесплатно; это могло быть проблемой с пользовательскими параметрами.

Даунсайд:

Бронирование места будет вашей самой большой головной болью, потому что вы не несете фактический инвентарь; вот где этот метод разваливается. Бизнес-правила будут определять, как вы блокируете / удерживаете места во время проверки.

philwinkle
источник
1
+1 Вау. Если кто-нибудь когда-нибудь напишет «Искусство программирования на Magento», то лучше в качестве примера.
Календжордан
Прежде всего я хочу сказать, что чувствую себя идиотом. Конечно, цены должны быть на разделах. Я думаю, что цена была на каждое место. D'ой !. Что касается стороны, я не вижу ни одного. Я могу иметь простую таблицу , удерживающую отведенные / купленные места для каждого события с колоннами event_id, sector, row, seat, status. Статус может быть «зарезервирован», «куплен», «недоступен». Таким образом, легко проверить, кто-то забронировал место за 2 секунды до того, как вы это сделали. Я также думаю о создании нового типа продукта (билета на событие), поэтому я буду уверен, что нет никаких проблем при настройке продукта. Спасибо за подробности
Мариус
Ваши ответы шов, чтобы собрать кусочки головоломки в моей голове. Я все еще обеспокоен проблемой производительности, потому что продажа 30 тыс. Билетов за 4-5 дней может сильно нагружать серверы, но это другая проблема. Я постараюсь сделать это расширение доступным для сообщества, как только оно будет сделано, и если я получу «зеленый свет» от клиента.
Мариус
30 тыс. Билетов - это стадион NASCAR? :) Я думаю, что наличие одного продукта билета на раздел, на событие (события - это конфиги) значительно уменьшит размер вашего каталога.
Надеемся, что
1
@philwinkle Я отправил вам электронное письмо, потому что я живу в 20-м веке и не имею учетной записи в Твиттере.
Мариус
2

Я согласен, что конфигурируемые продукты не являются хорошей идеей, так как место на самом деле является лишь указателем на то, доступен ли он или продан, и представляет его продуктом Magento звучит как излишнее.

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

Люк Коллимор
источник
Спасибо. +1. Ваш ответ в сочетании с ответом от philwinkle должен, по крайней мере, привести меня в правильное русло.
Мариус