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

[Решено] ЧПУ для 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 в зависимости от формирователя

 

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

Вхід

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

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

Important Information

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