В церкви смрад и полумрак, Дьяки курят ладан. Нет! И в церкви все не так, Все не так, как надо.
Путем несложных манипуляций достаем фактически отправляемые SQL запросы для обоих вариантов вызова метода getProducts(). Например, при настройках списка брать 8 товаров с самым низким рейтингом получаем
$collection->getProducts()
'SELECT p.* FROM shop_product p ORDER BY rating ASC LIMIT 8'
$collection->getProducts('id') 'SELECT p.id FROM shop_product p ORDER BY rating ASC LIMIT 8'
А теперь Павел, если попробуете выполнить это в консоли MySQL, то опять убедитесь, что причина на стороне базы.
По-прежнему неоднозначность результата вызвана одинаковыми значениями полей сортировки и неоднозначным поведением MySQL в таких ситуациях.
Для получения "стабильных" результатов при одинаковых значениях полей сортировки, необходимо последним в ORDER BY добавить гарантированно уникальный ключ, например id.
Изменение идеологическое и насколько оно необходимо в базовом коде приложения shop не готов спорить.
В плагине можно пользоваться наследником класса shopProductsCollection с измененным методом getOrderBy()
/**
* Static class to manage contact fields
*/
class waContactFields
Например там есть
/**
* Add a new field to custom_fields.php if its id is unique (throws waException otherwise)
* @throws waException
* @param waContactField $field
* @deprecated use ::updateField() instead
*/
public static function createField($field)
Динамические списки реализованы через ORDER BY и LIMIT. Когда в условиях появляется WHERE он лишь ограничивает выборку перед сортировкой. Вероятно тот список из 50 таки не содержит изначальные 8 ID. Проверил у себя и работает как и ожидалось.
Создаем два стандартных динамических списка "Хиты продаж". В первом ограничение 8 - best8, во втором 50 - best50. По ним делаем коллекции:
$collection = new shopProductsCollection('set/best8');
$filter = new shopProductsCollection('set/best50');
У многих производителей, как оказалось, один SKU поставляется с разными штрих-кодами. Сделал колонкой в таблице артикулов, а теперь все равно придется отдельно выносить.
За подготовку данных для отображения корзины отвечает класс shopFrontendCartAction.
Далее на примере темы default.
Шаблон отображения в файле cart.html
Отправка данных об изменениях в корзине через JavaScript - файл cart.js.
Обработку изменений в корзине на стороне сервера выполняют контроллеры shopFrontendCartAddController, shopFrontendCartSaveController, shopFrontendCartDeleteController.
В акции shopFrontendCartAction предусмотрен хук frontend_cart, который позволяет передать дополнительные данные в шаблон корзины.
Блок добавления товара в корзину на карточке товара и из списка товаров в стандартной теме выводится одним шаблоном product.cart.html.
Если Вам удалось сделать добавление через карточку, и Вы делали изменения в product.сart.html, то вероятно и добавление из списка должно заработать.
Я не писал, что надо ссылку на штатный logout менять на ccылку на главную страницу. Что мешает выполнить logout в своем action или controller? Я рассказал как можно направить пользователя в обход штатного logout на свой обработчик, который может делать все что угодно. Этот обработчик не заменят при обновлении.
Не претендую на изящество, но как вариант решения - отправлять пользователя на свою измененную акцию или контроллер logout.
В системном приложении webasyst появилось событие backend_header. С его помощью можно получить и поправить шапку бэкенда, в том числе и ссылку на logout.
Обработать событие возможно несколькими способами:
В нужном приложении добавить handler для события системного приложения webasyst и в нем поправить вывод шапки бэкенда.
Добавить плагин для системного приложения webasyst и в нем обрабатывать событие backend_header.
Без использования события backend_header можно в любом приложении или его плагине с помощью JS переопределять штатную ссылку на logout.
PHP
dumped from /var/www/webasyst/wa-apps/developer/lib/actions/developerBackendExec.action.php(25) : eval()'d code line #47:
Array
(
data => Array
(
year => '1970'
month => '1'
day => '1'
)
value => '1 января 1970'
)
'm'
Array
(
data => Array
(
year => '1970'
month => '1'
day => '1'
)
value => '1 января 1970'
)
'm'
Спасибо!
в ответ на Конфиг docker-compose для Webasyst Framework
В церкви смрад и полумрак,
Дьяки курят ладан. Нет!
И в церкви все не так,
Все не так, как надо.
Путем несложных манипуляций достаем фактически отправляемые SQL запросы для обоих вариантов вызова метода getProducts(). Например, при настройках списка брать 8 товаров с самым низким рейтингом получаем
А теперь Павел, если попробуете выполнить это в консоли MySQL, то опять убедитесь, что причина на стороне базы.
По-прежнему неоднозначность результата вызвана одинаковыми значениями полей сортировки и неоднозначным поведением MySQL в таких ситуациях.
Для получения "стабильных" результатов при одинаковых значениях полей сортировки, необходимо последним в ORDER BY добавить гарантированно уникальный ключ, например id.
Изменение идеологическое и насколько оно необходимо в базовом коде приложения shop не готов спорить.
В плагине можно пользоваться наследником класса shopProductsCollection с измененным методом getOrderBy()
в ответ на shopProductsCollection и динамические списки
Поясните более подробно какие именно URL работают не так как Вы ожидаете?
Что получается на выходе?
Что это такое?
Подозреваю, что там согласно представленному файлу маршрутов должно быть
в ответ на Routing в своем приложении
Вероятно дело в том, как MySQL выдает результаты при одинаковых значениях полей сортировки.
Простой тест демонстрирует, что не так как ожидает Павел.
Сначала берем два значения без условия:
Получаем:
Теперь добавим условие:
И получаем:
в ответ на shopProductsCollection и динамические списки
Попробуйте методы из
Например там есть
в ответ на Приложение Контакты. Создание дополнительных полей при установке плагина.
Про "с характеристиками размеров" не очень понятно.

Какой это тип?
Попробовал для текстового input, характеристика "Подошва" (sole):
в ответ на Как получить значения характеристик товара?
Динамические списки реализованы через ORDER BY и LIMIT.
Когда в условиях появляется WHERE он лишь ограничивает выборку перед сортировкой.
Вероятно тот список из 50 таки не содержит изначальные 8 ID.
Проверил у себя и работает как и ожидалось.
Создаем два стандартных динамических списка "Хиты продаж".
В первом ограничение 8 - best8, во втором 50 - best50.
По ним делаем коллекции:
Посмотрим исходный список:
Получаем id из второго списка, перемешиваем для чистоты эксперимента и добавляем условие в коллекцию:
Смотрим что на выходе:
Получили те же 8 id.
в ответ на shopProductsCollection и динамические списки
У многих производителей, как оказалось, один SKU поставляется с разными штрих-кодами. Сделал колонкой в таблице артикулов, а теперь все равно придется отдельно выносить.
в ответ на Сильно ли загрузит сайт характеристика типа select и много-много ее значений
Доброй ночи!
За подготовку данных для отображения корзины отвечает класс shopFrontendCartAction.
Далее на примере темы default.
Шаблон отображения в файле cart.html
Отправка данных об изменениях в корзине через JavaScript - файл cart.js.
Обработку изменений в корзине на стороне сервера выполняют контроллеры
shopFrontendCartAddController, shopFrontendCartSaveController, shopFrontendCartDeleteController.
В акции shopFrontendCartAction предусмотрен хук frontend_cart, который позволяет передать дополнительные данные в шаблон корзины.
Блок добавления товара в корзину на карточке товара и из списка товаров в стандартной теме выводится одним шаблоном product.cart.html.
Если Вам удалось сделать добавление через карточку, и Вы делали изменения в product.сart.html, то вероятно и добавление из списка должно заработать.
в ответ на Добавление товара в корзину согласно указанному минимальному количеству
Можно реализовать через выбор артикула по характеристикам.
У салата "Цезарь" будут артикулы "Цезарь-Понедельник", "Цезарь-Вторник" и т.д.
На карточке салата будет выбор дня недели как характеристики.
Выбранный день недели определит сохраняемый в корзину артикул.
Если при этом в категории выводить фильтр по дням недели, то выбор значения в фильтре автоматически применится при переходе в карточку.
Дерево категорий тогда не нужно бить по дням, а просто по типам блюд.
в ответ на Узнать, из какой категории выбран товар
Если я правильно понял, то не хватает данных из локали:
в ответ на $currency_info в cart.html
И все-таки, что выводит код из моего примера выше?
в ответ на помогите вывести contacts_view из контактов
А что с файлами дальше делать нужно? Может waFiles подойдет?
в ответ на Как получить экземпляр любого уже загруженного файла на подобии waImage::factory("image")
Уточните какие данные есть в таблице contacts_view
в ответ на помогите вывести contacts_view из контактов
Сергей, в яблочко!
Спасибо!
в ответ на Поддержка 4-х байтовых символов.
Попробуйте, думаю это то что Вы ищете:
в ответ на помогите вывести contacts_view из контактов
Этот плагин системного приложения, не приложения сайт. Уточните вопрос.
в ответ на общий хук в бэкенде в head?
В системном приложении webasyst появилось событие backend_header.
С его помощью можно получить и поправить шапку бэкенда.
В магазин или облако такой плагин не пройдет, но на локальной установке выручит и обновлениями не затрется.
/wa-system/webasyst/lib/plugins/headertest/lib/config/plugin.php
/wa-system/webasyst/lib/plugins/headertest/lib/webasystHeadertest.plugin.php
в ответ на общий хук в бэкенде в head?
Мне в свое время помогло {waLocale::loadByDomain('shop')}
в ответ на Подключение языковых файлов разных приложений
Придется сделать расширение для стандартной shopCategoryModel.
Существующий метод shopCategoryModel->getTree не предполагает вариантов изменения сортировки.
в ответ на Поменять порядок вывода категории
Например так:
в ответ на Полное название выбранного региона доставки
Чтобы не создавать экземпляр класса приложения, а только подгрузить его классы можно вызвать:
в ответ на Доступ к классам приложения shop
Я не писал, что надо ссылку на штатный logout менять на ccылку на главную страницу.
Что мешает выполнить logout в своем action или controller?
Я рассказал как можно направить пользователя в обход штатного logout на свой обработчик, который может делать все что угодно.
Этот обработчик не заменят при обновлении.
в ответ на Разлогиниться не на окно входа а на главную сайта?
Не претендую на изящество, но как вариант решения - отправлять пользователя на свою измененную акцию или контроллер logout.
В системном приложении webasyst появилось событие backend_header. С его помощью можно получить и поправить шапку бэкенда, в том числе и ссылку на logout.
Обработать событие возможно несколькими способами:
Без использования события backend_header можно в любом приложении или его плагине с помощью JS переопределять штатную ссылку на logout.
в ответ на Разлогиниться не на окно входа а на главную сайта?
В документации подробное описание с примерами :
В акции готовим html:
В шаблоне выводим:
в ответ на Как получить список CONTACTFIELD
Да, нашел.
Так ведь оно от настроек плагина зависит. Либо явно указанный обработчик для routing, либо включенный frontend:
И при этом ссылка на экземпляр никуда не сохраняется. Отрабатывает по event'у метод routing и экземпляр класса в корзину.
Отвечая автору топика, таки нет, не плодятся копии без надобности.
в ответ на Получение экземпляра плагина из его экшена
Сильно не искал, но не нашел, где создается экземпляр плагина при вызове экшена или контроллера.
Вижу, что создается только экземпляр класса экшена или контроллера.
Подскажите, что я пропустил?
в ответ на Получение экземпляра плагина из его экшена
Там есть еще хук products_collection.
Можно с его помощью "уложиться" в один запрос.
в ответ на shopProductsCollection — коллекции и запросы в базу
Посмотрите готовый класс waNestedSetModel.
Он решает задачи хранения древовидной структуры.
На его базе построены категории магазина, отзывы к товарам магазина, комментарии в приложениях блог, хаб и фото.
И немного теории...
в ответ на Дерево сообщений
Проверил в developer'e и Ваш формат и вариант из формы сохранения контакта.
Оба работают.
Данные в базе сохраняются.
Вывод:
в ответ на Непонятки с созданием контакта.