Перейти к содержанию
markimax

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

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

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

 

Надо получить ЧПУ для 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 в зависимости от формирователя

 

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

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

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


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

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

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

// код из 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);

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

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


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

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));
в итоге получаешь нужную тебе ссылку.

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


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

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

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

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

 

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

  • +1 1

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


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

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% нубовские вопросы, поэтому действительно сложные проблемы и приходиться обсуждать в курилке, загнали разрабов как обычно в курилку для обсуждения :)

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


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

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

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

// код из 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/');

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


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

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

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


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

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

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

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

 

тогда

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

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

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


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

тогда

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

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

 

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

 

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

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


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

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:

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


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

а если не 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' а по какому-то другому адресу. 

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


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

Не работает

 

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 дернуть, то ЧПУ сделает редирект :)

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


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

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

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

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


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

это и есть универсальное решение, этот код используется в самом опенкарте для определения типа сео модуля. Абсолютно не важно что там будет, 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;
}

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

 

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

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

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


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

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

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

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

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

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

Войти

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

Войти

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

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

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

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

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

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

       
    • От 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]); Но в таком случае у меня перестают работать Хлебные крошки, в них пропадает вложенность и перестаёт раскрываться меню.
      Большое спасибо!
      Да, забыл, самая последняя версия
  • Последние посетители   0 пользователей онлайн

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

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.