Comment obtenir l'URL frontend du produit depuis le backend?

8

Je développe une extension de Magento 2. J'ai besoin d'obtenir l'URL frontend d'un produit depuis le backend. J'ai essayé d'utiliser:

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

mais le $urlretourne toujours une URL de backend, comme http://<domain>/admin/catalog/product..... ils peuvent fonctionner dans Magento 1.x mais pas pour 2.x. Existe-t-il un moyen d'obtenir une URL frontale?

Paul Dong
la source
Vous pourriez rencontrer un problème similaire à celui de magento.stackexchange.com/questions/138216/… - cela est totalement cassé en M2
Fabian Schmengler

Réponses:

6

Ajoutez une nouvelle dépendance de constructeur à votre classe 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);
 }

Et utilisez DI pour injecter la bonne dépendance

<type name="YouClass"> 
    <arguments>
        <argument name="frontUrlModel" xsi:type="object" shared="false">Magento\Framework\Url</argument>
    </arguments>
</type>
KAndy
la source
Merci. Je vois que vous injectez UrlInterface et définissez la dépendance dans Di.xml. Pourquoi n'injectez-vous pas \Magento\Framwork\Urldirectement?
Paul Dong
Principe de ségrégation d'interface, de SOLID
KAndy
@KAndy j'ai essayé cela .. mais je n'ai pas pu obtenir l'URL du produit .. :( veuillez poster le code complet ici .. J'essaie de faire une colonne dans la grille du produit avec le lien frontend du produit.
Ask Bytes
@KAndy, que signifie YouClass? nous devons faire n'importe quelle classe ici. Pourriez-vous, s'il vous plaît, la développer davantage afin que cette réponse puisse aider beaucoup d'autres comme moi?
Rutvee Sojitra
7

Je réponds à ma question. La réponse de mtns_cll à la question de Magento 2 obtenir l'URL de la boutique frontend pour un chemin dans l'administration fonctionne pour moi.

Je poste ma solution ici au cas où quelqu'un en aurait besoin:

frontend du produit :

injecter \Magento\Framework\Url $url

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

backend produit

injectez \Magento\Framework\UrlInterface $urlou utilisez l'interface url héritée de la classe parente.

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

frontend de catégorie

inject `\ Magento \ Framework \ Url $ url

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

backend de catégorie

injectez \Magento\Framework\UrlInterface $urlou utilisez l'interface url héritée de la classe parente.

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

frontal de page cms

injecter Magento\Cms\Block\Adminhtml\Page\Grid\Renderer\Action\UrlBuilder $rul

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

backend de page cms

injectez \Magento\Framework\UrlInterface $urlou utilisez l'interface url héritée de la classe parente.

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

cms block backend

injectez \Magento\Framework\UrlInterface $urlou utilisez l'interface url héritée de la classe parente.

$url->getUrl(BlockActions::URL_PATH_EDIT, ['block_id' => $blockId]);
Paul Dong
la source
1

Vous pouvez essayer d'utiliser Magento/Store/Model/StoreManager. Injectez-le dans un constructeur via Magento/Store/Model/StoreManagerInterface, plus ou moins comme ceci:

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

Vous devriez remarquer que la fonction getStore()comme argument peut prendre non seulement un entier, mais aussi une chaîne ou un objet:

/**
 * 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);
Bartosz Kubicki
la source
Ça ne marche pas pour moi. il renvoie l'url du backend, comme http: // <domaine> / admin / ....
Paul Dong