Сегодня очень объемное и очень важное обновление. Всем разработчикам, которые работают с ShopModxBox, советую очень внимательно все прочитать и до конца, так как это обновление во многом определяет дальнейшее развитие данного продукта и не без преувеличения скажу, что затрагивает всех участников этого рынка.
1. modxSmarty-1.0.0
В прошлой статье, посвященной слиянию сайтов modxclub.ru и shopmodx.ru, я писал, что во многом красивому объединению этих двух сайтов способствовала новая, пока еще не опубликованная версия modxSmarty с последней версией библиотеки Smarty на борту. Так вот, новая версия опубликована. Теперь есть системная настройка modxSmarty.pre_template. По умолчанию она пустая. Если указать, то будет использоваться дополнительная директория-скин, в которой можно переопределить отдельные файлы-шаблоны основного скина сайта. В приведенной выше статье все подробно расписано.
2. modxSite-1.3.0
Здесь нет крупных изменений, но все-таки важные моменты есть.
1. Добавлено MODX-логирование SQL-ошибок. При чем здесь есть момент: При выполнении метода $modx->getCount() в случае SQL-ошибки, MODX никак об этом не сообщает. Он просто возвращает ноль и все. А ведь может быть просто ноль записей, а может быть конкретно ошибка, что совсем не одно и то же. Сейчас getdata-процессор залогирует сообщение об ошибке.
2. Немного изменен порядок вызова методов в самом основном процессоре. Это никак не должно привести к ошибкам расширяющих процессоров (то есть можно обновляться, но не забывая про бэкапы), но зато устраняет важный минус прошлой версии — невозможность указать сортировку для добавляемых колонок. К примеру, раньше такое не проканало бы:
function initialize(){ $this->setProperty("sort", "title"); return parent::initialize(); } function prepareQueryAfterCount(xPDOQuery $c){ $c = parent::prepareCountAfterQuery($c); $c->select(array( "pagetitle as title", )); return $c; }
Раньше бы запрос вернул ошибку, что колонки title не существует. Сейчас все отработается ОК.
3. ShopModxBox-2.5.0
Ну и самое главное — это конечно же сама сборка магазина ShopModxBox.
Основные изменения.
Во-первых, (что само собой понятно), сборка включает в себя новые пакеты, и конечно же новые возможности, которые они дают.
Во-вторых, с этого момента меняется наш формат работы с той сборкой и ее дальнейшее развитие. Раньше было как? — ставьте сборку, делайте копию дефолтового скина сайта и далее творите что хотите. То есть дефолтовый скин сборки — это типа как для примера, а нормальный конечный продукт (конечный магазин) — это уже на совести конечного разработчика. Типа программное API на процессорах имеется, а оформление сайта уже сами фигачте с нуля. Это на самом деле конечно же не круто. Во-первых, слишком во многом надо разбираться. Во-вторых, нет у нас сейчас кучи готовых разнообразных шаблонов на выбор, как, к примеру, для Magento, Bitrix и т.п. И вот как раз это мы и решили изменить. Теперь у нас так: есть дефолтовые Smarty-шаблон и Public-шаблон. Вот теперь их трогать вообще не надо, только если вы не шлете пуллреквесты (о чем мы поговорим ниже). Теперь, если вы хотите изменить шаблоны сайта, вы просто создаете папку своих Smarty-шаблонов в корневой папке шаблонов, например site, и прописываете название этого шаблона site в настройку modxSmarty.pre_template (сейчас там прописано skins/default/, это скин для примера. В его шаблонах прописано как расширять основные шаблоны). В целом, даже если у вас там не будет ни одного файла (даже и папки самой не будет), Смарти-ошибок никаких не будет (если Смарти найдет файлы шаблонов в основном скине), но если вам что-то нужно будет изменить, вам не надо будет копировать весь скин и в дальнейшем развивать его только самостоятельно. Теперь основной скин будет как бы набор всего самого необходимого, и в дальнейшем, если чего-то не будет хватать, а спрос будет большой, мы будем добавлять это в основной скин, и обновив этот основной скин, можно будет получить эти новые плюшки автоматом, не выискивая чтобы такое изменить в своей копии всего скина. Покажу это на простом примере. Вот теперь есть папка common. В ней будут лежать различные универсальные и часто используемые вкусности, например шаблон для получения и вывода списков, или шаблон для формирования постраничности (да, мы отказались от сниппета getPage по ряду причин, главные из которых низкая производительность и отсутствие Смарти-шаблонизации). Эти шаблоны в целом работают в паре (если нужна постраничность), но могут использоваться и по отдельности, но главное — это возможность расширения. Посмотрите как это делают шаблоны вывода товаров и новостей. Просто расширяете лист-шаблон, добавляете/меняете параметры запроса, вызываемый процессор (если надо), шаблон для вывода и все. Механизм централизованный, и в дальнейшем будет развиваться/улучшаться. В таком ключе, если вы в своем скине расширяете базовый лист-шаблон, накатив обновления на основной скин сайта, если этот шаблон получит новые плюшки, то эти плюшки сразу достанутся и вашему расширяющему скину.
Прочие изменения и приятные вкусности.
Smarty-шаблон на замену getPage. Как я и писал выше, основная причина — производительность. По моим наблюдениям, на сайте, который открывается за 0.4-0.5 сек, getPage может съесть 0.1+ сек. Да, он вполне прожорлив. Вторая причина — его излишняя глобальность. Мне не хочется следить за тем, чтобы указывать имя get-переменной вместо page, только для того, чтобы если на странице несколько блоков с постраничностью, чтобы они не мешали друг другу, ведь getPage берет значение страницы из глобального $_GET. А еще он результат фигачит в глобальный плейсхолдер [[+page.nav]], за чем так же не хочется следить. Теперь в смарти-пагинатор передается массив-ответ $result от процессора, и постраничность формируется конкретно от его значений limit, total и т.п. Теперь все необходимые для постраничности данные возвращает сам процессор.
Login используется меньше. Login, как и getPage, тоже кушает не мало. При чем мне на самом деле всегда не нравилась путаница с авторизациями в разных контекстах. К примеру, у пользователя есть метод isAuthenticated($sessionContext= 'web'), то есть он проверяет а действительно ли пользователь авторизован в этом контексте. При этом сам MODX, получая при инициализации текущего пользователя, не найдя его в текущем контексте, проверяет, а не авторизован ли он в админке, и если авторизован, то инициализирует его. И получается, что если пользователь в админке авторизовался, но не авторизовался во фронте, то пользователь как бы есть, и как бы его нет, потому что Login проверяет его только в текущем контексте. Все это наблюдали на большинстве своих сайтов, где используется авторизация через Login. Вот теперь этот вопрос решается. Конечно, на каких-нибудь мегасложных сайтах с кучей контекстов и жестким распределением прав может и надо то, как работает Login, но это крайнее исключение, так что в нашей сборке я его заменил. Но оговорюсь, что на страницах регистрации, обновления профиля и смены пароля все еще используется Login, и при попытке зайти на них без авторизации во фронте вы получите отказ, но это уже совсем мелочи, так как тем, кто авторизован в админке, вряд ли сильно нужны эти страницы.
Большая производительность. Благодаря этим двум вышеописанным моментами, производительность сайта еще поднялась. К примеру, я у себя на тестовом сайте сейчас не редко могу видеть такие цифры:
Memory: 9.0521 Mb TotalTime: 0.1242 s
Для сравнения, раньше обычно меньше 0.25 не снижалось. Не забываем на боевом сайте в шаблонах переключать настройку phptemplates.non-cached в false.
Обновлен Bootstrap до последней версии 3.3.1. Перешли мы со старой версии 2. Верстка подправлена, но есть еще места, где помощь не помешает, к примеру страницы контактов, форма оформления заказа и т.п., так что кто силен в бутстрапе, шлите пуллреквесты, вам воздастся.
Поправлена форма авторизации. Теперь авторизация аджаксовая, так что не получается как раньше, что нажал Авторизоваться, страница обновилась, а ты не видишь Ок или что, только если опять нажимаешь на Логин.
Автоматическое присвоение корзины при авторизации. Есть проблемный сценарий: анонимный пользователь накидал товаров в корзину (корзина сейчас ни к кому не привязана), затем он авторизовался (и по прежнему видит корзину и может в нее добавлять товары, но эта корзина все так же никому не принадлежит), затем юзер разлогинился, сессия умерла и корзина осталась анонимной и безхозяйной. Сейчас, при авторизации, если есть корзина в сессии, и у текущего пользователя нет своей собственной неоформленной корзины, то эта корзина присваивается ему (отвечает сейчас за это процессор Site).

Приглашаем к разработке дополнительных скинов сторонних разработчиков.

А теперь самое сладенькое :) Все это не только улучшает нашу сборку как самостоятельный продукт, но и дает возможность подключиться к нему сторонним разработчикам не только как создателям конечных интернет-проектов для своих клиентов, но и как соавторам. Я имею ввиду создание дополнительных скинов сборки. Как я и говорил выше, для скинов есть свои папки раз и два. Что надо делать? 1. Создаете свои папки скинов (сейчас там пока только default для примера). Не забываем изменить название скина в настройке modxSmarty.pre_template 2. В своем layout.tpl переопределяете блок стилей, например так:
{block name=styles} <link href="{$pre_template_url}css/style.css" rel="stylesheet" type="text/css" /> {/block}
Переменная $pre_template_url будет содержать путь до вашей публичной части скина, например assets/components/modxsite/templates/skins/test/
Все, кастомные стили основного скина будут заменены вашими. Теперь вы можете менять внешнее оформление сайта как угодно. Повторюсь, что в дальнейшем основной шаблон сайта будет развиваться централизованно, а скины будут только стилевые изменения нести, не затрагивая общую логику. Если у кого-то будут предложения по дополнению логики в основном шаблоне, так же присылайте свои пуллреквесты. Вклад каждого будет освещен, что по сути является вашей рекламой :) Сам я очень скоро планирую в основной шаблон добавить аджаксовый каталог и аджаксовую миникорзину, примерно, как я сделал это здесь.
Все достойные скины будут включены в сборку, и будут содержать информацию о разработчике и прямую ссылку на его аккаунт на сайте Клуба и его сайт. На самой сборке будет добавлен переключатель скинов сайта, чтобы потенциальный заказчик мог выбрать понравившийся. Все скины будут представлены в отдельном каталоге сборки так, чтобы ссылки на разработчика индексировались, так что это будет давать дополнительную ссылочную массу на ваш сайт. Наиболее интересный скин будет использоваться в качестве основного, и даст наибольшее кол-во полезных ссылок автору, а так же обеспечит кучу плюсов в карму :)
Традиционно, готов выслушать ваше мнение и предложения.
UPD: Для тех, кто не добрался до шаблона, где прописан JivoSite и не знает как это сделать. Вот этот кусочек шаблона. Но его не надо удалять/редактировать. Есть системная настройка jivosite.widget_id. Если удалить значение, модуль выводиться не будет. Если вы регистрируете свой аккаунт в JivoSite, найдите свой id-шник в выдаваемом JS-коде и просто скопируйте и вставьте оттуда id в системную настройку, будет выводиться ваш модуль.
Как я и сказал: каждый может себе выбрать то, что ему больше нравится. Но если бы преимущества были бы такими очевидными, то лидером рейтингов все-таки был сайтхарт, а не живосайт. А так, как сейчас наоборот, то мы выбрали живосайт :)
насколько я знаю он уступает лишь немного, и то, потому что бесплатный(был бы платный было бы плюх у них больше), практически полностью, если не пользоваться ботами…
я не агитатор сайтхарта, просто немного удивил меня выбор
Аа, там JSON-синтаксис. Это в новой версии было. У меня php5.4, поэтому все работало. 5 дней назад я это пофиксил. Можете обновить с гитхаба или подождать, сегодня будет новая сборка с этим фиксом.
Хостинг jino
Вот лог [Fri Jan 16 14:57:18 2015] [error] [client 109.191.152.14] PHP Parse error: syntax error, unexpected '[' in /home/users1/i/mysite/domains/o.pro.ru/core/components/billing/processors/mgr/orders/products/create.class.php on line 83, referer: o.pro.ru/
Там такой код: // Получаем данные товара с учетом курсов валют if( $response = $this->modx->runProcessor('web/catalog/products/getdata', array( «where» => [ «id» => $product->get('resource_id'), ], «current» => 1, «showhidden» => 1, «showunpublished» => 1, ), array( 'processors_path' => MODX_CORE_PATH. 'components/modxsite/processors/', )) AND !$response->isError() AND $object = $response->getObject() ){ $data = array( 'price' => $object['sm_price'], 'currency_id' => $object['sm_currency'], ); } $this->modx->error->reset(); $this->object->fromArray($data); return true; }
Добрый день! Если все установилось нормально, то никаких ошибок не должно возникать ни при добавлении, ни при работе в целом (если с хостингом все ОК). Попробуйте развернуть сайт из зип-архива: shopmodx.modxclub.ru/download/ Просто скорее всего у вас какая-нибудь нужная таблица не установилась и все. Можете для начала попробовать не весь архив сайта накатывать, а просто удалить базу данных и накатить ее из дампа (в корне архива лежит dump.sql).
Добрый день! Подскажите, решилась ли как то проблема с ошибкой добавления в корзину и прочими подобными? «Ошибка выполнения запроса» Чтоб без дополнительных «ковыряний»
Спрашиваю по тому как установил.
И наткнулся на эту проблему. Комментарии читал но решения так и не нашел.
Сможете помочь?