バックエンドから製品のフロントエンド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で完全に壊れています
Fabian Schmengler

回答:


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、2016年

私はここで完全なコードを投稿してください:(。これを試してみました..しかし、製品のURLを取得することができませんでした@KAndy ..私は、製品のフロントエンドリンクに製品のグリッドで列を作るしようとしている。
バイト掲載

@KAndy YouClassとはどういう意味ですか?ここでクラスを作る必要があります。この答えが私のような他の多くの人を助けることができるように、もっと詳しく説明してもらえますか
Rutvee Sojitra 2018

7

私の質問に答えます。mtns_cllの答えはMagento 2の質問に答え ます。

私は誰かがそれを必要とする場合に備えてここに私の解決策を投稿します:

製品フロントエンド

注入する \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:// <domain> / admin / ....などのバックエンドURLを返します
Paul Dong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.