Перейти к содержанию
Официальный форум поддержки Simpla

Gloobus

Фрилансер
  • Публикаций

    135
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Gloobus

  1.  

    #list span.order_label {
    
     background-repeat: no-repeat;
    
    }
     

     

    Спасибо, это работает! Только остается еще косяк на оплаченных (зеленых) заказах, но это уже из-за самой картинки бэграунда, её надо подправить!

  2. Добрый день, я тут заметил, вроде бы недавно совсем, может Chrome обновился, но метки у заказов стали отображаться не корректно, и походу только в хроме и только в случае, когда кол-во заказов на странице большое и появляется вертикальный скролл.

     

    Вот пример на официальном демо-сайте, если скролла нет, то все окей:

     

    А если изменить размер окна, что бы появился скролл, то слева от каждой метки появляется черта, полоска в пиксель с цветом самой метки:

     

    Безумно бесит, что только не пробовал, не могу победить.

    Под рукой есть еще EDGE браузер, там все ок.

  3. Я сделал немного по другому... в 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, если нет, не возвращает ничего :) А сортировка идет в обратном порядке, то есть сначала те, что в наличии и потом отсутствующие! 

  4. По-моему, Ваш "как вариант" реально не даст никаких изменений. Ведь $_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']);
    
    
  5. Добавлять новый класс или менять существующий - разница не велика.

    А вот если бы предложенный класс вызвать не всегда, а лишь при первом заходе, а при последующих брать данные браузера из сессии, то было бы более рационально и экономно. Все-таки класс весит 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 "Вы пользователь Яблока!";
    }
    
  6. Ну так не проще обновить функцию чем инклудить еще один лишний класс? Или легких и правильных путей не ищем, а любим все усложнять?

     

    Зачем изобретать велосипед, если уже есть готовый класс с необходимым функционалом? Чем плох вариант инклуда дополнительного класса?

  7. В симпле есть функция определения устройства, смотрите api/Design.php.

     

    Используемый мной класс более современен, имеет больше возможностей определения типа мобильного устройства (иос, андроид, и т.п.) что позволит подсунуть ссылку на магазин мобильных приложений. Так же версию браузера и другое.

    http://mobiledetect.net

     

    она старая и ужасна, к тому же функция eregi deprecated в каком то php  :)

     

    Эта функция объявлена УСТАРЕВШЕЙ в PHP 5.3.0, и УДАЛЕНА PHP 7.0.0.

  8. И так, если кому интересно, легкая доработка для определения в шаблоне витрины типа устройства, с которого заходит покупатель. Используя это, можно "гнуть" шаблон под определенный тип.

     

    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}
    
  9. А чем CSV не устраивает? Я считаю что заморачиваться с экселем стоит только тогда, когда ппц как необходимо сложное форматирование или стили документа с последующими правками. В остальных случаях достаточно csv, ну или pdf, а в некоторых случая и голый html пойдет :)

     

    Делал как то как раз выгрузку в xls перечня заказов, которые "приняты" и при этом не оплачены.

    Там что-то со складом постоянно не сходилось, вот просили сделать сверять. В экселевский файл экспорта попадает номер и дата заказа, сам товар и его кол-во в этом заказе.

     

    В принципе в эксель можно выгрузить что угодно, была бы фантазия :) Я помню даже кому то делал формирование в экселе что-то типа бирок заказов для почты, печатаешь, вырезаешь и клеишь готовую на посылку, а там уже индекс, адрес и кому отправлять, сумма наложного платежа прописью.

     

    В эксель даже можно выгружать данные и тут же по ним строить графики, смотреть статистику.

  10. Ну не знаю, я делал под требования. Сказали так :)

    Тут просто поделился, я думаю каждый сможет подправить под себя кто хоть немного js

     

    Просто дилинькать надо было только тогда, когда между интервалом обновления число новых заказов растет, увеличивается. 

  11. 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}

  12. Был сделан механизм присвоения товаром меток, или как их чаще называют - тэги.

    Смысл простой и очень похож на присвоение бренда, разве что меток можно присвоить неограниченное количество и собираются в каталоге они только по товаром родительской категории.

     

    Тэг имеет свой URL следующего вида: http://domain/catalog/name/tag

    Для каждого URL тэга можно создать страницу со своими метатегами и описанием.

    Один и тот же тэг, например "для мамы" можно использовать в совершенно разных категориях товара (косметика, белье, кастрюли).

     

    Дабы много не писать, предлагаю посмотреть видео.

     

    Самому потыкаться можно тут: http://simpla.gloobus.ru

     

    Цена: 30$ с установкой.

  13. Это все ошибки ваших стилей, никакого отношения к консоли не имеют!

    500 это очень мало, это запрос каждые полсекунды. Я говорил про 5000.

    Могу посмотреть что у вас не так, если дадите доступ в админку к заказам.

  14. Так, ну все вроде сделал по описанию, но вот что то не вижу оповещений я...

    Для начала раскоментируйте строку с отладкой:

     

    console.log('Cur time: '+time()+' - Start time: '+start_time+' - Data: '+data.count_new+' + '+data.count_time);

     

    и смотрите в консоле браузера что происходит... так же на время отладки можн поставить интервал запросов почаще, например 5 секунд (5000).

  15. У меня была задача как то разрулить такую ситуацию:

    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}

  16. Была необходимость реализации информирования в админке о поступлении нового заказа без перезагрузки страницы. Работает естественно с любой страницы в админке. Интервал запросов - 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);  
    });  
    
  17. Стала очень интересной данная тема и решил наваять квантователь изображений на 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 изображений в минуту.

  18. Прописал, все сделал как надо - у меня без изменений

     

    Посмотрите у себя в Smarty/libs/plugins есть ли файл outputfilter.trimwhitespace.php?

    Если нет, прикрепил. Попробуйте его подсунуть, но я не знаю зависимость от версий шаблонизатора

    outputfilter.trimwhitespace.php

×
×
  • Создать...