deezler

Редактирование файла seo_url.php

Рекомендуемые сообщения

deezler    1

Еще раз привет. Искал модули для того, чтобы адрес корзины был не кривой /index.php?route=checkout/cart, а просто /cart/

 

Единственное бесплатное решение на 2.2., которое сразу заработало — вот это http://www.opencart.com/index.php?route=extension/extension/info&extension_id=26068

 

Модуль состоит всего из одного файла, который переписывает файл /catalog/controller/startup/seo_url.php

 

Все получилось круто, но две проблемы возникло:

 

  1. На несуществующих страницах перестала выводится ошибка 404, просто главную показывает с кодом 200.
  2. На конце всех ссылок сайта выводит .html.

Подскажите, как можно эти проблемы решить?

 

Вот код файла:

<?php
class ControllerStartupSeoUrl extends Controller {

  /***************************
  ***** SeoUrl Functions *****
  ***************************/ 
  private $urlFriendly = array(
    'common/home'                   => 'index',
    'account/register'              => 'create-account',
    'account/login'                 => 'login',
    'account/logout'                => 'logout',
    'account/newsletter'            => 'newsletter',
    'account/wishlist'              => 'wishlist',
    'account/order'                 => 'order-history',
    'account/account'               => 'my-account',
    'account/forgotten'             => 'forgot-password',
    'account/download'              => 'downloads',
    'account/return'                => 'returns',
    'account/transaction'           => 'transactions',
    'account/password'              => 'change-password',
    'account/edit'                  => 'edit-account',
    'account/address'               => 'address-book',
    'account/reward'                => 'reward-points',
    'account/return/add'            => 'request-add',
    'account/voucher'               => 'voucher',
    'information/contact'           => 'contact',
    'information/contact/success'   => 'contact-success',
    'information/sitemap'           => 'sitemap',
    'affiliate/register'            => 'create-affiliate-account',
    'affiliate/login'               => 'affiliate-login',
    'affiliate/logout'              => 'affiliate-logout',
    'affiliate/account'             => 'affiliates',
    'affiliate/edit'                => 'edit-affiliate-account',
    'affiliate/password'            => 'change-affiliate-password',
    'affiliate/payment'             => 'affiliate-payment-options',
    'affiliate/tracking'            => 'ffiliate-tracking-code',
    'affiliate/transaction'         => 'affiliate-transactions',
    'affiliate/forgotten'           => 'affiliate-forgot-password',
    'checkout/cart'                 => 'shopping-cart',
    'checkout/checkout'             => 'checkout',
    'checkout/voucher'              => 'gift-vouchers',
    'product/special'               => 'specials',
    'product/manufacturer'          => 'brands',
    'product/compare'               => 'compare-products',
    'product/search'                => 'search',
  );
                
  public function getKeyFriendly($_route) {
    if( count($this->urlFriendly) > 0 ){
      $key = array_search($_route, $this->urlFriendly);
        if($key && in_array($_route, $this->urlFriendly)){
          return $key;
        }
    }
    return false;
  }

  public function getValueFriendly($route) {
    if( count($this->urlFriendly) > 0) {
      if(in_array($route, array_keys($this->urlFriendly))){
        return '/'.$this->urlFriendly[$route];
      }
    }
    return false;
  }
  /***************************
  ***** SeoUrl Functions *****
  ***************************/ 

	public function index() {
		// Add rewrite to url class
		if ($this->config->get('config_seo_url')) {
			$this->url->addRewrite($this);
		}

		// Decode URL
		if (isset($this->request->get['_route_'])) {
      /* SeoUrl remove prefix (*.html) */
      $this->request->get['_route_'] = explode('.', $this->request->get['_route_'], -1); 
      $this->request->get['_route_'] = implode('.',$this->request->get['_route_']);
      /* SeoUrl remove prefix (*.html) */
			$parts = explode('/', $this->request->get['_route_']);

			// remove any empty arrays from trailing
			if (utf8_strlen(end($parts)) == 0) {
				array_pop($parts);
			}

			foreach ($parts as $part) {
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");

				if ($query->num_rows) {
					$url = explode('=', $query->row['query']);

					if ($url[0] == 'product_id') {
						$this->request->get['product_id'] = $url[1];
					}

					if ($url[0] == 'category_id') {
						if (!isset($this->request->get['path'])) {
							$this->request->get['path'] = $url[1];
						} else {
							$this->request->get['path'] .= '_' . $url[1];
						}
					}

					if ($url[0] == 'manufacturer_id') {
						$this->request->get['manufacturer_id'] = $url[1];
					}

					if ($url[0] == 'information_id') {
						$this->request->get['information_id'] = $url[1];
					}

					if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') {
						$this->request->get['route'] = $query->row['query'];
					}
				} else {
					$this->request->get['route'] = 'error/not_found';

					break;
				}
			}

			if (!isset($this->request->get['route'])) {
				if (isset($this->request->get['product_id'])) {
					$this->request->get['route'] = 'product/product';
				} elseif (isset($this->request->get['path'])) {
					$this->request->get['route'] = 'product/category';
				} elseif (isset($this->request->get['manufacturer_id'])) {
					$this->request->get['route'] = 'product/manufacturer/info';
				} elseif (isset($this->request->get['information_id'])) {
					$this->request->get['route'] = 'information/information';
				}
			}
      /* SeoUrl getKeyFriendly */
      if ($_key = $this->getKeyFriendly($this->request->get['_route_']) ) { $this->request->get['route'] = $_key; }
      /* SeoUrl getKeyFriendly  */ 
			if (isset($this->request->get['route'])) {
				return new Action($this->request->get['route']);
			}
		}
	}

	public function rewrite($link) {
		$url_info = parse_url(str_replace('&', '&', $link));

		$url = '';

		$data = array();

		parse_str($url_info['query'], $data);

		foreach ($data as $key => $value) {
			if (isset($data['route'])) {
				if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
					$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");

					if ($query->num_rows && $query->row['keyword']) {
						$url .= '/' . $query->row['keyword'];

						unset($data[$key]);
					}
				} elseif ($key == 'path') {
					$categories = explode('_', $value);

					foreach ($categories as $category) {
						$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");

						if ($query->num_rows && $query->row['keyword']) {
							$url .= '/' . $query->row['keyword'];
						} else {
							$url = '';

							break;
						}
					}

					unset($data[$key]);
				}
        /* SeoUrl getValueFriendly */
        if( $_link = $this->getValueFriendly($data['route']) ) { $url .= $_link; unset($data[$key]); }
        /* SeoUrl getValueFriendly */
			}
		}

		if ($url) {
			unset($data['route']);

			$query = '';

			if ($data) {
				foreach ($data as $key => $value) {
					$query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((is_array($value) ? http_build_query($value) : (string)$value));
				}

				if ($query) {
					$query = '?' . str_replace('&', '&', trim($query, '&'));
				}
			}
      /* SeoUrl add prefix (*.html) */
			return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . '.html' . $query;
		} else {
			return $link;
		}
	}
}

В первую очередь, я пробовал менять .html на / в этом блоке:

      /* SeoUrl add prefix (*.html) */
            return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . '.html' . $query;
        } else {
            return $link;
        }

Но меняются только ссылки (что, кстати, тоже очень круто, потому что мы избавляемся от дублей), но вот страницы упорно открываются только с путем .html.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 049

прикрутить seo_pro  и не пользоваться костылем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
deezler    1

прикрутить seo_pro  и не пользоваться костылем.

 

На 2.2 еще не выпустили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ArtemPitov    420

смысл юзать сырой 2.2 и изобретатель костыли  ? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
nikifalex    372

я ну 2.2 установил seo_pro за полчаса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
deezler    1

я ну 2.2 установил seo_pro за полчаса.

 

Надо попробовать.

 

Доработки делали какие-то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 049

смысл юзать сырой 2.2 и изобретатель костыли  ? 

Какие костыли? 1 строчка,

Увы. да через ЖОПУ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
insidius    0

Люди помогите... у меня опенкарт 2.1 сделал все как описано вот в этой ссылке http://madnet.com.ua/poleznaya-informaciya/opencart-2-nastrojka-sef/#comment-365  ЧПУ заработало а ссылки некоротых страниц так и остались вот в таком виде /index.php?route=product/manufacturer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От SegoMr
      Подскажите пожалуйста, почему страница не прокручивается вверх после пополнения корзины? 
    • От Violetta25
      При добавлении товара в корзину, не меняется сумма возле значка и в пункте итого. В чем может быть причина и как ее решить? 

    • От Allaur
      Доброго времени суток.
      Интересует возможен ли ниже описанный функционал...
      Например, накидал посетитель товаров в корзину и призадумался.... Да не на минутку призадумался, а на недельку. А в это время одна из позиций товара закончилась. Понятно , что человек не сможет оформить заказ, потому что товара не стало в наличии, но сама позиция в корзине то висит. И когда посетитель кидал товар в корзину то позиция была в наличии. И мало того , что ему и в голову не приходит что товар может закончится, так он ещё и не видит что там горят красные звёздочки, потому что он тупо не понимает ситуации, почему  у него нет кнопки ОФОРМИТЬ ЗАКАЗ.
      Так вот хотелось бы узнать. Возможно ли сделать так чтобы товар автоматически удалялся с корзины при обнулении количества товара.
      Как это сделано , например, на сайте katrin-artshop.com
      Настоящим временем это проверить конечно не удастся. Ну может кто знаком с сайтом...
    • От dirtsport
      Народ, подскажите пожалуйста, как поправить вёрстку после небольших "улучшений" с моей стороны в шаблоне AnyStore? А то автора темы нет на форуме с 18 декабря, в личку и на почту не отвечает. Шаблон куплен на этом форуме с моего же аккаунта. Сайт:
      doma (.) petrov (.) pro 1) На маленьких экранах становится не кликабельное лого (естественно не с главной страницы) Вроде сосений блок накладывается
      2) Ширина кликабельности разворачивающийся кнопки "Инфо" занимает не всё пространство кнопки, что затрудняет его нажатие
      3) Корзина выглядит не как должна*
       
      Что я сделал, после чего стали эти проблемы:
       
      а) * В шаблоне есть 7 вариантов хедера. Вернее меню мне понравилось с одного хедера, остальное с другого. И я взял и тупо вставил <nav id="top">..............</nav> 5-го хедера вместо <nav id="top">..............</nav> 1-хедера. В теории всё должно было быть нормально, и почти всё получилось, кроме корзины. Она должна была выглядить такой-же как соседние значки поиска, личного кабинета без слов "В Вашей корзине пусто" и в их стиле.
      б) Проблема с кликабельности лого на меленьких экранах стала, когда я сделал лого и номер телефона в один ряд, добавив логотипу класс col-xs-4
      в) Ширина кликабельности кнопки "Инфо" стала не на всю ширину кнопки то ли после того как я сделал пункт а), то ли б)
       
      Помогите пожалуйста советом, как нужно сделать эти дейтвия, чтобы не ломалась вёрстка других элементов? А то до автора не достучаться((
    • От w1r3d
      Добрый день! 
      Стыдно создавать тему из-за такого пустяка, но никак не могу найти где лежит информация по всплывающему окну корзины

       
      Где его искать ? Гугл меня отправлял только купить всплывающие корзины (
       
      спасибо. 
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу