Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

halfhope

Користувачі
  
  • Публікації

    1 750
  • З нами

  • Відвідування

Повідомлення, опубліковані користувачем halfhope

  1. В моем модуле настраиваемой доставки тоже используется вывод описания. По ссылке вы найдете ocmod/vqmod файлы для вывода описания доставки.

     

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

     

  2. немного не в тему - почему никто не исправляет эти ошибки валилации ?

     

    Я не так давно тоже создавал тему про валидность (здесь всего 5 недочетов)

    но так никто и не помог.

    почему ? есть причины по которым этого нельзя сделать или это работа как то не так стОит ?

     

    Лично для меня это адовая рутина, лазить по различным тплкам и вкумодам, сканировать различные разделы с разными наборами модулей на валидность, исправлять если что не так. А если стоит PAV, то это вообще пц. Да сайт и так нормально индексируется и работает. К тому же не рекомендую проводить такую стандартизацию, когда клиент все еще на стадии  "Оптимизировать сайт оп показателям GooglePage Speed". 

     

    А для приведения документа к стандартам HTML/XHTML, достаточно онлайн валидатора, он показывает что в документе не так. 

  3. Клиентская оптимизация по показателям GooglePage Speed от 5 к рублей. 

     

     

     

    1) поправить валидность html по w3;

     

    Кроме этого пункта.

  4. С почасовой оплатой такой бюджет израсходуется на стадии подключения к фтп..

     

    Оффтоп. Я иногда (слава богу, что редко) с клиентами подолгу разговариваю, т.к. не могу понять чего они хотят. И эти деньги кончаются на стадии отправки клиентом данных для подключения по FTP.

    • +1 1
  5. UPD: Накосячил слегка с аттрибутами:


    public function getProductAttributes($product_id) {
    	$product_attribute_group_data = array();
    
    	$product_attribute_group_query = $this->db->query("SELECT a.attribute_id, ad.name as attribute_name, pa.text, ag.attribute_group_id, agd.name as attribute_group_name FROM " . DB_PREFIX . "product_attribute pa
    	LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id)
    	LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id)
    	LEFT JOIN " . DB_PREFIX . "attribute_group ag ON (a.attribute_group_id = ag.attribute_group_id)
    	LEFT JOIN " . DB_PREFIX . "attribute_group_description agd ON (ag.attribute_group_id = agd.attribute_group_id)
    	WHERE pa.product_id = " . (int)$product_id . "
    		AND ad.language_id = agd.language_id
    		AND pa.language_id = agd.language_id
    		AND agd.language_id = " . (int)$this->config->get('config_language_id') . "
    	ORDER BY ag.sort_order, agd.name, a.sort_order, ad.name");
    
    	$product_attribute_data = array();
    
    	foreach ($product_attribute_group_query->rows as $product_attribute) {
    		$product_attribute_data[$product_attribute['attribute_group_id']][$product_attribute['attribute_id']] = array(
    			'attribute_id' => $product_attribute['attribute_id'],
    			'name'         => $product_attribute['attribute_name'],
    			'text'         => $product_attribute['text']
    		);
    
    		$product_attribute_group_data[$product_attribute['attribute_group_id']] = array(
    			'attribute_group_id' => $product_attribute['attribute_group_id'],
    			'name'               => $product_attribute['attribute_group_name'],
    		);
    
    		$product_attribute_group_data[$product_attribute['attribute_group_id']]['attribute'] =& $product_attribute_data[$product_attribute['attribute_group_id']];
    
    	}
    
    	return $product_attribute_group_data;
    }
    
    • +1 2
  6. Недавно обратился клиент (OcStore 1.5.5.1.2.) с просьбой посмотреть и узнать где именно тормоза на сайте. Так как, на сайте под завязку используются опции и аттрибуты, я стал грешить на них еще до проверки, проверка xhprof дала понять, что я не ошибался. Одним кэшированием тут не отделаться, так как данные магазина постоянно обновляются и механизм инвалидации кэша далек от идеала.

     

    Было принято решение оптимизировать функции получения списка аттрибутов и опций. Что именно сделано: Убраны дополнительные подзапросы из цикла обработки аттрибутов и опций, так как все необходимые данные можно получить в одном запросе. Так же используются PHP указатели, что позволит обработать все данные в одном цикле. Все это позволит получить все необходимые данные за один запрос и быстро из обработать. 

     

    В данном частном случае производительность увеличилась почти в 30 раз (очень много опций, значений опций и аттрибутов почти у каждого товара). 

    
    public function getProductAttributes($product_id) {
    	$product_attribute_group_data = array();
    
    	$product_attribute_group_query = $this->db->query("SELECT a.attribute_id, ad.name as attribute_name, pa.text, ag.attribute_group_id, agd.name as attribute_group_name FROM " . DB_PREFIX . "product_attribute pa
    	LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id)
    	LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id)
    	LEFT JOIN " . DB_PREFIX . "attribute_group ag ON (a.attribute_group_id = ag.attribute_group_id)
    	LEFT JOIN " . DB_PREFIX . "attribute_group_description agd ON (ag.attribute_group_id = agd.attribute_group_id)
    	WHERE pa.product_id = " . (int)$product_id . "
    		AND ad.language_id = agd.language_id
    		AND pa.language_id = agd.language_id
    		AND agd.language_id = " . (int)$this->config->get('config_language_id') . "
    	ORDER BY ag.sort_order, agd.name, a.sort_order, ad.name");
    
    	$product_attribute_data = array();
    
    	foreach ($product_attribute_group_query->rows as $product_attribute) {
    		$product_attribute_data[$product_attribute['attribute_id']][] = array(
    			'attribute_id' => $product_attribute['attribute_id'],
    			'name'         => $product_attribute['attribute_name'],
    			'text'         => $product_attribute['text']
    		);
    
    		$product_attribute_group_data[$product_attribute['attribute_group_id']] = array(
    			'attribute_group_id' => $product_attribute['attribute_group_id'],
    			'name'               => $product_attribute['attribute_group_name'],
    		);
    
    		$product_attribute_group_data[$product_attribute['attribute_group_id']]['attribute'] =& $product_attribute_data[$product_attribute['attribute_id']];
    
    	}
    
    	return $product_attribute_group_data;
    }
    
    public function getProductOptions($product_id) {
    	$product_option_data = array();
        $product_option_query = $this->db->query("SELECT pov.product_option_value_id, pov.option_value_id, ovd.name as product_option_value_name, od.name as option_name, ov.image, pov.quantity, pov.subtract, pov.price, pov.price_prefix, pov.points, pov.points_prefix, pov.weight, pov.weight_prefix, pov.product_option_id, pov.option_id, o.type, po.required
            FROM " . DB_PREFIX . "product_option_value pov
            LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id)
            LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id)
            LEFT JOIN " . DB_PREFIX . "product_option po ON (pov.product_option_id = po.product_option_id)
            LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id)
            LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id)
            WHERE po.product_id = " . (int)$product_id . "
                AND od.language_id = " . (int)$this->config->get('config_language_id') . "
            ORDER BY o.sort_order, ov.sort_order");
    
        $product_option_value_data = array();
    
        foreach ($product_option_query->rows as $product_option) {
    
        	if (in_array($product_option['type'], array('select','radio','checkbox','image'))) {
    
                $product_option_value_data[$product_option['product_option_id']][] = array(
                    'product_option_value_id' => $product_option['product_option_value_id'],
                    'option_value_id'         => $product_option['option_value_id'],
                    'name'                    => $product_option['product_option_value_name'],
                    'image'                   => $product_option['image'],
                    'quantity'                => $product_option['quantity'],
                    'subtract'                => $product_option['subtract'],
                    'price'                   => $product_option['price'],
                    'price_prefix'            => $product_option['price_prefix'],
                    'points'                  => $product_option['points'],
                    'points_prefix'           => $product_option['points_prefix'],
                    'weight'                  => $product_option['weight'],
                    'weight_prefix'           => $product_option['weight_prefix']
                );
    
                $product_option_data[$product_option['option_id']] = array(
    				'product_option_id'    => $product_option['product_option_id'],
    				'option_id'            => $product_option['option_id'],
    				'name'                 => $product_option['option_name'],
    				'type'                 => $product_option['type'],
    				'required'             => $product_option['required']
    			);
    
    			$product_option_data[$product_option['option_id']]['option_value'] =& $product_option_value_data[$product_option['product_option_id']];
    
        	}else{
        		$product_option_data[$product_option['option_id']] = array(
    				'product_option_id' => $product_option['product_option_id'],
    				'option_id'         => $product_option['option_id'],
    				'name'              => $product_option['option_name'],
    				'type'              => $product_option['type'],
    				'option_value'      => $product_option['option_value'],
    				'required'          => $product_option['required']
    			);
        	}
        }
    
    	return $product_option_data;
    }
    
    

     

    По аналогии поступил с админкой (только опции) и с модулем CSV Product Export. Будьте внимательны при использовании этого кода, он изменен, а значит и vqmod модификации, которые работают с этим участком кода могут работать не так как ожидается. 

    • +1 8
  7. Автор пропал :(

    Загрузил галереи, а показывает только несколько, куда все остальные делись...вот вопрос...

     

    Всем добрый день. Извиняюсь за отсутствие, семейные дела. Это баг. Исправлен. Вечером выложу обновление. В обновлении так же:

    • Исправлен баг с сортировкой
    • Исправлен баг использования модуля списка галерей на странице галереи
    • Добавлена совместимость с версиями старше 2.1.x (ошибка в админке на странице модулей)

    Выход следующей версии планируется не ранее чем через 2 недели. В новой версии планирую:

    • добавить поддержку многоуровневых альбомов (по аналогии с категориями в OpenCart). 
    • добавить Justified Gallery (опционально)

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

  8. Ищите long pooling и push уведомления. Но это уже серверная технология и ее немного трудней внедрять. Работает эта технология так:

     

    С помощью js клиент соединяется с PUSH/Long pool сервером и ждет уведомлений, на протяжении ожидания (30 сек) канал клиент/сервер постоянно открыт. Если на сервере появляется событие, то оно сразу отправляется клиенту по открытому клиентом каналу. Затем, после получения сообщения, клиент снова соединяется и ждет новых уведомлений. Если уведомления не поступили за время ожидания (30 сек), то клиент разрывает связь и открывает ее снова. Таким образом реализованы сообщения в вконтакте и других соц сетях. При этом, если использовать нормальный софт, а не nginx/PHP+MySQL сервер сильно не грузится. Хотя в nginx, вроде была поддержка long pool и он тоже, вроде как, держится. Еще видел скрипт мультиплексор на питоне, он охуенен, он поднять его мне не удалось.

     

    Так же видел платные/бесплатные push сервера с готовым API.

     

    Еще есть jquery.javascript xmpp клиенты. 

     

    А по идее если клиентов мало, то париться особо не стоит, вполне хватит setTimeout, только вот желательно всю архитектуру OpenCart не поднимать, а сделать отдельным скриптом с минимумом кода и запросов. 

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.