Come ottenere l'URL frontend del prodotto dal backend?


8

Sto sviluppando un'estensione di Magento 2. Devo ottenere l'URL frontend di un prodotto dal backend. Ho provato ad usare:

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

ma $urlrestituiscono sempre un URL back-end, come http://<domain>/admin/catalog/product..... possono funzionare in Magento 1.x ma non per 2.x. C'è un modo per ottenere l'URL frontend?


Potresti affrontare un problema simile a me in magento.stackexchange.com/questions/138216/… - questo è totalmente rotto in M2
Fabian Schmengler

Risposte:


6

Aggiungi nuova dipendenza costruttore alla tua 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);
 }

E usa DI per iniettare la giusta dipendenza

<type name="YouClass"> 
    <arguments>
        <argument name="frontUrlModel" xsi:type="object" shared="false">Magento\Framework\Url</argument>
    </arguments>
</type>

Grazie. Ti vedo iniettare UrlInterface e definire la dipendenza in Di.xml. Perché non iniettare \Magento\Framwork\Urldirettamente?
Paul Dong,

Principio di segregazione dell'interfaccia, da SOLID
KAndy

@KAndy ci avevo provato .. ma non sono riuscito a ottenere l'URL del prodotto .. :( inserisci qui il codice completo .. Sto cercando di creare una colonna nella griglia del prodotto con il link frontend del prodotto.
Chiedi byte

@KAndy cosa significa YouClass? dobbiamo fare qualsiasi lezione qui. Puoi per favore elaborarlo più in modo che questa risposta possa aiutare molti altri come me
Rutvee Sojitra,

7

Rispondo alla mia domanda. La risposta di mtns_cll alla domanda di Magento 2 ottiene l'URL del negozio frontend per un percorso in admin funziona per me.

Pubblico qui la mia soluzione nel caso qualcuno ne avesse bisogno:

frontend del prodotto :

iniettare \Magento\Framework\Url $url

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

backend del prodotto

iniettare \Magento\Framework\UrlInterface $urlo utilizzare l'interfaccia url ereditata dalla classe genitore.

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

frontend di categoria

iniettare `\ Magento \ Framework \ Url $ url

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

backend di categoria

iniettare \Magento\Framework\UrlInterface $urlo utilizzare l'interfaccia url ereditata dalla classe genitore.

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

frontend della pagina cms

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

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

backend della pagina cms

iniettare \Magento\Framework\UrlInterface $urlo utilizzare l'interfaccia url ereditata dalla classe genitore.

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

blocco cms backend

iniettare \Magento\Framework\UrlInterface $urlo utilizzare l'interfaccia url ereditata dalla classe genitore.

$url->getUrl(BlockActions::URL_PATH_EDIT, ['block_id' => $blockId]);

1

Puoi provare a usare Magento/Store/Model/StoreManager. Iniettalo in un costruttore tramite Magento/Store/Model/StoreManagerInterface, più o meno in questo modo:

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

Dovresti notare che la funzione getStore()come argomento può richiedere non solo numeri interi, ma anche stringhe o oggetti:

/**
 * 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);

Non funziona per me. restituisce l'URL back-end, come http: // <dominio> / admin / ....
Paul Dong
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.