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

Joomido Supertools Pack #1(3)


Recommended Posts

Шкурный интерес : нужно ли?

Пакет включает в себя 3 мода: модуль ЧПУ (ориджинал) + утилиту fetchscript + утилиту Profiler.

Вкратце:

  • 1) Все моды объединены в пакет по той причине, что они завязаны в модифике Loader
  • 2) В ЧПУ (в отличие от всех других) модифицируются все ссылки, так как этот процесс запускается в лоадере и подразумевает глобальную замену ссылок уже на этапе вывода (экономия запросов к БД на половину, на скрине видно). Сссылка приобретает вид домен/(язык - при желании)/тело.html
  • 3) Fetchscript (Minilinks) - вырезает из секции header все ссылки для скриптов и стилей и выставляет нечто minilinks / 8b472ed1227119809a58b8f69a44d1f1.css (js)
  • 4) Профайлер. Предположительно для разработчика. Не рекомендуется использовать на работающем сайте (можно в режиме отладки). Профайлер цепляется вручную в индексный файл, а при необходимости проверки конкретного модуля - там устанавливаются маркеры (можно вручную - на локалке, или при помощи модификатора)
  • 5) В пакете идет модификатор db, который отдает в профайлер кол-во запросов и тело запроса (а админке можно все посмотреть).
  • На скрине пример (сравнение работы без ЧПУ, с обычным ЧПУ и с Joomido ЧПУ).

 

Сейчас проверяется работа под Опенкарт 2.0, но при заинтересованности будет релиз под любую версию.

Ориентировочная стоимость $5. Все обновления (а они будут + пожелания пользователей) - бесплатно + поддержка разработчика.

 

Snap1.jpg

Надіслати
Поділитися на інших сайтах

@esculapra бери и делай, чего спрашивать, а там поюзают и отпишутся че не так и т.д.
а то кроме seo_pro тут сторонние сеопаки шлаки недолюбливают - и тому есть множество причин

 

Joomido - что это??  твентисикстерфромзебест ?)

Надіслати
Поділитися на інших сайтах


11 минут назад, AWARO сказал:

seo_pro

 

Joomido Sef работает не так, поэтому достигнуто уменьшение запросов к БД (скрин снят на локалке - в реале это даст большую экономию времени)

10 минут назад, AWARO сказал:

Joomido

Это мой бренд - как-то так (просто когда снимал скрин, еще не внес перевод, там в text_entry_labe  [метка] указываю метку, чтобы после увидеть, что нвжно). сейчас уже добавил вариант просмотра всего профайла (при клике по кнопке добавляется весть проход, включая запросы).

Надіслати
Поділитися на інших сайтах

20 минут назад, AWARO сказал:

бери и делай

Так уже почти готово, просто интерес в плане профайлера, впрочем, это не критично, так как не все пользователи - разработчики.

Надіслати
Поділитися на інших сайтах

27 минут назад, esculapra сказал:

 

 

Это мой бренд

эскалапра звучнее - а джумидо откуда то со стороны джумлы дует..
но те виднее.
остальное делай и выкладывай

Надіслати
Поділитися на інших сайтах


Будет очередная фрагментация opencart по ЧПУ формирователю - не думаю, что при стандарте де-факто seo_pro, нужен еще один.
 

Надіслати
Поділитися на інших сайтах

7 минут назад, markimax сказал:

Будет очередная фрагментация opencart по ЧПУ формирователю - не думаю, что при стандарте де-факто seo_pro, нужен еще один.
 

он ж кричит что у него лучше сеопро

Надіслати
Поділитися на інших сайтах


6 минут назад, markimax сказал:

что при стандарте де-факто seo_pro, нужен еще один

Этот установлен на ocStore. Но при всех ++, он работает стандартно, то есть каждую ссылку запрашивает из БД. У Joomido  нестандартный подход - я выбиряю ссылки регуляркой на этапе view,, и только product - остальные (категории, производители, инфо) у меня уже есть одним запросом и лежат в массиве. Хочу отметить, что стандартный (не про, да и про) не хавает ссылки в слайдере, а мой все хавает. Насчет кол-ва запросов к БД. На хостинге (у меня) ДБ располодена да другом сервере, поэтому уменьшение кол-ва запросов дает реальную экономию времени.

Надіслати
Поділитися на інших сайтах

13 минут назад, AWARO сказал:

он ж кричит что у него лучше сеопро

Реально да!

окей. я дам тебе для тестирования (как есть - может подскажешь еще что-нить) - полагаюсь на порядочность.

Змінено користувачем esculapra
дополнение
Надіслати
Поділитися на інших сайтах

1 минуту назад, esculapra сказал:

Этот установлен на ocStore. Но при всех ++, он работает стандартно, то есть каждую ссылку запрашивает из БД. У Joomido  нестандартный подход - я выбиряю ссылки регуляркой на этапе view,, и только product - остальные (категории, производители, инфо) у меня уже есть одним запросом и лежат в массиве. Хочу отметить, что стандартный (не про, да и про) не хавает ссылки в слайдере, а мой все хавает. Насчет кол-ва запросов к БД. На хостинге (у меня) ДБ располодена да другом сервере, поэтому уменьшение кол-ва запросов дает реальную экономию времени.

В seo_pro есть кеширование не забыли ;)
 

Надіслати
Поділитися на інших сайтах

17 минут назад, esculapra сказал:

Реально да!

окей. я дам тебе для тестирования (как есть - может подскажешь еще что-нить) - полагаюсь на порядочность.

да не, некогда.. я ваше не шарю в этом.. делай и выкладывай, купят потестят и пошло поехало
 

Надіслати
Поділитися на інших сайтах


20 минут назад, markimax сказал:

В seo_pro есть кеширование не забыли

У меня тоже. Короче, давайте говорить предметно. Я сейчас тестирую под Опенкарт 2. У тебя есть контроллер seo_pro (неохота качать, ибо поредполагаю, шо там)? Покажи тут код, и я объясню отличия.

Надіслати
Поділитися на інших сайтах

22 минуты назад, esculapra сказал:

У меня тоже. Короче, давайте говорить предметно. Я сейчас тестирую под Опенкарт 2. У тебя есть контроллер seo_pro (неохота качать, ибо поредполагаю, шо там)? Покажи тут код, и я объясню отличия.

ну... это кому надо то?))

 

@Yesvik на твой сео_про наезжают
:D

  • +1 1
Надіслати
Поділитися на інших сайтах


И теперь сравните с сео_про (в моем модуле ссылки выбираются регуляркой и поступают на обработку  в виде index.php/?route=бла-бла-бла), а потом обрабатываются. Если это продукт, то идет запрос в БД, иначе осуществляется поиск в массиве, создаваемом при инициализации.

 

 public function rewrite($link)
     {  
         $l=str_replace('&', '&', $link);
         $l=str_replace('"', '', $l);
         $l=str_replace('index.php?', '', $l);
       $data=array();
       parse_str($l, $data);
       $url='';
      foreach($data as $key=>$value)
       {
         switch($key)
         {
             case 'route':
           if(isset($this->settings[$value]))
                $url.=$this->settings[$value].'/';
              else
             {
               $url='';
             }
             unset($data['route']);
             break ;
             case 'path':
           $array_categories=explode('_', $value);
          foreach($array_categories as $category_id)
           {
           if(isset($this->settings["category_id=".$category_id]))
                $url.=$this->settings["category_id=".$category_id].'/';
              else
                $url='';
           }
           unset($data['path']);
             break ;
             case 'product_id':
           $query=$this->db->query("SELECT * FROM `".DB_PREFIX."url_alias` WHERE `query`='".$this->db->escape('product_id='.(int)$value)."'");
         if($query->num_rows && $query->row['keyword'])
              $url.=$query->row['keyword'];
           unset($data['product_id']);
             break ;
             case 'manufacturer_id':
             case 'information_id':
         if(isset($this->settings[$key.'='.$value]))
              $url.=$this->settings[$key.'='.$value];
            else
           {
             $url='';
           }
           unset($data[$key]);
             break ;
         }
       }
     if($url)
       {
         $query='';
       if($data)
         {
          foreach($data as $key=>$value)
           {
             $query.='&'.rawurlencode((string)$key).'='.rawurlencode((string)$value);
           }
         if($query)
           {
             $query='?'.str_replace('&', '&', trim($query, '&'));
           }
         }
       return $this->lang.$url.$query.$this->ext.'"';
       }
        else
       {
       return $link;
       }
     }

Надіслати
Поділитися на інших сайтах

Вы можете смеяться, но у меня есть еще мысли, как осуществить все операции (ЧПУ) в одном цикле (непосредственно в response) - это сократит кол-во итераций до 1 (вместо всех подключаемых view).

Змінено користувачем esculapra
правка
Надіслати
Поділитися на інших сайтах

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

Надіслати
Поділитися на інших сайтах


Только что, esculapra сказал:

Joomido sef (search engine fantasy)

дерзай, ни слушай ни кого и делай! однако всегда  воспринимай адекватно критику и если чего исправляй и дорабатывай!
Всегда полный вперёд!

  • +1 1
Надіслати
Поділитися на інших сайтах


6 минут назад, AWARO сказал:

Просто добивай модуль и выкладывай

Это комплект.

На скринах интерфейс ЧПУ и и профайлера (добавил функцию просмотра всех запросов к БД - только пока не вывел сами запросы, но они уже зафиксированы).

В ЧПУ красным отображены те, шо не имеют урл-алиаса, но они уже транслитерированы из названия (на тестах я только инглиш пока).

 

 

 

Snap2.jpg

Snap3.jpg

Надіслати
Поділитися на інших сайтах

19 минут назад, AWARO сказал:

ни слушай ни кого и делай! однако всегда  воспринимай адекватно критику и если чего исправляй и дорабатывай!

Критика нужна, но если конструктивная. Спасибо. Еще пару штрихов, и пускаю в продажу, а там посмотрим. Но заверяю, шо всем покупателям гарантирую долгосрочную поддержку, а также бесплатные обновления (это неизбежно, ибо я постоянно думаю как оптимизировать код, улучшить интерфейс и пр.), даже если стоимость товара будет повышаться. Кроме того, сейчас переделаю систему антихакера (рабочая, но есть замечания от модераторов) - это уже pack #2. Ну и антивирус (как без него? - пока на этапе разработки) - pack #3.

  • +1 1
Надіслати
Поділитися на інших сайтах

27 минут назад, esculapra сказал:

а также бесплатные обновления

долго не проживешь, делай подписку, даже если и копеечную

Надіслати
Поділитися на інших сайтах


informarion_id
manufacturer_id
article_id
etc

Где?

даже  common/home - где?

а это?

 

$l=str_replace('"', '', $l);

Зачем? Это не ваша ответственность

Кроме того
Своим расширением вы заменяете стандартный rewriter..

А еще есть сеофильры, есть блоги, есть статьи, новости  и куча различных  модулей

Изучите рынок ЧПУ формирователей/преобразователей.

Удачи в разработке

  • +1 1
Надіслати
Поділитися на інших сайтах

9 часов назад, chukcha сказал:

а это?

А это необходимо, так как я разработчик и знаю, что получу шнягу, типа product_id=20". 

Надіслати
Поділитися на інших сайтах

В 23.09.2019 в 01:47, AWARO сказал:

на твой сео_про наезжают

То что product не надо в файловый кеш писать - всё правильно.

 

Основная идея SEO_PRO в наличии основной категории, а остальное у меня давно переписано )

Вот эта часть кода упрощена...

Спойлер

		switch ($route) {
			case 'product/product':
				if (isset($data['product_id'])) {
					$tmp = $data;
					$data = array();
					if ($this->config->get('config_seo_url_include_path')) {
						$data['path'] = $this->getPathByProduct($tmp['product_id']);
						if (!$data['path']) return $link;
					}
					$data['product_id'] = $tmp['product_id'];
					$seo_pro_utm = preg_replace('~\r?\n~', "\n", $this->config->get('config_seo_pro_utm'));
					$allowed_parameters = explode("\n", $seo_pro_utm);
					foreach($allowed_parameters as $ap) {
						if (isset($tmp[trim($ap)])) {
							$data[trim($ap)] = $tmp[trim($ap)];
						}
					}
				}
				break;

			case 'product/category':
				if (isset($data['path'])) {
					$category = explode('_', $data['path']);
					$category = end($category);
					$data['path'] = $this->getPathByCategory($category);
					if (!$data['path']) return $link;
				}
				break;

			case 'product/product/review':
			case 'information/information/agree':
				return $link;
				break;

			default:
				break;
		}

		if ($component['scheme'] == 'https') {
			$link = $this->config->get('config_ssl');
		} else {
			$link = $this->config->get('config_url');
		}

		$link .= 'index.php?route=' . $route;

		if (count($data)) {
			$link .= '&' . urldecode(http_build_query($data, '', '&'));
		}

		$queries = array();
		if(!in_array($route, array('product/search'))) {
		foreach ($data as $key => $value) {
				switch ($key) {
					case 'product_id':
					case 'manufacturer_id':
					case 'category_id':
					case 'information_id':
					case 'order_id':
						$queries[] = $key . '=' . $value;
						unset($data[$key]);
						$postfix = 1;
						break;

					case 'path':
						$categories = explode('_', $value);
						foreach ($categories as $category) {
							$queries[] = 'category_id=' . $category;
						}
						unset($data[$key]);
						break;

					default:
						break;
				}
			}
		}


		if(empty($queries)) {
			$queries[] = $route;
		}

		$rows = array();
		foreach($queries as $query) {
			if(isset($this->cache_data['queries'][$query])) {
				$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);
			}
		}

		if(count($rows) == count($queries)) {
			$aliases = array();
			foreach($rows as $row) {
				$aliases[$row['query']] = $row['keyword'];
			}
			foreach($queries as $query) {
				$seo_url .= '/' . rawurlencode($aliases[$query]);
			}
		}

 

 

... потому что:

Одним запросом выполняется выборка готового seo_url товара, т.е. на выходе строка category/subcategory/subsubcategory/product

 

Одним запросом выполняется выборка готовых seo_url для всех категорий, причем в виде одной json_encode строки...

Сейчас объясню для чего такой изврат

Во первых БД возвращает 1 строку быстрее (и пофиг что она большая)

Для сравнения:

выборка одной json_encode строкой 1200 категорий с соответствующими им path в виде

image.thumb.png.b5a228e50a2d8106741cc629fa882121.png

и простая выборка category_id по индексу, для тех же 1200 категорий, вот таким запросом: SELECT `category_id` FROM `oc_category`

image.png.7823f3e628c092b8e3fa3061a494c8cc.png

Выборка json_encode строки в 7,5 раз быстрее ;)

 

Во вторых получив много строк - нарываемся на цикл в system/library/db/mysql.php

while ($result = mysql_fetch_assoc($resource)) {
	$data[$i] = $result;
	$i++;
}

В третьих вынуждены ещё раз обойти в цикле все записи для формирования массива в виде 'category_id' => 'готовый seo_url', что-то типа такого:

$data = array();
foreach ($query->rows as $row) {
	$data[$row['category_id']] = $row['seo_url'];
}

Вместо всех этих циклов просто $data = json_decode($query->row['data']) и массив готов, его можно кидать в кеш на очень долго... кеш будет актуален пока не изменишь категорию... а при изменении категории кеш удалится.

 

Времени не хватает допилить возможность использовать одинаковые алиасы в разных ветках категорий... допилю - выложу

  • +1 2
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

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

Important Information

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