Список статей блога WebAsyst ShopScript
Список статей блога, честно говоря, в webasyst сделан довольно бестолково. Лично мне больше нравится, как сделано в WordPress — с возможностью убирать часть поста»под кат», т.е. в основном списке публиковать только часть статьи и ссылку «читать дальше» для тех, кто заинтересовался.
Вообще есть один или несколько плагинов, продаваемых умельцами, которые позволяют делать такую ленту с анонсами и даже прикреплять картинку к анонсу. Этот вариант я запомнил и решил, что если быстро ничего не придумаю, то куплю.
Сначала решил, что самое простым решением будет оборачивать часть статьи в DIV и в CSS прописать ему свойство ‘display:none;’. Грубо, но должно получиться. Единственное, что меня остановило — статьи пишу не я, а объяснять как «оборачивать в DIV» мне очень не хочется. И еще контролировать, чтоб вложенность тэгов соблюдалась.
Тогда я обратил внимание, что при написании постов никто не пользуется тэгом HR (горизонтальная линия) и решил, что это будет отличный разделитель. Кнопка для вставки этого тэга есть в стандартном визуальном редакторе, так что проблем у авторов статей возникнуть не должно. Читать полностью »
Рубрики: Shop-Script · Теги: WASS
Скидки в скриптах интернет-магазина
Готовлюсь сравнивать несколько скриптов интернет-магазинов и CMS, у которых есть соответствующие модули. Пока просто записываю мысли о том, на что обратить внимание. В итоге попробую свести это либо в какую-то таблицу, либо еще как-то систематизировать. Если в процессе я что-то упустил, то не надо стесняться написать в комментариях.
Часто возможность раздачи скидок выпадает из факторов, которые рассматриваются при выборе платформы. И зря. Трудно себе представить, какие фантазии могут придти в голову владельцам, маркетологам или рекламщикам магазина. Поэтому при выборе скриптов для интернет-магазина этот параметр никак нельзя упускать из виду. Во многих случаях я натыкался на жестко фиксированный набор различных скидочных программ, который причинял изрядные неудобства уже спустя несколько месяцев после запуска сайта. Зачем далеко ходить? Например, после установки модулей приема платежей с кредитных карт владельцу пришло в голову дать скидку за платежи наличными — те самые 3-4%, которые забирает себе эквайрер. А автор скрипта этого не предусмотрел. В таких случаях часто требуется вмешательство в основной код скрипта, что, конечно, расстраивает. И не просто расстраивает! Многие скрипты сейчас имеют возможность автоматического обновления, при котором либо все внесенные изменения, конечно, теряются, либо просто блокируют саму возможность обновления.
Модульность этого компонента скрипта интернет-магазина даст возможность комбинировать и видоизменять, гибко настраивать скидочную систему. Это очень важная составляющая, от которой, во многом, зависит успешность проекта. Читать полностью »
Рубрики: Интернет-магазины · Теги: интернет-магазин, разработка
Консольная очередь
У приложения есть несколько задач, которые, по идее, должны выполняться в консоли и пользователь не должен ждать окончания их выполнения. Или они должны стартовать по cron’у. Т.е. те, что инициировал пользователь, должны начать выполняться немедленно — загружен прайслист, нажата кнопка «обновить рейтинг». Также есть задания, выполняемые по расписанию: генерация sitemap, рассылка новостей почтой и т.д. Нашел три приемлемых решения, никак не могу выбрать. Читать полностью »
Рубрики: Без рубрики · Теги: CakePHP, queue, shell
Особенности межплагинного взаимодействия
Конечно, вызывать методы классов плагина из другого плагина не очень хорошо. Но, тем не менее. Чтобы впоследствии не было мучительно больно, при объявлении связей между моделями, надо всегда указывать свойство className, причем полностью, т.е. ‘Plugin.MyModel’. Иначе возможны весьма забавные эффекты. Справедливо для версий 1.2 и 1.3. Дальше немного кода.
Рубрики: CakePHP · Теги: CakePHP, Models, Plugins, Модели, Модель
Проверка логина в Shop-Script
На форуме WebAsyst’а увидел пост про проверку логина, введенного при регистрации. Как обычно впал в ступор от изящного решения. Весь рассматриваемый код находится в файле core_functions/registration_functions.php. Достал напильник и немного подточил.
Во первых есть функция _testStrInvalidSymbol($str). Проверяет строку на наличие неправильных символов. Неправильные символы, с точки зрения авторов скрипта: одинарные и двойные кавычки, знаки больше и меньше, а также обратный слэш — всего пять. Угадайте с одного раза сколько раз в теле функции проверяется условие if. :) Если в строке найден «неправильный» символ, то функция возвращает FALSE, если все в порядке — TRUE.
Почтовые адреса
Рассматривая кучу платных и бесплатных скриптов для создания интернет-магазинов, обратил внимание на то, что у большинства процесс оформления заказа далек от идеала. Это очень важный этап, который должен быть очень простым для покупателя, с минимумом заполняемых полей.
Сейчас хочу остановиться конкретно на блоке данных с почтовым адресом. Обычно это адрес доставки, но также это может быть адресом плательщика и отличаться от адреса доставки. Платит один человек, получает другой или как-то так. Не важно.
Здесь также пользователь должен с минимумом усилий указать максимум полезной информации. Во всех скриптах обычно заполняются такие поля:
- Почтовый индекс
- Страна
- Регион, штат или другая территориальная единица (если есть)
- Город
- улица, дом, квартира и т.д.
Для крупных городов, например, для Москвы или Санкт-Петербурга можно дополнительно спросить ближайшую станцию метро. В Webasyst Shop-Script это реализуется дополнительным полем.
Применительно к России возникает вопрос к 3-му пункту, у нас весьма пестрое административное деление. Самое простое — воспользоваться списком кодов субъектов РФ из Википедии. Но тут надо иметь в виду, что некоторые субъекты могут входить в состав других — автономные округа могут входить в состав краев и областей. Большинство реализаций скриптов этого не предусматривают, а зря. Деление на регионы должно быть не плоским списком а древовидным!. Стоп, не надо бежать срочно добавлять поле «parent_id» в существующую базу. Надо сначала погуглить на тему nested sets и проникнуться.
При этом регион «Москва» не идентичен городу Москва. При заполнении списка регионов об этом тоже надо помнить, Зеленоград также входит в состав Москвы, а доставка туда, как правило, отличается ценой.
Также имеет смысл хранить список наиболее крупных населенных пунктов каждого региона, чтобы пользователь мог выбрать город из списка или написать, если в списке нет нужного населенного пункта. Минимум опечаток — максимум точности при определении стоимости доставки.
Update. Раз уж речь зашла о древовидном хранении, то список страны-регионы_(области, края и т.д.) можно хранить в единой таблице. В ней корневыми элементами или элементами первого уровня (корень тогда будет «World» :) ) будут страны. Для классификации можно воспользоваться стандартом ISO 3166 и его подразделами относительно административных единиц.
Рубрики: Интернет-магазины, Проектирование · Теги: Shop-Script, идея, интернет-магазин, интернет-торговля, мысль, разработка
Множественные уязвимости Shop-Script
По привычке, время от времени, просматриваю сообщения об уязвимости скрипта Shop-Script. Компания Артикус, автор этого скрипта, уже давно перестала его поддерживать и продает теперь новую версию, более навороченную и красивую. Тем не менее этот скрипт разошелся по сети в миллионах копий, как легальных, так и нелегальных. А также породил великое множество продолжений и улучшений. Поэтому обнаруженный мною отчет, несмотря на то, что ему уже 2 месяца, будет интересен многим.
В отчете рассматривался Shop-Script Free — это как раз бесплатная версия того, что ходит по интернету огромным тиражом. На Free версии основана наиболее цельная и популярная доработка под названием «Shop-Script Free Lego Edition».
Вывод неутешительный. На 14 апреля в скрипте имелось 27 уязвимостей, позволяющих атакующему получить доступ к базе данных, манипулировать данными и скомпрометировать систему.
В частности ошибки, позволяющие выполнять команды SQL, в обработке параметров, передаваемых в скрипт: (1) add2cart, (2) c_id, (3) categoryID, (4) list_price, (5) name, (6) new_offer, (7) price, (8) product_code, (9) productID, (10) rating, and (11) save_product. Пруфлинк.
Рубрики: Shop-Script · Теги: Shop-Script, безопасность, уязвимость
Тот же контент, только в профиль
Давно думал над проблемой одинаковых страниц. Ну, почти одинаковых — где один и тот же контент по-разному представлен. Обычно это индексные страницы, типа прайслистов, списков статей, постов или чего-то такого. На большинстве таких страниц есть возможность получить список, скажем, отсортированный по каком-либо критерию — цене, дате публикации и т.д. Таким образом на сайте получаются фактически одинаковые страницы, с одним и те-же или похожим содержанием, но разными URL. Например с сортировкой по-умолчанию, по цене и по названию:
http://www.example.com/products/prices http://www.example.com/products/prices/index/order:price http://www.example.com/products/prices/index/order:title
Мне кажется, что поисковому роботу такое может и не понравится, уж больно это смахивает на попытку заспамить поисковик. Я раздумывал о том, что,наверное, такие страницы, в URL которых указаны подобные параметры неплохо бы, наверное, закрывать от индексирования. Обычными директивами meta в заголовке страницы. Читать полностью »
Рубрики: Поисковики · Теги: canonical, Google, HTML, link
Список всех-всех контроллеров
Понадобилось мне получить список всех контроллеров приложения, включая контроллеры плагинов. Configure::listObjects, увы, такого не умеет. Этот метод выдает только все контроллеры приложения, но без контроллеров плагинов. Пришлось немного адаптировать метод, предложенный Rob Weaver в гуглогруппе CakePHP. На выходе у моего метода получается объединенный список контроллеров. Основные — как отдает метод listObjects, а принадлежащие плагинам в виде «Plugin.Controller». Можно их поочередно скармливать сразу в App::import. Разве что выбрость те, названия которых на «App» заканчивается, если они не нужны. Будете загружать, помните, что класс «Controller» уже должен быть загружен.
Попробуем почитать между строк
Очередное интервью с представителями Яндекса, на этот раз на Roem.Ru. Никаких особенных откровений, конечно, нет. Что же вы хотели, чтоб яндексоиды всем бесплатно раздали рекомендации, как выбраться на первое место в выдаче по любому запросу? Но все-таки что-то надо говорить и из обтекаемых формулировок можно выстраивать разные забавные предположения. Лично я не завсегдатай SEO-форумов, возможно, все это уже где-то обсуждалось — если баян, извините. Читать полностью »
Рубрики: Поисковики · Теги: yandex

