如何从后端获取产品的前端URL?


8

我正在开发Magento 2的扩展。我需要从后端获取产品的前端URL。我尝试使用:

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

$url总是返回后端网址,例如http://<domain>/admin/catalog/product....。它们可能适用于Magento 1.x,但不适用于2.x。有什么办法获取前端网址?


您可能会遇到与我在magento.stackexchange.com/questions/138216/…中类似的问题-这在M2中完全被打破
Fabian Schmengler,2016年

Answers:


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直接注射?
Paul Dong

接口隔离原理,来自SOLID
KAndy '16

@KAndy我曾试图这样..但无法获得产品的网址.. :(请在这里发表完整的代码..我试图让产品网格产品前端链接列。
向字节

@KAndy YouClass是什么意思?我们需要在这里上任何课。您能否更详细地说明一下,以便此答案可以帮助许多其他像我一样的人
Rutvee Sojitra 18/12/11

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]);

类别前端

注入`\ 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);

它对我不起作用。它返回后台网址,如http:// <域> /管理/ ....
保罗冬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.