Jump to content
Sign in to follow this  
markimax

[Решено] ЧПУ для front-a из админ. части (проблема)

Recommended Posts

Может кто сталкивался с такой проблемой? (не знаю даже куда обращаться, но обычно разработчики здесь тусуются ;) )

 

Надо получить ЧПУ для front-a из админ. части.

 

Без костылей никак не выходит...

 

Дело в том что в админ. части нет ЧПУ и ЧПУ формирователя. А у разных формирователей разные правила. Например в SEO PRO ЧПУ может заканчивать .html и слешем и т.п. в других.

И если делать $this->url->link('product/product','&product_id=1');

То получиться .../admin/index.php?route=product/product&product_id=1 в отличии допустим от поля SEO URL tovar-1 и должно быть ../tovar-1.html или /tovar-1/ или /tovar-1 в зависимости от формирователя

 

Костыль то я нашел как получить, но это костыль...

Может у кого-то была такая проблема и он её решил без костылей? Просто костылем не очень красиво.

Share this post


Link to post
Share on other sites

Не сталкивался, но могу предположить..

Какой именно модуль для ЧПУ используется можно получить как-то так:

// код из index.php
if (!$seo_type = $this->config->get('config_seo_url_type')) {
  $seo_type = 'seo_url';
}

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

require_once(DIR_CATALOG . 'controller/common/' . $seo_type . '.php');
$seoUrl = new ControllerCommon . $seo_type ($this->registry);
$new_url = $seoUrl->rewrite($url);

Как-то так. Код примерный.

Share this post


Link to post
Share on other sites

curl`ом или ajax`ом гоняешь в domain.tld/index.php?route=module/your_get_seolink_module с данными (POST), которые нужны для построения ссылки, например

$route = 'product/product';
$args = '&product_id={product_id}';
там делаешь

$json = array();
$json['link'] = $this->url->link($this->request->post['route'],$this->request->post['args']);
$this->response->setOutput(json_encode($json));
в итоге получаешь нужную тебе ссылку.

Share this post


Link to post
Share on other sites

Вызов из админки, поэтому существующий экземпляр класса URL не покатит. Надо создать новый:

$urlToCatalog = new Url(HTTP_CATALOG, $config->get('config_secure') ? HTTPS_CATALOG : HTTP_CATALOG);
$correct_URL = $urlToCatalog->link($some_route);

Код не проверял

 

P.S. До пользователи раздел разработки загадили, что чисто технический вопрос мы обсуждаем в курилке)

  • +1 1

Share this post


Link to post
Share on other sites

curl`ом или ajax`ом гоняешь в domain.tld/index.php?route=module/your_get_seolink_module с данными (POST), которые нужны для построения ссылки, например

$route = 'product/product';
$args = '&product_id={product_id}';
там делаешь

$json = array();
$json['link'] = $this->url->link($this->request->post['route'],$this->request->post['args']);
$this->response->setOutput(json_encode($json));
в итоге получаешь нужную тебе ссылку.

 

 

Так и сделал, гонял ссылку во front, там получал ответ от контроллера с обработанной.

Но как и писал, это костыль, в принципе для обработки одной ссылки сойдет

Но как то костыльно выглядит. Вот и спросил, может кто-то изобрел что-то получше

 

P.S. До пользователи раздел разработки загадили, что чисто технический вопрос мы обсуждаем в курилке)

 

Там в 99% нубовские вопросы, поэтому действительно сложные проблемы и приходиться обсуждать в курилке, загнали разрабов как обычно в курилку для обсуждения :)

Share this post


Link to post
Share on other sites

Не сталкивался, но могу предположить..

Какой именно модуль для ЧПУ используется можно получить как-то так:

// код из index.php
if (!$seo_type = $this->config->get('config_seo_url_type')) {
  $seo_type = 'seo_url';
}

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

 

require_once(DIR_CATALOG . 'controller/common/' . $seo_type . '.php');
$seoUrl = new ControllerCommon . $seo_type ($this->registry);
$new_url = $seoUrl->rewrite($url);

Как-то так. Код примерный.

 

Примерно так тоже пробовал

Не покатило, ссылка будет вида  /admin/.... :(

Не забываем, что define('HTTP_SERVER', '..../admin/');

Share this post


Link to post
Share on other sites

markimax, мой вариант подошел?

Share this post


Link to post
Share on other sites

Примерно так тоже пробовал

Не покатило, ссылка будет вида  /admin/.... :(

Не забываем, что define('HTTP_SERVER', '..../admin/');

 

тогда

$url = str_replace('/admin', '', $url);

просто, этот способ будет раз в 50 быстрее, чем если дергать контроллер каталога через аякс или курл, потому что тогда грузится весь опенкарт (контроллеры, модели, конфиги, происходит десятки обращений к базе). Если нужно получить 1 ссылку это не проблема, но если нужно получить несколько десятков ссылок в цикле.. то процесс может подвиснуть на несколько минут. 

Share this post


Link to post
Share on other sites

тогда

$url = str_replace('/admin', '', $url);

просто, этот способ будет раз в 50 быстрее, чем если дергать контроллер каталога через аякс или курл, потому что тогда грузится весь опенкарт (все контроллеры, модели, конфиги, происходит десятки обращений к базе). Если нужно получить 1 ссылку это не проблема, но если нужно получить несколько десятков ссылок в цикле.. то процесс может подвиснуть на несколько минут. 

 

И так делал (тоже костыль получается), но тут проблема в другом, а если не seo_pro и не seo_url и нет $seo_type = $this->config->get('config_seo_url_type') ?

 

Мне надо универсальное решение для модуля, а у буржуев может стоять что угодно...

Share this post


Link to post
Share on other sites

markimax, мой вариант подошел?

Не работает

 

route=product/product

product_id=65

SEO URL этого продукта: sborka

                $urlToCatalog = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTPS_CATALOG : HTTP_CATALOG);
                $correct_URL = $urlToCatalog->link($route, '&product_id=' . $this->data['product_id']);

                http: //.../index.php?route=product/product&product_id=65

 

:cry:

Share this post


Link to post
Share on other sites

а если не seo_pro и не seo_url и нет $seo_type = $this->config->get('config_seo_url_type') ?

 

Мне надо универсальное решение для модуля, а у буржуев может стоять что угодно...

это и есть универсальное решение, этот код используется в самом опенкарте для определения типа сео модуля. Абсолютно не важно что там будет, seo_url, seo_pro или seo_super_pro в каждом сео модуле есть функция rewrite которая на входе получает обычную ссылку, преобразует ее как-то (не важно как), а на выходе отдает преобразованную. Это все что нам нужно знать. Инкапсуляция + полиморфизм. 

насчет костыля, можно вместо жесткого удаления 'admin' взять разницу между HTTP_SERVER и HTTP_CATALOG на тот единичный случай, когда у кого-то админка находится не в 'admin' а по какому-то другому адресу. 

Share this post


Link to post
Share on other sites

Не работает

 

route=product/product

product_id=65

SEO URL этого продукта: sborka

                $urlToCatalog = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTPS_CATALOG : HTTP_CATALOG);
                $correct_URL = $urlToCatalog->link($route, '&product_id=' . $this->data['product_id']);

                http: //.../index.php?route=product/product&product_id=65

 

:cry:

 

Хм. Да... ну, есть через CURL дернуть, то ЧПУ сделает редирект :)

Share this post


Link to post
Share on other sites

cmd, только если параметры GET`ом слать и что-то типа seo_pro.

я потому и указал POST.

Share this post


Link to post
Share on other sites

это и есть универсальное решение, этот код используется в самом опенкарте для определения типа сео модуля. Абсолютно не важно что там будет, seo_url, seo_pro или seo_super_pro в каждом сео модуле есть функция rewrite которая на входе получает обычную ссылку, преобразует ее как-то (не важно как), а на выходе отдает преобразованную. Это все что нам нужно знать. Инкапсуляция + полиморфизм. 

насчет костыля, можно вместо жесткого удаления 'admin' взять разницу между HTTP_SERVER и HTTP_CATALOG на тот единичный случай, когда у кого-то админка находится не в 'admin' а по какому-то другому адресу.

 

markimax, мой вариант подошел?

 

 

Всем спасибо!

Вопрос решен добавлением обьекта формирователя ЧПУ $urlToCatalog->addRewrite($seoUrl); // про addRewrite  то забыли :)

(особый респект cmd - жаль не могу поставить +)

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

$seo_type = $this->config->get('config_seo_url_type');
 if (!$seo_type) {
       $seo_type = 'seo_url';
 }
require_once(DIR_CATALOG . 'controller/common/' . $seo_type . '.php');
$classSeo = 'ControllerCommon'.str_replace('_','',$seo_type);
$seoUrl = new $classSeo($this->registry);

$urlToCatalog = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTPS_CATALOG : HTTP_CATALOG);
$urlToCatalog->addRewrite($seoUrl);
$correct_URL = $urlToCatalog->link($route,$query);

// seo_pro безжалостно "откусывает" схему и хост url, 
// а для админки надо, к примеру если ссылку послать по e-mail 
// (как же без "хоста" то пользователь перейдет по ссылке)! 
// думаю надо переделать эту часть seo pro как она была и как в seo url
// чтобы не использовать костыль ниже
$pos = strpos($correct_URL, 'http');
               
 if ($pos === false) {
    $correct_URL = ($this->config->get('config_secure') ? HTTPS_CATALOG : HTTP_CATALOG).$correct_URL;
}

Проверено - уже работает в модуле

 

Можно ставить [Решено]

И тему перенести в "Разработки"

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Similar Content

    • By Linaart
      Здравствуйте!
      В предыдущих версиях в настройках можно было установить ЧПУ для красивых URL.
      Здесь, к сожалению, я не могу найти данной функции. URL прописывается не красиво, более того, если в карточке товара, вручную прописать URL, он прописывает на русском языке (хотелось бы на английском) типа /index.php?route=product/product&product_id=702&search=солнышко.
      Версии платных генераторов только для версий 2х.
      Подскажите, пожалуйста, что делать?
       
    • By leedagang
      Привет отцы!

      нужна ваша помощь. 

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

      имею ocStore 2.1.0.2 модуль seopro ..... видел такое словосочетание 

      не серчайте сильно , если этот вопрос тут разобрали давно, просто киньте линк на ветку форума , спс

       
    • By sml33
      Добрый день, из за большой вложенности категорий хочется её убрать
      Есть УРЛ:

      site.ru/category1/podcategory1/podpodcategory1/ и тд хочется сделать site.ru/category1/ site.ru/podcategory1/ site.ru/podpodcategory1/ и тд
      Что можете сказать по этому поводу?

      Сам не программист, но лазил лазил и вот что нашёл В файле - /catalog/controller/common/seo_pro.php На 156 строке В строке - $seo_url .= '/' . rawurlencode($aliases[$query]); убираем точку, следователь убираем добавление вложенности. Получается так $seo_url = '/' . rawurlencode($aliases[$query]); Но в таком случае у меня перестают работать Хлебные крошки, в них пропадает вложенность и перестаёт раскрываться меню.
      Большое спасибо!
      Да, забыл, самая последняя версия
  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.