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

Собственный контроллер и SEO-модули


Recommended Posts

Например есть контроллер mycatalog/mycontroller, который вызывается как:

 

mysite.my/index.php?route=mycatalog/mycontroller&mypath_id=3&my_id=5

 

В таблице url_alias прописаны красивые ссылки для mypath_id и my_id

 

SEO-модуль ничего про mycatalog/mycontroller не знает и ссылки этого вида не обрабатывает. Существует ли универсальный способ добавить собственный обработчик для преобразования ссылок, или единственный вариант это вручную вносить изменения в SEO-модуль?

 

Т.е. один раз написать обработчик, который можно было бы подключать к разным SEO-модулям.

 

Вопрос про opencart 2

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


Если у вас нет динамических параметров - то реализуется очень просто через seopro, с помощью добавления нужной записи в БД.

Если есть - то конечно необходимо дописывать правила для роутов.

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

Я неделю мучался с написанием своего контроллера для модуля фотогалерей, это был для меня тот еще путь страданий (неделю свободного времени убил). Так же знаю, что пользователь @markimax делал то же самое для своих мега модулей и помог мне в некоторых моментах. За что ему отдельное Спасибо. Вот Вам мой сео контроллер из модуля фотогалерей на базе кэшируемого seo_pro от @freelancer:

У меня там все проще, иерархии и категорий нет. В модуле есть всего 2 раздела

  1. gallery/gallery - список галерей
  2. gallery/photos&album_id=1 - галерея

Но думаю, в контроллер добавить функцию getPathByMyId($id) не составит труда (по аналогии смотрите как сделаны запросы ЧПУ категорий, там есть такая же иерархия). Хранятся ключи и значения SEO в своей таблице, которую нужно создать, чтобы не было конфликтов с другими seo контроллерами.

Для 1.5.x

<?php
/**
* @author Shashakhmetov Talgat <[email protected]>
*/
class ControllerCommonSeoGallery extends Controller
{
    private $cache_data = null;
    private $current_store_id = 0;
    public function __construct($registry)
    {
        parent::__construct($registry);
        $this->current_store_id = $this->config->get('config_store_id');
        $cache_name = 'seo_pro_gallery.' . $this->current_store_id;
        $this->cache_data = $this->cache->get($cache_name);
        if (!$this->cache_data) {
            $query            = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE store_id = " . $this->current_store_id);
            $this->cache_data = array();
            foreach ($query->rows as $row) {
                $this->cache_data['keywords'][$row['keyword']] = $row['query'];
                $this->cache_data['queries'][$row['query']]    = $row['keyword'];
            }
            
            $query            = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE query LIKE '%album_id=%'");
            foreach ($query->rows as $row) {
                $this->cache_data['keywords'][$row['keyword']] = $row['query'];
                $this->cache_data['queries'][$row['query']]    = $row['keyword'];
            }

            $this->cache->set($cache_name, $this->cache_data);
        }
    }
    public function index()
    {
        if ($this->config->get('config_seo_url')) {
            $this->url->addRewrite($this);
        }else{
            return;
        }
        
        if (isset($_GET['_route_']))
            $this->request->get['_route_'] = $_GET['_route_'];
        if (isset($_GET['route']))
            $this->request->get['route'] = $_GET['route'];

        if (isset($this->request->get['album_id'])) {
            $this->request->get['route'] = 'gallery/photos';
            if (isset($this->request->get['_route_'])) {
                $_route_ = $this->request->get['_route_'];
                unset($this->request->get['_route_']);
            }

            $this->validate();
            if (isset($this->request->get['_route_'])) {
                $this->request->get['_route_'] = $_route_;
            }
            $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK');
            return $this->gallery_flag = 'photos';
        }
        
        if (isset($this->request->get['_route_'])) {
            $route = $this->request->get['_route_'];
            $parts = explode('/', trim(utf8_strtolower($route), '/'));
            list($last_part) = explode('.', array_pop($parts));
            array_push($parts, $last_part);
            // var_dump($parts);
            foreach ($parts as $part) {
                $rows = array();
				foreach ($parts as $keyword) {
					if (isset($this->cache_data['keywords'][$keyword])) {
						$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);
					}
				}
				if (count($rows) == sizeof($parts)) {
					$queries = array();
					foreach ($rows as $row) {
						$queries[utf8_strtolower($row['keyword'])] = $row['query'];
					}

					reset($parts);
					foreach ($parts as $part) {
						$url = explode('=', $queries[$part], 2);

						if (isset($url[0]) && $url[0] == 'album_id') {
	                        $this->request->get['album_id'] = $url[1];
	                        $this->gallery_flag                     = 'photos';
	                    } elseif (isset($url[0]) && $url[0] == 'gallery/gallery') {
	                        $this->gallery_flag = 'gallery';
	                        if (!isset($this->request->get['gallery/gallery'])) {
	                            $this->request->get['route'] = 'gallery/gallery';
	                        } else {
	                            $this->request->get['route'] = 'gallery/gallery';
	                        }
	                    } elseif (isset($url[0]) && $url[0] == 'route') {
	                        $this->request->get['route'] = $url[1];
	                    } elseif (count($url) > 1) {
							$this->request->get[$url[0]] = $url[1];
						}
					}
				}

            }
            if (isset($this->request->get['album_id'])) {
                $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK');
                $this->request->get['route'] = 'gallery/photos';
            } elseif (isset($this->request->get['gallery/gallery'])) {
                $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK');
                $this->request->get['route'] = 'gallery/gallery';
            }else{
            	if (isset($queries[$parts[0]])) {
					$this->request->get['route'] = $queries[$parts[0]];
				}
            }
            // var_dump($this->request);
            $_route_ =$this->request->get['_route_'];
			unset($this->request->get['_route_']);
            $this->validate();
            $this->request->get['_route_'] = $_route_;

			if (isset($this->request->get['route'])) {
				$this->request->get['_route_'] = $this->request->get['route'];
			}
            return $this->gallery_flag;
        }
    }
    public function rewrite($link)
    {
        if (!$this->config->get('config_seo_url'))
            return $link;
        $seo_url = '';

        $component = parse_url(str_replace('&', '&', $link));
        $data      = array();
        
        if (isset($component['query'])) {
            parse_str($component['query'], $data);
            if (!isset($data['route'])) {
                return $link;
            }
            $route = $data['route'];

            unset($data['route']);
			
			$postfix = false;
            
            if ($route == 'gallery/photos') {
                if (isset($data['album_id'])) {
                    $tmp              = $data;
                    $data             = array();
                    $data['album_id'] = $tmp['album_id'];
                    if (isset($tmp['limit'])) {
						$data['limit'] = $tmp['limit'];
					}
					if (isset($tmp['page'])) {
						$data['page'] = $tmp['page'];
					}
					$postfix = true;
                }
            } elseif ($route == 'gallery/gallery') {
            	
            } else {
            	return $link;
            }

            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();
            foreach ($data as $key => $value) {
                switch ($key) {
                    case 'album_id':
                        $config_gallery_galleries_include_seo_path = $this->config->get('config_gallery_galleries_include_seo_path');
                        if ($config_gallery_galleries_include_seo_path[$this->current_store_id]) {
                            $queries[] = 'gallery/gallery';
                        }
                        $queries[] = $key . '=' . $value;
                        unset($data[$key]);
                        $postfix = true;
                        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]
                    );
                }
            }
            reset($data);
            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]);
                }
            }
            if ($seo_url == '')
                return $link;
            if ($seo_url) {
				unset($data['route']);
				$query = '';
				if ($data) {
					foreach ($data as $key => $value) {
						$query .= '&' . $key . '=' . $value;
					}
					if ($query) {
						$query = '?' . trim($query, '&');
					}
				}

				$devider = $this->config->get('config_seo_url_postfix');
				if (empty($devider) || !$postfix) {
					$devider = "/";	
				}


				$link = $component['scheme'] . '://' . $component['host'] . (isset($component['port']) ? ':' . $component['port'] : '') . str_replace('/index.php', '', $component['path']) . $seo_url . $devider . $query;
				return $link;
			} else {
				return $link;
			}
        } else {
            return $link;
        }
    }
    private function validate()
    {
        if (empty($this->request->get['route']) || $this->request->get['route'] == 'error/not_found') {
            return;
        }
        if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            return;
        }
        if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
            $url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/'));
            $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array(
                'route'
            )), 'SSL'));
        } else {
            $url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/'));
            $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array(
                'route'
            )), 'NONSSL'));
        }
        if (rawurldecode($url) != rawurldecode($seo)) {
            header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
            $this->response->redirect($seo);
        }
    }
    private function getQueryString($exclude = array())
    {
        if (!is_array($exclude)) {
            $exclude = array();
        }
        return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));
    }
}
?> 

Для 2.x

<?php
/**
* @author Shashakhmetov Talgat <[email protected]>
*/
class ControllerCommonSeoGallery extends Controller
{
    private $cache_data = null;
    private $current_store_id = 0;
    public function __construct($registry)
    {
        parent::__construct($registry);
        $this->current_store_id = $this->config->get('config_store_id');
        $cache_name = 'seo_pro_gallery.' . $this->current_store_id;
        $this->cache_data = $this->cache->get($cache_name);
        if (!$this->cache_data) {
            $query            = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE store_id = " . $this->current_store_id);
            $this->cache_data = array();
            foreach ($query->rows as $row) {
                $this->cache_data['keywords'][$row['keyword']] = $row['query'];
                $this->cache_data['queries'][$row['query']]    = $row['keyword'];
            }
            
            $query            = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE query LIKE '%album_id=%'");
            foreach ($query->rows as $row) {
                $this->cache_data['keywords'][$row['keyword']] = $row['query'];
                $this->cache_data['queries'][$row['query']]    = $row['keyword'];
            }

            $this->cache->set($cache_name, $this->cache_data);
        }
    }
    public function index()
    {
        if ($this->config->get('config_seo_url')) {
            $this->url->addRewrite($this);
        }else{
            return;
        }
        
        if (isset($_GET['_route_']))
            $this->request->get['_route_'] = $_GET['_route_'];
        if (isset($_GET['route']))
            $this->request->get['route'] = $_GET['route'];

        if (isset($this->request->get['album_id'])) {
            $this->request->get['route'] = 'gallery/photos';
            if (isset($this->request->get['_route_'])) {
                $_route_ = $this->request->get['_route_'];
                unset($this->request->get['_route_']);
            }

            $this->validate();
            if (isset($this->request->get['_route_'])) {
                $this->request->get['_route_'] = $_route_;
            }
            $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK');
            return $this->gallery_flag = 'photos';
        }
        
        if (isset($this->request->get['_route_'])) {
            $route = $this->request->get['_route_'];
            $parts = explode('/', trim(utf8_strtolower($route), '/'));
            list($last_part) = explode('.', array_pop($parts));
            array_push($parts, $last_part);
            // var_dump($parts);
            foreach ($parts as $part) {
                $rows = array();
				foreach ($parts as $keyword) {
					if (isset($this->cache_data['keywords'][$keyword])) {
						$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);
					}
				}
				if (count($rows) == sizeof($parts)) {
					$queries = array();
					foreach ($rows as $row) {
						$queries[utf8_strtolower($row['keyword'])] = $row['query'];
					}

					reset($parts);
					foreach ($parts as $part) {
						$url = explode('=', $queries[$part], 2);

						if (isset($url[0]) && $url[0] == 'album_id') {
	                        $this->request->get['album_id'] = $url[1];
	                        $this->gallery_flag                     = 'photos';
	                    } elseif (isset($url[0]) && $url[0] == 'gallery/gallery') {
	                        $this->gallery_flag = 'gallery';
	                        if (!isset($this->request->get['gallery/gallery'])) {
	                            $this->request->get['route'] = 'gallery/gallery';
	                        } else {
	                            $this->request->get['route'] = 'gallery/gallery';
	                        }
	                    } elseif (isset($url[0]) && $url[0] == 'route') {
	                        $this->request->get['route'] = $url[1];
	                    } elseif (count($url) > 1) {
							$this->request->get[$url[0]] = $url[1];
						}
					}
				}

            }
            if (isset($this->request->get['album_id'])) {
                $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK');
                $this->request->get['route'] = 'gallery/photos';
            } elseif (isset($this->request->get['gallery/gallery'])) {
                $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK');
                $this->request->get['route'] = 'gallery/gallery';
            }else{
            	if (isset($queries[$parts[0]])) {
					$this->request->get['route'] = $queries[$parts[0]];
				}
            }
            // var_dump($this->request);
            $_route_ =$this->request->get['_route_'];
			unset($this->request->get['_route_']);
            $this->validate();
            $this->request->get['_route_'] = $_route_;

			if (isset($this->request->get['route'])) {
				$this->request->get['_route_'] = $this->request->get['route'];
			}
            return $this->gallery_flag;
        }
    }
    public function rewrite($link)
    {
        if (!$this->config->get('config_seo_url'))
            return $link;
        $seo_url = '';

        $component = parse_url(str_replace('&', '&', $link));
        $data      = array();
        
        if (isset($component['query'])) {
            parse_str($component['query'], $data);
            if (!isset($data['route'])) {
                return $link;
            }
            $route = $data['route'];

            unset($data['route']);
			
			$postfix = false;
            
            if ($route == 'gallery/photos') {
                if (isset($data['album_id'])) {
                    $tmp              = $data;
                    $data             = array();
                    $data['album_id'] = $tmp['album_id'];
                    if (isset($tmp['limit'])) {
						$data['limit'] = $tmp['limit'];
					}
					if (isset($tmp['page'])) {
						$data['page'] = $tmp['page'];
					}
					$postfix = true;
                }
            } elseif ($route == 'gallery/gallery') {
            	
            } else {
            	return $link;
            }

            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();
            foreach ($data as $key => $value) {
                switch ($key) {
                    case 'album_id':
                        $config_gallery_galleries_include_seo_path = $this->config->get('config_gallery_galleries_include_seo_path');
                        if ($config_gallery_galleries_include_seo_path[$this->current_store_id]) {
                            $queries[] = 'gallery/gallery';
                        }
                        $queries[] = $key . '=' . $value;
                        unset($data[$key]);
                        $postfix = true;
                        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]
                    );
                }
            }
            reset($data);
            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]);
                }
            }
            if ($seo_url == '')
                return $link;
            if ($seo_url) {
				unset($data['route']);
				$query = '';
				if ($data) {
					foreach ($data as $key => $value) {
						$query .= '&' . $key . '=' . $value;
					}
					if ($query) {
						$query = '?' . trim($query, '&');
					}
				}

				$devider = $this->config->get('config_seo_url_postfix');
				if (empty($devider) || !$postfix) {
					$devider = "/";	
				}


				$link = $component['scheme'] . '://' . $component['host'] . (isset($component['port']) ? ':' . $component['port'] : '') . str_replace('/index.php', '', $component['path']) . $seo_url . $devider . $query;
				return $link;
			} else {
				return $link;
			}
        } else {
            return $link;
        }
    }
    private function validate()
    {
        if (empty($this->request->get['route']) || $this->request->get['route'] == 'error/not_found') {
            return;
        }
        if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            return;
        }
        if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
            $url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/'));
            $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array(
                'route'
            )), 'SSL'));
        } else {
            $url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/'));
            $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array(
                'route'
            )), 'NONSSL'));
        }
        if (rawurldecode($url) != rawurldecode($seo)) {
            header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
            $this->response->redirect($seo);
        }
    }
    private function getQueryString($exclude = array())
    {
        if (!is_array($exclude)) {
            $exclude = array();
        }
        return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));
    }
}
?> 

Таблица:

$sql[] = "CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "url_alias_gallery` (
  `url_alias_id` int(11) NOT NULL AUTO_INCREMENT,
  `query` varchar(255) NOT NULL,
  `keyword` varchar(255) NOT NULL,
  `store_id` int(11) NOT NULL,
  PRIMARY KEY (`url_alias_id`),
  KEY `query` (`query`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";

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

Еще забыл упомянуть, что должен быть модуль, размещенный на странице ошибки (схема error/not_found). Он должен получить флаг о том, что seo_контроллер отработал свое, обработал УРЛ выдал правильную ссылку, затем слелал на нее редирект, запустился снова и поставил флаг. Грубо говоря сайт отправляет посетителя на страницу ошибки, но с нее не поступает 404, а поступает 301 на правильный УРЛ. Затем он проверяет УРЛ и ставит флаг о том, что пользователь находится в разделе списка галерей или в разделе галареи.

 

Вот так выглядит код модуля, который нужно размещать на странице ошибки:

if ($this->config->get("seogallery") != 1) {

    $this->load->controller('common/seo_gallery');
    $this->config->set("seogallery", 1);

    if ($this->gallery_flag == 'photos') {
        $this->load->controller('gallery/photos');
        $this->response->output();
        exit();
    }

    if ($this->gallery_flag == 'gallery') {
        $this->load->controller('gallery/gallery');
        $this->response->output();
        exit();
    }
}
Надіслати
Поділитися на інших сайтах

Отличные вы оба два с Марком парни, только вот не задумываетесь о том, что создание дополнительных отдельных seo-контроллеров, вынесеных из общего контекста базового seo-класса в случае с исползованием сео про создают совершенно непонятно зачем дополнительную нагрузку на работу системы в виде запроса на чтение всей (еще одной) таблицы  с с новыми seo-урлами, потом укладывание ее в кеш с сериализацией. Не совсем легкие процедуры, которые вы дублируете.

Почему нельзя путем модификаторов внедрить логику формирования нужны роутов в тот же базовый класс SeoPro - для меня большая загадка. Кроме как "а посмотрите как мы умеем" другого объяснения я не вижу. А то что при этом + 50-500 миллисекунд отбирается у сервера. Так это ж никого не волнует.

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

 

Еще забыл упомянуть, что должен быть модуль, размещенный на странице ошибки (схема error/not_found). Он должен получить флаг о том, что seo_контроллер отработал свое, обработал УРЛ выдал правильную ссылку, затем слелал на нее редирект, запустился снова и поставил флаг. Грубо говоря сайт отправляет посетителя на страницу ошибки, но с нее не поступает 404, а поступает 301 на правильный УРЛ. Затем он проверяет УРЛ и ставит флаг о том, что пользователь находится в разделе списка галерей или в разделе галареи.

 

Вот так выглядит код модуля, который нужно размещать на странице ошибки:

if ($this->config->get("seogallery") != 1) {

    $this->load->controller('common/seo_gallery');
    $this->config->set("seogallery", 1);

    if ($this->gallery_flag == 'photos') {
        $this->load->controller('gallery/photos');
        $this->response->output();
        exit();
    }

    if ($this->gallery_flag == 'gallery') {
        $this->load->controller('gallery/gallery');
        $this->response->output();
        exit();
    }
}

А еще в роутере index() вашего ЧПУ формирователя

Можно вставлять расширение для "виджетов" ваших путей контроллера 

Что то типа такого:

            foreach ($this->data['agoo_widgets'] as $nm => $agoo_widget) {
                if (!empty($module_data) &&  $type == $agoo_widget) {
                    if (file_exists(DIR_APPLICATION . "controller/agoo/".$agoo_widget."/".$agoo_widget.".php")) {
                        $this->cont('agoo/'.$agoo_widget.'/'.$agoo_widget);
                        $controller_agoo = 'controller_agoo_'.$agoo_widget.'_'.$agoo_widget;
                         if (method_exists($this->registry->get($controller_agoo), 'seourl'))
                         $this->data = $this->$controller_agoo->seourl($this->data);
                     }
                }
            }

И описывать их отдельно в контроллерах

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

Отличные вы оба два с Марком парни....

Нет - ты не прав. Не создает никакой нагрузки, просто ты еще не разбирался с этим вопросом ;)

Seo_pro отработал - не нашел ссылки у себя и передал управление другому ЧПУ формирователю

Так что архитектурно - все правильно и логично

Какая разница кто обработает ЧПУ - никакой

"Отбирается" всего ничего 0.00... это вообще не критично. К тому же вся таблица "новых" URL кешируется

Т е запросов НЕТ вообще

 

А вот модификаторы - это проблема.

Постоянные проблемы слета. Код модификаторами меняется иногда до не узнаваемости ЧУЖИМИ модулями, привязка может быть изменена и ЧПУ слетают все из-за кривых рук других.

Вы хотите зависеть в ЧПУ от других - флаг в руки и постоянные траблы

Модификаторы - путь к не стабильности.

Спасибо её нам не надо

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

Нет - ты не прав. Не создает никакой нагрузки, просто ты еще не разбирался с этим вопросом ;)

"Отбирается" всего ничего 0.00... это вообще не критично. К тому же вся таблица "новых" URL кешируется

Т е запросов НЕТ вообще

 

А вот модификаторы - это проблема.

Постоянные проблемы слета. Код модификаторами меняется иногда до не узнаваемости ЧУЖИМИ модулями и привязка может быть изменена и ЧПУ слетают все из-за кривых рук других.

Вы хотите зависеть в ЧПУ от других - флаг в руки и постоянные траблы

 

Т.е. если у нас 35 000 товаров к примеру. При старте системы - даже если мы из кеша берем готовый файл со всем урлами, потом unserialize его в массив....

И считаем скорость поиска файла + скорость чтения файла (а он будет около 10-12мб) + unserialize массива и потом еще одна подобная операция, но уже на меньшем количестве данных...

К чему нужна еще одна абсолютно однотипная операция?

Хоть прав я, хоть не прав, я никогда не пойму write less, do more.

 

Это же однотипные операции, зачем им создавать паралельный класс? Потому что так круто ?

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

Я не хотел еб*ть себе мозг ни себе ни клиентам, чтобы патчить у каждого клиента его seo контроллер, который еще и из под pav вообще шаблонов не работает. Да еще и с введением модификаций в 2.0 это вообще геморрой. Так проще, быстрей и более правильно, раз архитектура OpenCart сама позволяет это делать. Марк прав, он не грузит систему, попробуйте сами. 

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

Т.е. если у нас 35 000 товаров к примеру.

:) Да в opencart сколько классов за раз отрабатывает ? Вот то то же. На один класс больше из более сотен

Закроем этот вопрос - ты в нем не разбирался до конца.

В отличии от костылей vqmod и модификаторов - работает стабильно, никогда не вылетает, не зависит от ДРУГИХ ЧПУ (не имеет значения seo_url, seo_pro, seo_gallery, ....) формирователей  и работает так же быстро.

Ты наверно знаешь сколько за раз кеширует opencart файлов и то что на один больше - роли не играет совершено.

Просто все ленятся по правильному делать - и сандалят костыли. А потом во всех темах пользователи задают вопросы... у меня не работает ЧПУ, у меня слетели ЧПУ, у меня ЧПУ ... Это все из-за ленивых костылей.

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

:) Да в opencart сколько классов за раз отрабатывает ? Вот то то же. На один класс больше из более сотен

Закроем этот вопрос - ты в нем не разбирался до конца.

В отличии от костылей vqmod и модификаторов - работает стабильно, никогда не вылетает, не зависит от ДРУГИХ ЧПУ (не имеет значения seo_url, seo_pro, seo_gallery, ....) формирователей  и работает так же быстро.

Ты наверно знаешь сколько за раз кеширует opencart файлов и то что на один больше - роли не играет совершено.

Просто все ленятся по правильному делать - и сандалят костыли. А потом во всех темах пользователи задают вопросы... у меня не работает ЧПУ, у меня слетели ЧПУ, у меня ЧПУ ... Это все из-за ленивых костылей.

 

Да хоть сто миллионов раз оно будет беспроблемно работать. Но выносить типизированную логику за рамки контекста основного класса - я считаю полным бредом.

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

Да хоть сто миллионов раз оно будет беспроблемно работать. Но выносить типизированную логику за рамки контекста основного класса - я считаю полным бредом.

 

Бред = OpenCart

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

Кстати для этого Даниэль и сделал  в url.php

    public function addRewrite($hook) {
        $this->hook[] = $hook;
    }

    public function rewrite($url) {
        foreach ($this->hook as $hook) {
            $url = $hook->rewrite($url);
        }

        return $url;
    }

Можно где хочешь вызвать обработчик

require_once(DIR_CATALOG . 'controller/common/seo.....php');
$seo... = new ControllerCommonSeo.... ($this->registry);
$this->url->addRewrite($seo...);

Так что всё согласно культуры архитектуры opencart

 

А вот костыли модификаторов и vqmod - это 3.14ц как грубо и не правильно

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

Да хоть сто миллионов раз оно будет беспроблемно работать. Но выносить типизированную логику за рамки контекста основного класса - я считаю полным бредом.

 

Бред - это патчить ЧПУ формирователь стандартный, когда для этого есть инструментарий opencart!

https://opencartforum.com/topic/53294-собственный-контроллер-и-seo-модули/?do=findComment&comment=469231

Постом выше

так что "не надо"

Не разобрался - лучше ...

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

Кстати для этого в этого и сделал  в url.php

    public function addRewrite($hook) {
        $this->hook[] = $hook;
    }

    public function rewrite($url) {
        foreach ($this->hook as $hook) {
            $url = $hook->rewrite($url);
        }

        return $url;
    }

Можно где хочешь вызвать обработчик

require_once(DIR_CATALOG . 'controller/common/seo.....php');
$seo... = new ControllerCommonSeo.... ($this->registry);
$this->url->addRewrite($seo...);

Так что всё согласно культуры архитектуры opencart

 

А вот костыли модификаторов и vqmod - это 3.14ц как грубо и не правильно

 

Можно из Opencart сделать WorPress - вопросов нет.

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

Можно из Opencart сделать WorPress - вопросов нет.

 

Причем здесь эта демагогия...

 

Так задумал разработчик opencart

Он специально сделал url = $hook->rewrite($url); для этого (обработки ЧПУ), он специально сделал контроллер not_found (правда роутер там забыл поставить, но и так всё отлично). Специально сделал addHeader($header) $this->headers[] = $header;

А то что разработчики балбесы и ленятся сделать согласно культуре opencart, просто говорит об их низкой квалификации или лени.

Из-за чего потом opencart ругают про не стабильность и т.п. Необоснованно кстати, из-за лени разработчиков модулей

 

 

 

Бред = OpenCart

 

Не правда ваша - opencart на сегодня имеет самую лучшую архитектуру

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

url = $hook->rewrite($url);  - это все равно повторная цепочка однотипных операций.

Модификаторы же позволяют делать все на уровне базового кода.

 

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

 

Хуки - это может кому то и хорошо, но это спагетти, в которых отсутсвует возможность контроля выполнения модификаций и в случае их наслоения на выходе мы можем получить еще большие сюрпризы, чем необходимость поправить привязки модификаторов.

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

....

 

Сколько угодно можем спорить. ...

Да никто и спорить не будет. То что написал это полный бред. Извини, но из песни слов не выкинешь

Какие к моНАХам однотипные операции...

Вызов класса - это однотипная операция ?  :-D  :ugeek:  Давай вообще ООП отменим, будем только костылями все делать. "Напишем" cms без ООП

Патчить модификаторами это бред и 3.14ц как не правильно согласно культуре opencart

Что сказать.

Заблуждайся дальше.

Постоянные сюрпризы только от vqmod патчей и модификаторов, которые до неузнаваемости пропатчивают ЧПУ формирователь, что потом некуда "привязаться" или что еще хуже начинается каша и каждый тянет одеяло в свою сторону

От грамотной архитектуры - сюрпризов нет вообще

Это в других темах только - "у меня не работают чпу модуля, хотя vqmod стоит" и т п

90% вот таких запросов на простых модулях. У меня и  halfhope (можешь посмотреть в темах поддержки) нет таких запросов априори. Потому что ЧПУ формирователь модуля не зависимый

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

У halfhope не могу спрашивать, религия не позволяет, в личку напишу если что, почему.

 

Но где я говорил про отмену ООП.

У нас есть класс seo_pro - зачем еще один диспетчер роутов внедрять совершенно однотипный ?
В том коде, который вы привели, добавок в три строки.

ВЫ же написали целые простыни.

И кто говорит про пишем меньше и проще ?

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

У halfhope не могу спрашивать, религия не позволяет, в личку напишу если что, почему.

 

Но где я говорил про отмену ООП.

Почти намекаешь ;)

А теперь задача такая - для каждого языка свой URL ;)

Ну и где уже однотипный уже ЧПУ формирователь

Лишний вызов класса из СОТНИ вызов никак не отражается ни на чем.

Наоборот - только стабильнее система.

Это культура opencart

snastik - извини, но из песни слов не выкинешь :-D

Просто нас читают начинающие разработчики, а ты им советуешь наплевать на культуру кода архитектуры opencart

Если делать как задумывал Даниэль - то все будет отлично и стабильно работать

99% модулей можно вообще без vqmod и патчей сделать

Просто все ленятся и сандалят костыли

Отсюда и не стабильность opencart, не из-за него самого, а из-за разработчиков модулей

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

Люди добрые помогите)))
 

Написал свой функционал "Линии товаров" контроллер product/product_line
Которые у своей таблице в БД привязаны к определенному manufacturer_id

Как на seo_pro сделать формирование ссылки у product_line относительно производителя

Аналогично производителю я дописал product_line в seo_pro и сами по себе линии товаров работают

 

Ссылка на производителя https://deadseainbaku.az/ahava
Ссылка на линию товаров https://deadseainbaku.az/dead-sea-osmotertm-concentrate
 
А нужно получить ссылку https://deadseainbaku.az/ahava/dead-sea-osmotertm-concentrate

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

Я как-то делал похожее, только Вам нужно вместо zzzz поставить производителя, а его, в свою очередь, взять из БД. И вместо категорий у вас будет использоваться линия товаров. Нет там ничего сложного. просто прочтите и поймете что да как. Вот еще похожая тема, но там решения пока что нет.

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

Вот так выглядит код модуля, который нужно размещать на странице ошибки:

if ($this->config->get("seogallery") != 1) {

    $this->load->controller('common/seo_gallery');
    $this->config->set("seogallery", 1);

    if ($this->gallery_flag == 'photos') {
        $this->load->controller('gallery/photos');
        $this->response->output();
        exit();
    }

    if ($this->gallery_flag == 'gallery') {
        $this->load->controller('gallery/gallery');
        $this->response->output();
        exit();
    }
}

 

Спасибо всем за подсказку. Правильно я понимаю, что этот код надо размещать в контроллере error/not_found.php?

 

То есть преобразуем mysite.ext/path/entity => mysite.ext/index.php?route=mycatalog/mycontroller&mypath=3&myitem=5

 

Соответственно получается, что в том случае, если mypath=3 myitem=5 не существует, то уже mycatalog/mycontroller отправит пользователя на error/not_found

 

Может тогда имеет смысл скопировать оригинальный error/not_found.php и, в случае ошибки, вызывает из своего контроллера уже его? Соответственно можно избавиться от флагов.

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


Это код контроллера hook модуля, который будет размещен в шапке сайта страницы ошибки, а не код контроллера страницы ошибки.

 

Короче пользователь переходит по ссылке mysite.ext/path/entity, стандартный SEO контроллер видит, что ее не существует и выводит содержимое страницы ошибки, но если в шапке страницы ошибки поставить подгрузку своего SEO контроллера (через модуль и тот код, что я прислал) он проверит ссылку, выставит флаг о том что страница есть и она принадлежит модулю и в соответствии с тем какой флаг выставили - загрузит тот или иной раздел. А если ссылка не прошла проверку, то выводится стандартная страница ошибки.

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

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

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

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

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

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

Вхід

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

Вхід зараз
×
×
  • Створити...

Important Information

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