Como obter o URL de front-end do produto no back-end?

8

Estou desenvolvendo uma extensão do Magento 2. Preciso obter o URL de front-end de um produto no back-end. Eu tentei usar:

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

mas $urlsempre retornam um URL de back-end, como http://<domain>/admin/catalog/product..... eles podem funcionar no Magento 1.x, mas não no 2.x. Existe alguma maneira de obter o URL de front-end?

Paul Dong
fonte
Você pode enfrentar um problema semelhante como eu em magento.stackexchange.com/questions/138216/... - Isso é totalmente quebrado em M2
Fabian Schmengler

Respostas:

6

Adicione nova dependência de construtor à sua 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 use DI para injetar dependência correta

<type name="YouClass"> 
    <arguments>
        <argument name="frontUrlModel" xsi:type="object" shared="false">Magento\Framework\Url</argument>
    </arguments>
</type>
KAndy
fonte
obrigado. Vejo você injetar UrlInterface e definir dependência em Di.xml. Por que você não injeta \Magento\Framwork\Urldiretamente?
Paul Dong
Princípio de segregação de interface, do SOLID
KAndy 2/16
@KAndy eu tentei isso .. mas não foi possível obter o URL do produto .. :( por favor poste o código completo aqui .. Estou tentando criar uma coluna na grade do produto com o link de front-end do produto.
Ask Bytes
@KAndy, o que é o YouClass? precisamos fazer qualquer aula aqui. Você pode agradar mais elaborá-la assim que esta resposta pode ajudar muitos outros como eu
Rutvee Sojitra
7

Eu respondo minha pergunta. A resposta do mtns_cll à questão do Magento 2 get url da loja de front-end para um caminho no admin funciona para mim.

Postei minha solução aqui, caso alguém precise:

front - end do produto :

injetar \Magento\Framework\Url $url

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

back-end do produto

injetar \Magento\Framework\UrlInterface $urlou usar a interface de URL herdada da classe pai.

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

front-end da categoria

injete `\ Magento \ Framework \ Url $ url

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

categoria de back-end

injetar \Magento\Framework\UrlInterface $urlou usar a interface de URL herdada da classe pai.

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

front-end da página cms

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

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

back-end da página cms

injetar \Magento\Framework\UrlInterface $urlou usar a interface de URL herdada da classe pai.

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

back-end do bloco cms

injetar \Magento\Framework\UrlInterface $urlou usar a interface de URL herdada da classe pai.

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

Você pode tentar usar Magento/Store/Model/StoreManager. Injete-o em um construtor via Magento/Store/Model/StoreManagerInterface, mais ou menos assim:

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

Você deve observar que a função getStore()como argumento pode ter não apenas número inteiro, mas também string ou objeto:

/**
 * 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
fonte
Isso não funciona para mim. ele retorna o URL de back-end, como http: // <domínio> / admin / .... #
9131 Paul Dong