Gloobus
-
Публикаций
135 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Gloobus
-
-
Добрый день, я тут заметил, вроде бы недавно совсем, может Chrome обновился, но метки у заказов стали отображаться не корректно, и походу только в хроме и только в случае, когда кол-во заказов на странице большое и появляется вертикальный скролл.
Вот пример на официальном демо-сайте, если скролла нет, то все окей:
А если изменить размер окна, что бы появился скролл, то слева от каждой метки появляется черта, полоска в пиксель с цветом самой метки:
Безумно бесит, что только не пробовал, не могу победить.
Под рукой есть еще EDGE браузер, там все ок.
-
Я сделал немного по другому... в API в функции get_products переделал условие:
if(!empty($filter['in_stock'])) $in_stock_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock'])); else $order_stock = '(SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) DESC, ';
Ну и естественно в запросе добавил:
SELECT ... FROM ... WHERE ... ORDER BY $order_stock $order
Все, теперь сортировка работает только тогда, когда запрашиваешь ВСЕ товары, не обращая на то, есть ли они в наличии.
Если у товара есть вариант, возвращает 1, если нет, не возвращает ничего А сортировка идет в обратном порядке, то есть сначала те, что в наличии и потом отсутствующие!
-
По-моему, Ваш "как вариант" реально не даст никаких изменений. Ведь $_SESSION['device'] нигде не задается.
Жестоко затупил
if (!isset($_SESSION['device']) || empty($_SESSION['device'])) $_SESSION['device'] = ($this->mobiledetect->isMobile() ? ($this->mobiledetect->isTablet() ? 'tablet' : 'phone') : 'computer'); $this->design->assign('device', $_SESSION['device']);
-
Добавлять новый класс или менять существующий - разница не велика.
А вот если бы предложенный класс вызвать не всегда, а лишь при первом заходе, а при последующих брать данные браузера из сессии, то было бы более рационально и экономно. Все-таки класс весит 70К и включает немалые текстовые обработки...
Как вариант, замена шага 3:
if (isset($_SESSION['device'])) $deviceType = $_SESSION['device']; else $deviceType = ($this->mobiledetect->isMobile() ? ($this->mobiledetect->isTablet() ? 'tablet' : 'phone') : 'computer'); $this->design->assign('device', $deviceType);
Как выводить сообщение только для пользователей iOS?
Пример:
if ($this->mobiledetect->isiOS()) { echo "Вы пользователь Яблока!"; }
-
Ну так не проще обновить функцию чем инклудить еще один лишний класс? Или легких и правильных путей не ищем, а любим все усложнять?
Зачем изобретать велосипед, если уже есть готовый класс с необходимым функционалом? Чем плох вариант инклуда дополнительного класса?
-
В симпле есть функция определения устройства, смотрите api/Design.php.
Используемый мной класс более современен, имеет больше возможностей определения типа мобильного устройства (иос, андроид, и т.п.) что позволит подсунуть ссылку на магазин мобильных приложений. Так же версию браузера и другое.
она старая и ужасна, к тому же функция eregi deprecated в каком то php
Эта функция объявлена УСТАРЕВШЕЙ в PHP 5.3.0, и УДАЛЕНА PHP 7.0.0.
-
И так, если кому интересно, легкая доработка для определения в шаблоне витрины типа устройства, с которого заходит покупатель. Используя это, можно "гнуть" шаблон под определенный тип.
1. Добавляем в API новый класс, файл MobileDetect.php помещаем в папку /api
Скачать класс https://cloud.mail.ru/public/LDag/eUPi9nMx6
2. Открываем /api/Simpla.php и добавляем в массив $classes новый элемент 'mobiledetect' => 'MobileDetect':
private $classes = array( 'config' => 'Config', ... тут еще куча классов ... 'mobiledetect' => 'MobileDetect' );
3. В файл /view/View.php находим пару строк:
$this->design->assign('config', $this->config); $this->design->assign('settings', $this->settings);
и сразу ПОСЛЕ них добавляем:
// Определяем устройство с которого открывают сайт if (!isset($_SESSION['device']) || empty($_SESSION['device'])) $_SESSION['device'] = ($this->mobiledetect->isMobile() ? ($this->mobiledetect->isTablet() ? 'tablet' : 'phone') : 'computer'); $this->design->assign('device', $_SESSION['device']);
4. PROFIT!!!
Готово, теперь в шблоне можно юзать переменную {$device} которая будет возвращать следующие значения:
phone - мобильник
tablet - планшет
computer - компьютер
Пример использования:
{if $device == 'tablet'} <b>Вы зашли с планшета</b> {/if}
-
Разбивать платеж нельзя? Например на счету 1000 рублей, а заказ на 1350 руб.
Интересует возможность при таком случае, списать со счета 1000 в счет частичной оплаты заказа...
-
Karen,
скинь доступ к фтп и доступ в админку в ЛС, я посмотрю
-
А чем CSV не устраивает? Я считаю что заморачиваться с экселем стоит только тогда, когда ппц как необходимо сложное форматирование или стили документа с последующими правками. В остальных случаях достаточно csv, ну или pdf, а в некоторых случая и голый html пойдет
Делал как то как раз выгрузку в xls перечня заказов, которые "приняты" и при этом не оплачены.
Там что-то со складом постоянно не сходилось, вот просили сделать сверять. В экселевский файл экспорта попадает номер и дата заказа, сам товар и его кол-во в этом заказе.
В принципе в эксель можно выгрузить что угодно, была бы фантазия Я помню даже кому то делал формирование в экселе что-то типа бирок заказов для почты, печатаешь, вырезаешь и клеишь готовую на посылку, а там уже индекс, адрес и кому отправлять, сумма наложного платежа прописью.
В эксель даже можно выгружать данные и тут же по ним строить графики, смотреть статистику.
-
Ну не знаю, я делал под требования. Сказали так
Тут просто поделился, я думаю каждый сможет подправить под себя кто хоть немного js
Просто дилинькать надо было только тогда, когда между интервалом обновления число новых заказов растет, увеличивается.
-
Kors, это нужно для того, что бы показывать уведомление и тиликать звуком только тогда, когда кол-во их изменилось. Не более того.
И это как раз работает на при двух и более менеджерах!
Смотри, смысл простой:
1. В 0:01 пришел заказ, +1 на счетчике, все возможные уведомления, в count_time = 1
2. В 0:02 еще заказ, теперь их 2, 2 != count_time следовательно все возможные уведомления и теперь count_time = 2
3. Между 0:02 и 0:03 пришел еще 1 заказ и 1 заказ принял менеджер2, следовательно мы теперь получили что у нас 2 новых заказа, 2 = count_time, а мы уже менеджеру1 говорили что два новых заказа, зачем это делать опять? Следовательно count_time = 2 и нет уведомлений.
4. Менеджер2 принял еще один заказ, их кол-во изменилось, теперь новых заказов 1, а это не рано count_time и следовательно уведомления будут... ммм, пока сам пытался объяснить, понял что ты прав, наверно надо сделать if (data.count_time > count_time), то есть уведомления когда с очередным запросом вернулось больше, чем в прошлый раз.
Karen,
все просто, {if ....} {/if} это вставка шаблонизатора
в JS коде тоже присутствуют подобные скобки {}
что бы шаблонизатор не воспринимал некий JS код как свой, его нужно оборачивать в {literal}...{/literal}
если у тебя есть кусок:
<script> {if in_array('orders', $manager->permissions)} ... тут какой то JS-код {/if} <script>
то его правильно оформлять так:
<script> {if in_array('orders', $manager->permissions)} {literal} ... тут какой то JS-код {/literal} {/if} <script>
или так:
<script> {literal} ... тут какой то JS-код {/literal} {if in_array('orders', $manager->permissions)} {literal} ... тут какой то JS-код {/literal} {/if} {literal} ... тут какой то JS-код {/literal} <script>
Суть проста:
1. Перед началом JS-кода надо открыть {literal}
2. Перед началом синтаксиса шаблонизатора надо закрыть {/literal}
-
Конечно можно, правьте, кто же вам не дает?
-
В {literal}...{/literal} должен быть обернут JS-код
Внутри {literal}...{/literal} не должно быть кода шаблонизатора Smarty
У вас там с этим каша.
-
У кого не выходит, проверьте пункт 3!
Подключать JS скрипты нужно ПОСЛЕ подключения самого jQuery, т.к. они зависимы от него.
-
Был сделан механизм присвоения товаром меток, или как их чаще называют - тэги.
Смысл простой и очень похож на присвоение бренда, разве что меток можно присвоить неограниченное количество и собираются в каталоге они только по товаром родительской категории.
Тэг имеет свой URL следующего вида: http://domain/catalog/name/tag
Для каждого URL тэга можно создать страницу со своими метатегами и описанием.
Один и тот же тэг, например "для мамы" можно использовать в совершенно разных категориях товара (косметика, белье, кастрюли).
Дабы много не писать, предлагаю посмотреть видео.
Самому потыкаться можно тут: http://simpla.gloobus.ru
Цена: 30$ с установкой.
-
Это все ошибки ваших стилей, никакого отношения к консоли не имеют!
500 это очень мало, это запрос каждые полсекунды. Я говорил про 5000.
Могу посмотреть что у вас не так, если дадите доступ в админку к заказам.
-
Так, ну все вроде сделал по описанию, но вот что то не вижу оповещений я...
Для начала раскоментируйте строку с отладкой:
console.log('Cur time: '+time()+' - Start time: '+start_time+' - Data: '+data.count_new+' + '+data.count_time);
и смотрите в консоле браузера что происходит... так же на время отладки можн поставить интервал запросов почаще, например 5 секунд (5000).
-
Поправьте ссылку на скачивание архива, не качает.
Ссылку поправил, видать что-то задел когда редактировал пост
-
У меня была задача как то разрулить такую ситуацию:
1. Два менеджера, у обоих открыты браузеры с админкой.
3. Далее такие сценарии:
3.1. Пришел новый заказа оба получили уведомление. Менеджер-1 принял новый заказ, Менеджер-2 не шевелился, следовательно спустя интервал запроса у него пропадет счетчик и тултип, т.к. запрос вернет 0 новых
3.2. Менеджер-1 и -2 видят один новый заказ. Через какое то время приходит еще один новый, они оба видят тултип и уведомление, оба видят счетчик 2 новых, в тултипе видят +1 только что пришедший.
Менеджер-1 принял:
а) принял старый-новый 0_о заказ, Менеджер-2 видит счетчик 1 и в тултипе +1
б) принял новый-новый заказ, Менеджер-2 видит счетчик 1, тултип исчезнет
в) принял все заказы, новых нет, Менеджер-2 перестанет видеть и тултип и счетчик у него пропадет
Суть в том была, что бы не показывать уведомления о новых заказах, если их уже нет, если их приняли/удалили!
В планах переделать php-скрипт возвращающий ajax-у результат, там сейчас два запроса: сколько всего новых и сколько новых начиная от момента времени (момент времени передает скрипту js - это когда браузером загружена страница). Хочу сделать 1 запрос и получать просто перечень новых заказов, а уже средствами php считать их. Кроме того буду данные этих заказов, которые возможно будет пустить в дело!
Но пока так, на быструю руку под текущую необходимость
КСТАТИ! По хорошему, надо бы еще тот JS код из пункта 3.2 обернуть в:
{if in_array('orders', $manager->permissions)} /* JS код */ {/if}
Что бы он отображался тем пользователям, у кого нет доступа к заказам (у меня такого случая быть не может).
И не забываем про {literal}
-
Была необходимость реализации информирования в админке о поступлении нового заказа без перезагрузки страницы. Работает естественно с любой страницы в админке. Интервал запросов - 20 сек, можете ставить себе любой!
Помимо тултипа справа от счетчика новых заказов и всплывающего уведомления в правом верхнем углу, так же присутствует звуковое оповещение и динамическое изменение favicon (аля Gmail счетчик новых писем)
1. Качаем архив и все его содержимое кидаем в корень сайта
2. Открываем simpla/design/css/style.css и в самый конец добавляем стили:
.go_new_order { display:block; padding-top:5px } .tooltips { position: relative; } .tooltips label { margin: -23px 0 0 12px; position: absolute; width:170px; color: #FFFFFF; background: #000000; height: 30px; line-height: 30px; text-align: center; visibility: hidden; border-radius: 6px; } .tooltips label:after { content: ''; position: absolute; top: 50%; right: 100%; margin-top: -8px; width: 0; height: 0; border-right: 8px solid #000000; border-top: 8px solid transparent; border-bottom: 8px solid transparent; } #main_menu .tooltips label a{ text-decoration: underline; }
3. Открываем simpla/design/html/index.tpl и перед закрытием тэга </head> подключаем стили и скрипты:
{* Toastr *} <link href="//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css" rel="stylesheet" type="text/css" /> <script src="//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js" type="text/javascript"></script> {* Buzz *} <script src="../js/buzz.min.js"></script> <script src="../js/jsplayer.js?v=1"></script> {* Favicon Notify *} <script type="text/javascript" src="../js/jquery.faviconNotify.js"></script>
3.1. Чуть ниже, находим счетчик новых заказов, он должен выглядеть примерно так:
{if $new_orders_counter}<div class='counter'><span>{$new_orders_counter}</span></div>{/if}
и заменяем это на следующее:
<div class="counter tooltips" id="count_new_orders" style="{if !$new_orders_counter}display:none{/if}"> <span>{$new_orders_counter}</span> <label>+1 новый заказ</label> </div>
3.2. Внизу внутри <script> (можно сразу перед $(function() {...}) добавляем:
// Настройки тостера toastr.options.newestOnTop = true; toastr.options.closeButton = true; toastr.options.progressBar = false; toastr.options.extendedTimeOut = 10000; // Возвращает время в unixtime function time() { return parseInt(new Date().getTime()/1000) } // Примитивно склоняем текст function sayNewOrder(i) { if (i == 1) return 'новый заказ'; else if (i > 1 && i < 5 ) return 'новых заказа' else return 'новых заказов'; } // Глобальные переменные var start_time = time(), // стартовое время, его будем отправлять count_div = $("#count_new_orders"), // объект, где располагается счетчик заказов count_time = 0; // будем запоминать сколько заказов пришло // Функция получает кол-во новых заказов от отметки времени function getNewOrdersCount() { $.ajax({ type: 'POST', url: 'ajax/get_new_orders_count.php', data: {'utime': start_time}, success: function(data){ // Отладка // console.log('Cur time: '+time()+' - Start time: '+start_time+' - Data: '+data.count_new+' + '+data.count_time); // Если ничего не вернулось, прекращаем if (!data) return false; // Если вернулись новые заказы, показываем счетчик и пишем туда значение if (data.count_new > 0) { count_div.show().find("span").html(data.count_new); $.faviconNotify('design/images/favicon.ico', data.count_new, 'br'); } else { count_div.hide(); // ...иначе скрываем счетчик $.faviconNotify('design/images/favicon.ico'); } // Если есть новые заказы от момента времени if (data.count_time > 0) { // ...и их кол-во отличается от предыдущего значения, показываем тостер if (data.count_time != count_time) { toastr.info('<a href="index.php?module=OrdersAdmin&status=0" class="go_new_order">Перейти в Новые заказы? </a>', 'Еще '+data.count_time+' '+sayNewOrder(data.count_time)+'!'); $.jsPlayer.play("notice"); } // Формируем тултип и делаем его видимым count_div.find("label").html('+'+data.count_time+' '+sayNewOrder(data.count_time)+', <a href="index.php?module=OrdersAdmin&status=0">показать</a>!'); // ищем в счетчике метку тултипа и указываем ей текст count_div.find("label").css("visibility","visible"); // показываем метку тултипа } else { // Если нет новых заказов с момента времени, прячем толтип count_div.find("label").css("visibility","hidden"); } // Запоминаем текущее кол-во новых заказов с момента времени count_time = data.count_time; }, dataType: 'json' }); } $(document).ready(function(){ //Устанавливаем счетчик новых заказов в фавикон var fav_count = parseInt(count_div.find("span").html()); if (fav_count) $.faviconNotify('design/images/favicon.ico', fav_count, 'br'); // Как только документ загружен, начинаем по таймеру запрашивать информацию о новых заказах setInterval('getNewOrdersCount()',20000); });
-
Стала очень интересной данная тема и решил наваять квантователь изображений на PHP
За основу был взят класс указанный мной выше.
И так, что умеем:
1. Умеем работать только из консоли (CLI)
2. Умеем работать со списком API ключей, берем из файла и перебираем. Если один ключ закончился, берем следующий. Если все закончились - прекращаем работу!
3. Умеем формировать лог в CSV для дальнейшего удобного анализа в Excel
Как пользоваться?
1. Качаем архив https://cloud.mail.ru/public/DUwb/RWu3fywXZ
2. Распаковываем содержимое в корень Симплы
3. В файле keys.txt суем свои API ключи (каждый ключ новой строкой)
4. Даем права на выполнение: chmod +x tinify.php
5. При необходимости правим в файле tinify.php первой строкой путь к PHP:
#!/usr/bin/php
6. Запускаем: ./tinify.php <path>
Где <path> это путь к каталогу, относительно расположения скрипта, в котором необходимо обработать изображения.
Например, если вы поместили папку со скриптом в корень симплы и необходимо обработать каталог products с изображениями товаров, то запускаем так: ./tinify.php ../files/products
7. Запуск: ./tinify.php -h выведет хелп
Принцип работы с ключами
Скрипт читает keys.txt и берет от туда ключи. При запуске берет первый ключ, пробуем им работать, если все ок, переходит к следующему найденному изображению в каталоге. Если обработка изображения не прошла, меняет ключ на следующий и пробует опять этот же файл с изображением. Если не один из приведенных ключей более не может работать, работа скрипта завершается с уведомлением в консоле.
Принцип работы оптимизатора
Скрипт ищет в каталоге, который был указан ему при запуске, все файлы изображений jpg, jpeg, png. Скрипт проверяет наличие в этом каталоге подкаталога .tinypng и если такого нет - создает. Для каждого найденного файла с изображением скрипт ищет файл с аналогичным именем + окончанием .tiny в подкаталоге .tinypng. Если такой файл найден, скрипт читает его содержимое. В нем хранится размер изображение (число в байтах). Если такого файла в подкаталоге .tinypng нет, или размер изображения в нем меньше фактического файла с изображением, то происходит сжатие файла. Новый сжатый файл заменяется старым, так же в подкаталоге .tinypng создается (или перезаписывается) файл с аналогичным названием + окончание .tiny где указывается новый размер сжатого файла.
Тем самым, с каждым запуском скрипта обработке поддаются только те файлы, которые ранее не сжимались.
По окончании работы скрипта создается подробный лог файл в CSV для удобного анализа в Excel
Скорость работы скрипта на моем тестовом хосте ~50 изображений в минуту.
-
Странно, у меня работает!
Он не убирает переноса строк, но убирает пустые строки и лишнюю табуляцию.
-
Прописал, все сделал как надо - у меня без изменений
Посмотрите у себя в Smarty/libs/plugins есть ли файл outputfilter.trimwhitespace.php?
Если нет, прикрепил. Попробуйте его подсунуть, но я не знаю зависимость от версий шаблонизатора
Косяк при отображении меток у заказов (Chrome)
в Общие вопросы по функционалу и дизайну
Опубликовано
Спасибо, это работает! Только остается еще косяк на оплаченных (зеленых) заказах, но это уже из-за самой картинки бэграунда, её надо подправить!