Friday, June 27, 2014
Monday, June 23, 2014
Изменения в работе отдела продаж после внедрения amocrm
Изменения в работе отдела продаж после внедрения amocrm.
С год наза я перебирал CRM-системы для внедрения в своих направлениях. Перебрал несколько десятков, плюс до этого был опыт работы с 1С-CRM и Quick Sales (пчелка). Подробнее опыт описал на блоге по бизнес-софту. Остановился на amocrm, системе простой, и очень эффективной, и вот какие изменения в работе отдела продаж произошли:
до внедрения amocrm | после внедрения amocrm | |
---|---|---|
список контактов для работы | ответственный распечатывал и давал звонящим | импортирует список в црм и ставит задачи (оптом) |
call-менеджеры | звонят по распечатке с контактами, делают пометки на бумаге, передают инф спецам по дожиму | звонят по задачам в црм, сразу вносят результаты звонка, ставят задачи спецам по закрытию сделки |
спецы по продажам | безраздельно владели информацией о клиентах | контролируются на предмет внесения точной информации |
контроль | чтобы узнать, на какой стадии продажи, на какой ступени воронки продаж находится клиент, надо звонить продажнику. | в любое время дня и ночи можно открыть карточку клиента и увидеть всю историю отношений с ним. |
уход сотрудника (дефолтом все уносят с собой базу) | надо вытряхивать продажника на предмет передачи клиентов другому сотруднику (если он есть) | обрубается доступ в базу, вся информация о клиентах у фирмы |
сделки, близкие к оплате | приходилось составлять и корректировать списки сделок, близких к оплате | внесли шаги воронки продаж, и сделки интересующей ступени просто отбираются фильтром |
импорт информации из CRM, архивирование | архив представлял обой файлы excel и разнообразные бумажные записи | типовые файлы excel |
постановка задач по клиентам | устно по телефону, изредка по емейл, чату в скайпе | в црм, письменно, с отображением времени, необходимостью закрыть задачу в срок |
отслеживание рекламы на полном цикле продажи | периодически считали, сколько людей по какому каналу обращались. | в црм в сделках ввели доп поле «источник, откуда пришел клиент», и отслеживаем какой канал дает именно платящих клиентов. |
придумали фишку, как без особых затрат денег и времени спецов касаться лпр-в с холодными интересами | вносили их в сервисUniSender, который автоматом высылал им раз в мес очередное письмо из автосерии емейлов. | amocrm интегрируется с UniSender и позволяет внести емейл клиента в сервис рассылки прямо из карточки клиента. и это класс! |
включение в работу нового сотрудника | персональное обучение каждый раз | в зубы сценарий звонка, телефон и список контактов в CRM. Обязательно ежедневная статистика. вместе делаем десяток-другой звонков и в работу в тот же день. |
Т.е. часть изменений — глобальные плюсы. И без CRM успешную работу отдела продаж я себе уже плохо представляю.
Friday, June 20, 2014
iMetrics 2012: отчет с профессиональной конференции по веб-аналитике
iMetrics 2012: отчет с профессиональной конференции по веб-аналитике
- 15.11.2012
- / Категория События
- / 4 комментария
Основные тезисы с конференции iMetrics 2012
Рекомендации и конверсия
Используйте «user generated statistics» – так опытные посетители смогут помочь новичкам.
Опыт Wikimart говорит о том, что рекомендательные сервисы на сайте могут поднять конверсию.
Что можно рекомендовать?
- С этим товаром часто смотрят (самый популярный алгоритм на сайте wikimart)
- Внешний поиск – товары, которые чаще всего покупают люди пришедшие по поисковой фразе. Анализируем referer и поисковый запрос и подставляем нужные товары. (2й по популярности)
- Товары-аналоги (3й по популярности)
- Персональные рекомендации на основе последних нескольких кликов посетителя (4й по популярности)
- Искавшие «…» купили
- Популярные товары
- После просмотра купили
Как это работает?
- Собираем статистику
- Считаем рейтинг
- Сортируем
- Показываем топ нашего рейтинга
- Транзакции
- Веб логи:
Где взять данные?
- Просмотры
- События (добавление в корзину, …)
- Внешний поиск
- Поиск по сайту
- …
Замечания
- Используйте веса событий (пример цифр от Wikimart: вес транзакции – 5, вес просмотра товара – 1, вес добавления в корзину – 3)
- Учитывайте давность (например: вес события, которое произошло в течение недели – 1; 3 месяца назад – 0,33; …)
- Связка товар-товар должна встречаться 2 раза (однократное совпадение может быть абсурдным)
Easyrec.org – готовый бесплатный сервис построения рекомендаций.
Скорость сайта + конверсия
- Человек замечает уже 100-200 мили секунд ожидания (на подсознательном уровне)
- Количество загружаемых файлов существенно влияет на скорость загрузки страницы.
- Google тестировал влияние одной иконки в выдаче на скорость загрузки и лояльность пользователей – вместо маленькой картинки использовали таблицу (1 ячейка = 1px) с фонами.
Результат: время загрузки увеличилось на 2%, количество запросов на пользователя уменьшилось на 2%. - Средняя скорость загрузки сайтов в РФ — 2.5 секунды (в мире — 3 сек для сайтов и 5 сек для мобильных устройств).
Особенность продажи SaaS
Воронка продаж:
- Ёмкость рынка
- Показы
- Посетителей на сайте
- Регистрация (1-я конверсия)
- Активность (пользуется/не пользуется)
- Продажа (2-я конверсия)
- Продление подписки
Интересный негативный кейс от amoCRM:
Поменяли Landing page. В результате регистраций на 300% больше, заказы пропали. Получается, таким изменением отсеяли своих клиентов.
Вывод: Регистрация не круто. Круто – хорошая регистрация. Пользователь должен быть готов к тому, что он увидит внутри после регистрации.
Цена – это, прежде всего, инструмент:
- Можно делать скидки
- Просить обменять на действие (отзыв, публикация, …)
- Предлагать оплатить подписку на разный срок
Оптимизация конверсии. Взлёты и падения. Исповедь профессионала. Анатомия идеальной посадочной страницы. (Брайан Айзенберг и Джеффри Айзенберг)
Пирамида приоритетов Айзенберга (аналог пирамиды Маслоу для сайта):
Внизу находятся самые жизненно-важные вещи (например, Functional (функционирование) – если сайт не работает, заниматься остальными вещами бесполезно), вверху – самые сложные (то, что требует больше усилий и квалификации).
Чтобы понять, как продать что-то с помощью сайта, нужно ответить как минимум на 3 вопроса:
- Кто пытается у нас что-то заказать?
- Какое действие нам нужно от покупателя?
- Какое действие покупатель хочет совершить?
- Скорость внесения изменений на сайте очень важна. Когда умер Майкл Джексон, Амазон изменил главную страницу всего лишь за 2 часа.
- Амазон тестирует 200 фич в месяц. В среднем компании тестируют 2-3 фичи в месяц.
- Websitetestingtools.com – Инструменты онлайн-маркетинга от Bryan Eisenberg.
- Штамп/ярлык (новое, sale, популярное) на товаре увеличивает конверсию на 55%.
Когда посетитель приходит на сайт, его, в основном, интересуют 3 вещи:
- Релевантность (Это то, что я ищу?)
- Ценность (Это действительно лучшее решение для меня?)
- Призыв к действию (Что мне делать?)
- В городах Антверпен, Париж, Милан компании, продающие одежду, составляют прогноз цвета (какой цвет начинают носить люди) и подстраивают свои коллекции под прогнозы.
- Для разных типов посетителей работают разные призывы к действию (пример – предвыборная кампания Обамы в 2008 году).
- Сервис Runa.com (к сожалению, платный и свободной регистрации там сейчас нет) – собирают данные о заказах и посетителях (демография, активность на сайте, интересующие разделы, …) и на их основании генерируют наиболее эффективное спец. предложение (3% скидка, 5% скидка, бесплатная доставка, купон на вторую покупку, …).
Использование Google Analytics API без программировнаия
Google Analytics Query Explorer – бесплатный инструмент, позволяющий делать запросы через GA API.
Плюсы использования Google Analytics Query Explorer:
- Возвращает до 10.000 строк
- Выгрузка в TSV
- Можно использовать до 7 параметров и до 10 показателей в одном запросе
- Тестирование и "расширение" запросов
Узнаваемость бренда
Основные способы повышения узнаваемости бренда:
- баннеры,
- ролики на youtube,
- соц. сети,
- КМС Adwords + ремаркетинг
Формула расчёта коэффициента узнаваемости бренда:
Однако, эту формулу не следует воспринимать всерьёз. Во-первых, она может показать только тенденцию изменения узнаваемости бренда, а не абсолютный показатель. Во-вторых, формула не будет давать адекватной оценки при изменении видимости сайта в поисковых системах (работы по SEO) или, например, при запуске контекстной рекламной кампании.
Анализ конкурентов легальными способами
- Примерную оценку количества заказов можно получить, проведя анализ изменения id заказов
- Анализ посещаемости можно провести с помощью:
- открытой статистики счётчиков
- анализаторов логов, которые иногда общедоступны
- Анализ SEO:
Мастер-класс по Яндекс.Метрике
- Новое в Яндекс.Метрике: Отказались от флэша – ура владельцам планшетов!
- Параметры интернет-магазина в Яндекс.Метрике можно использовать как аналог $Index (ценность цели) в GA для всех сайтов.
- аналог GA debugger для Яндекс.Метрики: https://addons.mozilla.org/ru/firefox/addon/yandexmetrika/
Мастер-класс по Google Analytics
Что умеет Google Analytics Premium (что скоро появится в стандартной версии):
- go.mail.ru и rambler теперь в числе поисковиков, которые GA понимает в настройках по умолчанию (без добавления addOrganic в код счётчика)
- Мультивариативное тестирование вернётся в Google Analytics!
- Грядёт Universal Analytics! Браузеры + приложения + устройства будут связаны. Оффлайн + онлайн. Кастомные метрики (данные из CRM). Всё это будет в Universal Analytics. Закрытый Bata-test – 1 квартал 2013 года. Полная реализация – лето 2013.
Докладчик от GA Не отрицает, что данные из GA могут влиять на выдачу. (В настройках есть галочка – шарить данные другим сервисам Google.)
- В Google Analytics можно будет загружать данные о расходах из других рекламных источников.
Инструменты анализа большого количества данных. Работа с трафиком.
Как определить продающий потенциал входящего трафика?
Как определить желания и цели посетителей, как распределить маркетинговые ресурсы для оптимизации конверсии?
(Брайан Айзенберг и Джеффри Айзенберг)
- Реклама = акселератор. Если Вы плохо ведёте бизнес, привлечение доп. аудитории только ухудшит дело.
- wirify.com - сервис, который изобразит ваш сайт в виде блоков в 1 клик.
- Как сравнить себя с конкурентами?
- Возьмите страницу, описывающую продукт со своего сайта и с сайта конкурента, уберите брендинг и попросите незнакомых людей выбрать один из продуктов. Они заметят, если между ними есть разница. А если её нет, у вас нет конкурентных преимуществ в глазах посетителей.
Используйте веб-аналитику для того, чтобы найти:
- Страницы с высоким показателем отказов
- Страницы с высоким показателем выходов
- Страницы, на которых проводят меньше всего времени
Проверяйте:
- Ключевые слова и намерения
- запросы поиска по сайту
- правильный ли контент и призыв к действию показывается соответствующему сегменту?
- отображение сайта в разных браузерах
- битые ссылки
- согласованы ли дизайн и навигация?
- логи ошибок
- что вам говорят специалисты, которые общаются с клиентами?
- скорость загрузки
- анкоры входящих и исходящих ссылок
- нарушение аромата/следа (Broken scent*)
- низкий показатель качества от Google (например, показатель релевантности объавления странице в Google Adwords)
- форму заказа
*Scent – это специфический термин, который сложно перевести на русский язык дословно. Здесь речь идёт о соответствии ожидания посетителя тому, что он в итоге получает. Например, у Вас ведётся баннерная рекламная кампания: если баннер зелёный и на нём говорится о скидке 20%, значит эта информация должна повторяться на посадочной странице. Если вы сменили цвет, персонажа, размер скидки, … след потерян (broken scent).
Расстановка приоритетов – что делать в первую очередь?
Задача | Время внедрения | Ожидаемое влияние | Ресурсы |
A | 5 | 3 | 2 |
B | 4 | 4 | 2 |
C | 3 | 4 | 4 |
D | 1 | 5 | 5 |
5 – очень медленно, максимум ресурсов, минимальное влияние
1 – очень быстро, минимум ресурсов, максимальное влияние
Чтобы расставить приоритеты, нужно перемножить 3 значения: показатель времени, показатель влияния и показатель ресурсоёмкости. Задача с минимальным рейтингом – наиболее приоритетная.
- Среднее время ожидания ответа на запрос клиента в соц. сетях — 30 минут. Если вы не ответили на запрос в течение 5 минут — шанс конверсии падает в 100 раз.
- Если вы мне говорите, что вы профессионалы, я уже сомневаюсь в этом.
- Где достать самый продающий список своих преимуществ? Сложно прочитать этикетку, если вы сидите внутри бутылки, но ваши клиенты могут помочь описать ваш бизнес. Спросите у них, что они думают про ваш бренд, почему они работают с вами? Вы увидите, что значите для них. + расскажите о реальных бонусах, которые получит клиент.
- Клиент жаждет цену. Хотя бы неточную. Хотя бы ориентир. Если не за что зацепиться, он уходит.
- 3 кита посадочной страницы: релевантность, ценность, призыв к действию. (баннер и посадочная страница должны быть похожи).
Чек-лист для проверки посадочной страницы:
- логотип
- заголовок
- текст
- графика
- описание предложения
- списки
- основные характеристики
- основные преимущества
- демонстрация товара / услуги
- изображение товара
- скриншоты
- изображения образа жизни с вашим продуктом
- призыв к действию
- ссылки
- кнопки
- формы
- Убеждение / доверие
- отзывы
- примеры использования
- акредитация / сертификат / сторонней организации
- ссылки на дополнительную информацию
- элементы шаблона
Ещё несколько полезных ссылок от Айзенбергов:
- http://www.kissmetrics.com/ – система отслеживания поведения покупателей – персонализированные, а неагрегированные данные.
- http://graybit.com/main.php – инструмент, который позволяет оценить контрасты на сайте, убрав все цвета (сайт отображается в чёрно-белом варианте).
- http://getpremise.com/ – разные интересные инструменты для WordPress, которые помогают в оптимизации конверсий.
- http://btbuckets.com/ – бесплатный инструмент для персонализации и таргетинга на основании поведения посетителя на сайте.
- http://monetate.com/ – ряд полезных платных инструментов для оптимизации конверсии.
- http://feng-gui.com/ – очень интересный платный инструмент, который симулирует поведение посетителя в первые 5 секунд просмотра и строит отчёты о зонах, которые привлекают больше внимания
- http://www.marketmotive.com/conversion-training-certification-promotional-video.php – 21 секрет сайтов с самой высокой конверсией.
Wednesday, June 18, 2014
Десять маркетинговых метрик, которые каждый должен знать
Десять маркетинговых метрик, которые каждый должен знать
Ведение маркетингового учета и уверенное оперирование маркетинговыми метриками – это те умения, которыми сегодня должен владеть каждый предприниматель, собственник малого бизнеса или маркетолог.
Каждый бизнесмен занимается учетом. Каждый знает как провести инвентаризацию, рассчитать продажи и прибыль. Бухгалтерский учет рассматривается как инструмент внутренней мобилизации ресурсов, в то время как маркетинговый учет — это инструмент сообщения с внешней средой.
Огромные средства расходуются компаниями на маркетинг и коммуникации, а процент хозяйствующих субъектов, которые измеряют результативность этих программ шокирующе низкий. Исследование проведенное в 2012 г. Annenberg School for Communication & Journalism выявило, что в среднем на маркетинговый учет расходуется 4.5% от всего объема финансирования маркетингового бюджета.
При помощи маркетинговых метрик можно измерить успешность проведения любых маркетинговых кампаний: отношения с общественностью, отношения с медиями, спонсорство, выставки, репутацию, осведомленность о бренде и т.д.
Маркетинг переустремляется из традиционной рекламы и PR в социальные медии, так появился контент-маркетинг, цифровой брендинг, мобильный маркетинг, email-маркетинг, блогинг и т.д. Иллюзия корпоративного контроля над потоками информации перешла в плоскость обновления новостной ленты, твитов, постов в блогах, инфографики, подкастов и т.д. Теперь каждый деловой человек в независимости от рода занятий должен быть аналитиком, издателем, фотожурналистом и дизайнером.
В эру социализации веб перед бизнесменами встает необходимость строить взаимоотношения с брендом и управлять ими. Эта задача становится фундаментальной для обеспечения выживания и устойчивости бизнеса.
Хорошие отношения ведут к прибыли. Хорошие отношения позволят потенциальным покупателям стать постоянными и лояльными покупателями, блюстителями и сторонниками бренда. Благодаря хорошим отношениям, сотрудники остаются, учатся, растут и содействуют развитию фирмы. Плохие отношения выливаются в удорожание операций, уменьшение заработные платы, меньшую лояльность покупателей, высокую текучесть кадров, большие затраты на рекрутинг, оплату услуг юристов и т.д.
Поэтому теперь результативность маркетинговых кампаний недостаточно определять лишь такими маркетинговыми метриками как «объем рынка», «досягаемость» и «частота». Если предприниматель, собственник малого бизнеса или маркетолог не отслеживает и не измеряет миллионы отношений в которые вступают сотрудники организации с покупателями и общественностью и наоборот, существует большая вероятность потеряться в безбрежном океане данных, слов и действий.
Сложность ведения маркетингового учета обусловлена проблематичностью установления процедуры расчета маркетинговых метрик. Поэтому для постановки маркетингового учета приглашаются специалисты и работа обычно начинается с пилотного проекта, цель которого — окунуть коллектив в атмосферу маркетинговой аналитики. В практике существует около 50 классических метрик. Их можно классифицировать по различным критериям. Например, в разрезе того, что говорит ваша целевая аудитория, что она думает и делает.
ДЕСЯТЬ КЛАССИЧЕСКИХ МАРКЕТИНГОВЫХ МЕТРИК:
1. Объем рынка
2. Доля рынка
3. Осведомленность о бренде
4. Индекс развития бренда
5. Проникновение на рынок
6. Маржа
7. Процент первичных покупателей
8. Среднее количество покупок по каждому маркетинговому каналу
9. Прогноз продаж
10. ROI, ROMI
Рассмотрим некоторые классификации маркетинговых метрик.
ДЛЯ МОНИТОРИНГА КОНКРЕНЦИИ рассчитывают долю продаж фирмы на рынке, индекс развития бренда коэффициент продвжения продукции на рныке, степень продвижения бренда на рынке, степень осведомлености, желание купить, покупательские привычки и лояльность.
ДЛЯ РАСЧЕТА МАРЖИ И ПРИБЫЛИ принимаются во внимание такие маркетинговые метрики как маржа на единицу продукции, маржа по отдельно взятому маркетинговому каналу, постоянные и переменные расходы, финансирование маркетинговых программ.
МЕТРИКИ ПРОДОВОЛЬСТВЕННОГО МЕНЕДЖМЕНТА, используемые в маркетинге, включают в себя: пробу, объем повторных продаж, проникновение.
ПРИБЫЛЬНОСТЬ ПОКУПАТЕЛЯ при помощи следующих метрик: покупатели, новизна, коэффициент удержания, прибыльность покупателя, будущая ценность клиента (LCV).
В ЦЕЛЯХ ОПТИМИЗАЦИИ УПРАВЛЕНИЯ МАРКЕТИНГОВЫМИ КАНАЛАМИ идет учет нагрузки, прогноза продаж, эффективности работы менеджеров по продажам.
К метрикам по РАБОТЕ С НОВЫМИ КЛИЕНТАМИ относят: уровень осведомленности, драйверы принятия решения о покупке, количество новых клиентов, доля на рынке, ROMI, затраты на одного нового клиента.
Простота в обучении, легкость в использовании, степень удовлетворения по отношению к ожиданиям позволяют оценить СТЕПЕНЬ УДОВЛЕТВОРЕНИЯ ПРОДУКЦИЕЙ.
УДЕРЖАНИЕ КЛИЕНТОВ можно отследить рассчитывая процент удержания, процент потери покупателей и проводя RFM -анализ.
Если необходимо измерить РЕЗУЛЬТАТИВНОСТЬ УЧАСТИЯ В ВЫСТАВКАХ, СПОНСОРСТВА И ДРУГИХ МЕРОПРИЯТИЙ спонсорства берутся в расчет валовые продажи до и после мероприятия, изменение в продолжительности цикла продаж, изменение трафика к сайту или магазину, увеличение доли на рынке, увеличение проникновения на рынок, количество квалифицированных проспектов, коэффициент новых покупателей по сравнению с возвращающимися покупателями, коэффициент новых /уникальных посетителей сайта по сравнению с возвращающимися посетителями, увеличение взаимодействия с брендом, увеличение осведомленности, увеличение предпочтения, увеличения выставления бренда, наименования компании и ее продукции.
Действенными помощниками для Вас в введении маркетингового учета послужит следующий инструментарий: анализы СМИ, маркетинговое исследование, опросы мнений, веб-аналитика и поведенческие модели.
В условиях ужесточающейся конкуренции продвигаться по рынку вслепую становится очень рискованно. Успешное продвижение бизнеса не будет достигнуто, если на предприятии не ведется маркетинговый учет.
Ванильные метрики/метрики тщеславия
Monday, June 16, 2014
Sunday, June 15, 2014
Thursday, June 12, 2014
распределенная сеть MaidSafe
Tuesday, June 10, 2014
Виртуальный магазин? Всего 3 часа работы и 5 Kb кода.
Виртуальный магазин? Всего 3 часа работы и 5 Kb кода.
Что это?
Это так называемый виртуальный магазин, т.е. прайс лист некой организации с наименовнием товаров, часть из которых можно ПОМЕТИТЬ и занести в корзину, чтобы в дальнейшем можно было заполнить анкету (ФИО, адрес и т.д.) для покупки этих товаров. Все проще простого. Дизана нет никакого, только "скелет".Требования: где ЭТО будет работать?
На win/unix в PHP версии не ниже 4.0 с поддержкой сессий. Включенных cookies от поcетителей не требуется. Надо лишь правильно настроить некоторые опции PHP, чтобы программа получила доступ к сессиям (будет написано ниже).А почему размер файла 10Кб, а не 5Кб?
Если выкинуть все комментарии, вот и будет 5 кб :-) Программа (без комментариев) была написана за 3 часа в присутствии человека, изучающего ПХП. Комментарии, на самом деле были, но только устные :-)Подготовка сервера
1. Возможный глюк: у вас не настроен временный каталог на сервере для размещения временных файлов.2. Программа подразумевает, что PHP поместит в переменную $SID номер сесии. По умолчанию, возможно, этого не произойдет.
Для решения проблемы 1) и 2) пунктов надо изменить опции PHP. Это можно сделать в php.ini или файлах httpd.conf/.htaccess.
Вариант 1 - php.ini
- Если править php.ini, то в нем уже есть те переменные, что надо изменить
- ищем строку session.save_path и пишем путь к своему временному каталогу. В этот каталог Apache/PHP будут писать свои файлы, след. для них там должен быть доступ. Если у вас Unix, то пишем /tmp, если Windows, то \temp (не забудьте создать C:\TEMP или X:\TEMP, смотря где находится Апач)
- ищем строку session.name и заменяем на SID (большими буквами)
- Если вносить те же измения в указанные файлы, то надо написать так:
- вариант для unix: php_value session.save_path /tmp и для windows: php_value session.save_path \temp
- и имя сессии: php_value session.name SID
Настройка каталога
Текст программы
<? // символы "<?" должны быть первыми(!) в файле. Т.е. ни пустых строк, ни // пробелов до символов "<?" ставить нельзя, иначе не будет работать // header - появятся warning'и unset($t); session_start(); /* функция прибавляет в корзину новый товар, где $n - это номер строки в shop.txt. Далее, в сессиях сохраняется не номер строки, а число ID из shop.txt и используется повсеместно. Если товар уже существует, то корзина никак не меняется. */ function tadd($n) { global $t; // открыли файл $f=file("./shop.txt") or die("файл не найден"); // и получили нужную строку с товаром (в массив $o) $o=explode("\\",$f[$n]); $id=$o[0]; if (isset($t[all][$id])) return; // если товар уже в корзине - выход $t[all][$id]=$id; // флаг, благодаря которому, двумя строчками выше // мы определили, что товар уже есть в корзине $t[$id][name]=$o[1]; // наименование $t[$id][info]=$o[2]; // инфо $t[$id][cena]=$o[3]; // и д.р. не значащие данные $t[$id][kol]=1; // кол-во в начале равно "1 штуке" session_register("t"); // записали переменную в сессию } /* Рисует таблицу с товарами в корзине. Из файла shop.txt мы читаем только названия колонок и не более. Названия товара (в данном случае только название/цена/кол-во) берется из сессии. */ function korzina() { global $t,$PHP_SELF,$SID; $f=file("./shop.txt") or die("файл не найден"); $ogl=explode("\\",$f[0]); echo "<form action=$PHP_SELF method=POST>". "<input type=hidden name=SID value='$SID'>". // передаем сесиию "<input type=hidden name=c value=kolvo>". // рисуем заголовок таблицы с корзиной: "<table border=2><tR><td>$ogl[1]</td></td><td>$ogl[3]</td>". "<td>кол-во</td><td>команды</td></tr>"; // проходим массив $t[all] по списку его ключей $k=@array_keys($t[all]); for ($i=0; $i<count($k); $i++) { $id=$k[$i]; echo "<tr><td>{$t[$id][name]}</td>". "<td>{$t[$id][cena]}</td>". "<td><input size=4 type=text name=v[$id] value={$t[$id][kol]}></td>". "<td><a href=$PHP_SELF?c=del&id=$id&SID=$SID>удалить</a></td></tr>"; } // внизу таблицы две кнопки: // Измениения - сохранить изменение числа товаров и обновить страницу // Заказ - сорх. изм. + перейти на страницу оформления заказа echo "</table><input type=submit name=edit value='Внести изменения'> ". "<input type=submit name=zakaz value='Оформить заказ'></form>"; } /* Выводит на экран таблицу с товарами. В таблице автоматом генериться новая колонка с checkbox'асами, отметив которые и нажав "добавив", можно занести товары в корзину. */ function price() { global $t, $PHP_SELF,$SID; $f=file("./shop.txt") or die("файл не найден"); // читаем файл $ogl=explode("\\",$f[0]); // из него берем огравление $x=count($ogl); // вычисляем число колонок $y=count($f); // и число строк // форма (не забываем вписать $SID) + начало таблицы: echo "<form action=$PHP_SELF method=POST><input type=hidden name=c value=add>". "<input type=hidden name=SID value='$SID'><table border=2>"; // рисуем заголовок таблицы, названия колонок - первая строка файла shop.txt echo "<tr>"; for ($j=0; $j<$x; $j++) { if (strlen($ogl[$j])==0) echo "<tD> </td>"; else echo "<td>$ogl[$j]</td>"; } // рисуем последнюю колонку, где будут checkbox'ы echo "<td>x</td></tr>"; // основной цикл вывода прайса for ($i=1; $i<$y; $i++) { $a=explode("\\",$f[$i]); // читаем очередную строку файла if (count($a)<2) continue; // если она пустая (глюки), пропускаем echo "<tr>"; // цикл вывода всех колонок текущей строки таблицы for ($j=0; $j<$x; $j++) { // если ячейка пустая, там надо поместить " "; if (strlen($a[$j])==0) echo "<tD> </td>"; else echo "<td>$a[$j]</td>"; } // рисуем тот самый checkbox в последней колонке текущей строки echo "<td><input type=checkbox name=v[$i] value=$i></td></tr>"; } echo "</table><br><center><input type=submit value='Добавить ". "отмеченные товары в корзину'></center></form>"; } /* Выводит на экран несколько чисел (написано). Подсчет значений происходит при каджом вызове. */ function summa() { global $t; // традиционный проход массива товаров из корзины $k=@array_keys($t[all]); for ($i=0; $i<count($k); $i++) { $id=$k[$i]; // если убрать (double), то копейки округляться $summ+=(double)$t[$id][kol]*(double)$t[$id][cena]; $summ2+=$t[$id][kol]; } // просто выводим посчитанные цифры на экран echo "Корзина: наименований товаров - $i (в кол-ве $summ2 шт), цена - ".sprintf("%.2f руб.<br>",$summ); } /* Объявление переменной post, которая содержит поля для заполнения посетителем при оформление заказа. Т.к. этот список используется 2 раза, то описано это именно тут, а не ниже. */ $post=array( "название организации", "Ф.И.О. должностного лица", "должность", "ИНН организации", "местонахождение организации", "контактный телефон", "e-mail"); /*****************************************************************************/ // основной код программы // $c - основная переменная, указывающая на нужное действие if (!isset($c)) $c=''; switch($c) { case "": // без параметров - рисуем прайс-лист summa(); // статистика по корзине price(); // прайс // ссылка для перехода на корзину echo "<li><a href='$PHP_SELF?c=korzina&SID=$SID'>Корзина покупок</a>"; break; case "korzina": // вывод корзины summa(); // см. выше korzina(); // рисуем таблицу корзины // пишем 2 ссылки echo "<li><a href='$PHP_SELF?SID=$SID'>Каталог товаров</a>"; echo "<li><a href='$PHP_SELF?c=delete&SID=$SID'>Очистить корзину (осторожно!)</a>"; break; case "add": // добавление из формы прайса всех товаров // в массиве $v скоплены номера строк товаров, которые функция ... $k=@array_keys($v); for ($i=0; $i<count($k); $i++) { // ... tadd() преобразует из файла в данные и поместит в сессии tadd($v[$k[$i]]); } // надо перенаправить браузер на приличный адрес, чтобы: // 1) в URL был написан приличный адрес // 2) чтобы не было глюка, если посетитель нажмет ОБНОВИТЬ СТРАНИЦУ exit(header("Location: $PHP_SELF?c=korzina&SID=$SID")); // Ну, а то, что header засунуто в exit... Это просто фича такая :-) break; case "kolvo": // измение кол-ва товаров, когда а странице КОРЗИНА нажимают СОХРАНИТЬ // ИЗМЕНЕНИЯ или ОФОРМИТЬ ЗАКАЗ.. // Оцените, насколько короткий код преобразования корзины $k=@array_keys($v); for ($i=0; $i<count($k); $i++) { $t[$k[$i]][kol]=abs(intval($v[$k[$i]])); } // после изменения переенной сессии ее нужно записать session_register("t"); // Далее важная проверка. Если посетитель нажимает кнопку СОХРАНИТЬ, то // у нас устанавливается переменная $edit, которая содержит строку // "Сохранить изменения". Если он нажимает ЗАКАЗ, то устанавливается // $post. Устанавливается только одна из этих твух переменных. // если это было ИЗМЕНИТЬ, то переправить на корзину if (isset($edit)) exit(header("Location: $PHP_SELF?c=korzina&SID=$SID")); // иначе переправить на страницу с офрмлением заказа exit(header("Location: $PHP_SELF?c=zakaz&SID=$SID")); break; case "del": // удаление товара по его $id $id=intval($id); unset($t[$id]); unset($t[all][$id]); session_register("t"); exit(header("Location: $PHP_SELF?c=korzina&SID=$SID")); break; case "delete": // удаление всей корзины.. Как и в пред. пункте, только с проходом // массива id товаров $k=@array_keys($t[all]); for ($i=0; $i<count($k); $i++) { unset($t[$k[$i]]); unset($t[all][$k[$i]]); } session_register("t"); exit(header("Location: $PHP_SELF?c=korzina&SID=$SID")); case "zakaz": // форма для оформления заказа echo "<form action=$PHP_SELF method=post><input type=hidden name=c value=post>". "<input type=hidden name=SID value='$SID'>". "<table border=1>"; for ($i=0; $i<count($post); $i++) { echo "<tr><td>$post[$i]</td><td><input type=text size=40 name='v[$i]'></td></tr>"; } echo "</table><input type=submit value='Отправить заказ'></form>"; break; case "post": // генерим и отправляем анкету посетителя, где указаны данные посетителя // и список товаров из корзины $msg="Анкета посетителя:\n\n"; for ($i=0; $i<count($post); $i++) { $msg.="$post[$i]: ".substr($v[$i],0,500)."\n"; } $msg.="\nСписок покупок:\n\n"; $k=@array_keys($t[all]); for ($i=0; $i<count($k); $i++) { $id=$k[$i]; $msg.=($i+1).") {$t[$id][name]} \\ ".doubleval($t[$id][cena])." руб \\ {$t[$id][kol]} шт. \\ = ". sprintf("%.2f",$t[$id][cena]*$t[$id][kol])." руб\n"; } ?> <table width=100% height=95%><tr><td align=center> <h2>Ваш заказ отправлен!<br> Спасибо за покупку!</h2> <hr width=60%><br> <a href='/?<?=SID?>'>страница сервера</a><br><br> <a href='<? echo $PHP_SELF; ?>?<?=SID?>'>прайс-лист</a> </tD></tr></table> В переменной $msg хранится анкета посетителя, с которой можно сделать все, что угодно (послать мылом, записать в лог-файл, вывести на экран): <pre><? echo $msg; ?></prE> <? } ?>