Как получить URL-адрес внешнего интерфейса продукта от бэкэнда?

8

Я разрабатываю расширение для Magento 2. Мне нужно получить URL-адрес внешнего интерфейса продукта от внутреннего интерфейса. Я пытался использовать:

//$storeManager->->setCurrentStore(2);
$url = $product->setStoreId(2)->getProductUrl();
$url = $product->setStoreId(2)->getUrlInStore(); 

но $urlвсегда возвращать внутренний URL-адрес, как http://<domain>/admin/catalog/product..... они могут работать в Magento 1.x, но не в 2.x. Есть ли способ получить URL внешнего интерфейса?

Пол Донг
источник
Вы можете столкнуться с подобной проблемой, как я в magento.stackexchange.com/questions/138216/… - это полностью сломано в M2
Фабиан Шменглер

Ответы:

6

Добавьте новую зависимость конструктора в ваш класс forntUrlModel:

function __construct(
    ...
     \Magento\Framework\UrlInterface $frontUrlModel
) {
    $this->frontUrlModel = $frontUrlModel;
}

private function getProductUrl($product, $storeCode = 'default', $categoryId = null) {
        $routeParams = [ '_nosid' => true, '_query' => ['___store' => $storeCode]];

        $routeParams['id'] = $product->getId();
        $routeParams['s'] = $product->getUrlKey();
        if ($categoryId) {
            $routeParams['category'] = $categoryId;
        }
     return $this->frontUrlModel->getUrl('catalog/category/view', $routeParams);
 }

И использовать DI, чтобы ввести правильную зависимость

<type name="YouClass"> 
    <arguments>
        <argument name="frontUrlModel" xsi:type="object" shared="false">Magento\Framework\Url</argument>
    </arguments>
</type>
Канди
источник
Спасибо. Я вижу, вы вводите UrlInterface и определяете зависимость в Di.xml. Почему бы вам не сделать инъекцию \Magento\Framwork\Urlнапрямую?
Пол Донг
Принцип разделения интерфейса от SOLID
KAndy
@Kandy Я пытался это .. но не смог получить URL продукта .. :( пожалуйста, напишите полный код здесь .. Я пытаюсь создать столбец в таблице продуктов со ссылкой на внешний вид продукта.
Ask Bytes
@ Кэнди, что значит YouClass? нам нужно сделать любой класс здесь. Не могли бы вы более подробно
изложить
7

Я отвечаю на мой вопрос. Ответ mtns_cll на вопрос Magento 2 получить URL магазина внешнего интерфейса для пути в админ работает для меня.

Я выкладываю свое решение здесь на тот случай, если кому-то это нужно:

внешний вид продукта :

инъекционные \Magento\Framework\Url $url

$url->getUrl('catalog/product/view', ['id' => $entityId, '_nosid' => true, '_query' => ['___store' => $storeCode]]);

бэкэнд продукта

введите \Magento\Framework\UrlInterface $urlили используйте интерфейс URL, унаследованный от родительского класса.

$url->getUrl('catalog/product/edit', ['id' => $entityId, 'store' => $targetStoreId]);

фронтенд категории

inject `\ Magento \ Framework \ Url $ url

$url->getUrl('catalog/category/view', ['id' => $entityId, '_nosid' => true, '_query' => ['___store' => $storeCode]]);

бэкэнд категории

введите \Magento\Framework\UrlInterface $urlили используйте интерфейс URL, унаследованный от родительского класса.

$url->getUrl('catalog/category/edit', ['id' => $entityId, 'store' => $targetStoreId]);

веб-страница cms

инъекционные Magento\Cms\Block\Adminhtml\Page\Grid\Renderer\Action\UrlBuilder $rul

$url->getUrl($this->_pageModel->getIdentifier(), $targetStoreId, $storeCode );

бэкэнд страницы cms

введите \Magento\Framework\UrlInterface $urlили используйте интерфейс URL, унаследованный от родительского класса.

$url->getUrl(PageActions::CMS_URL_PATH_EDIT, ['page_id' => $pageId]);

бэкэнд блока cms

введите \Magento\Framework\UrlInterface $urlили используйте интерфейс URL, унаследованный от родительского класса.

$url->getUrl(BlockActions::URL_PATH_EDIT, ['block_id' => $blockId]);
Пол Донг
источник
1

Вы можете попробовать использовать Magento/Store/Model/StoreManager. Внедрить его в конструктор Magento/Store/Model/StoreManagerInterface, более или менее так:

    public function __construct(
\Magento\Store\Model\StoreManagerInterface $storeManager,
   .....
) {
   ...
$this->_storeManager=$storeManager;
}
$requestedStoreObject = $this->_storeManager->getStore($storeId);
$urlToRequestedStore = $requestedStoreObject->getUrl();

Вы должны заметить, что функция getStore()в качестве аргумента может принимать не только целое число, но также строку или объект:

/**
 * Retrieve application store object
 *
 * @param null|string|bool|int|\Magento\Store\Api\Data\StoreInterface $storeId
 * @return \Magento\Store\Api\Data\StoreInterface
 */
public function getStore($storeId = null);
Бартош Кубицки
источник
Это не работает для меня. он возвращает внутренний URL-адрес, например, http: // <domain> / admin / ....
Пол Донг