¿Cómo obtener la URL de la interfaz del producto desde el backend?

8

Estoy desarrollando una extensión de Magento 2. Necesito obtener la URL de la interfaz de un producto desde el backend. He intentado usar:

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

pero $urlsiempre devuelve una URL de back-end, como http://<domain>/admin/catalog/product..... pueden funcionar en Magento 1.x pero no para 2.x. ¿Hay alguna manera de obtener la URL de la interfaz?

Paul Dong
fuente
Puede enfrentar un problema similar al mío en magento.stackexchange.com/questions/138216/… - esto está totalmente roto en M2
Fabian Schmengler el

Respuestas:

6

Agregue una nueva dependencia de constructor a su clase 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);
 }

Y use DI para inyectar la dependencia correcta

<type name="YouClass"> 
    <arguments>
        <argument name="frontUrlModel" xsi:type="object" shared="false">Magento\Framework\Url</argument>
    </arguments>
</type>
Kandy
fuente
Gracias. Veo que inyectas UrlInterface y define la dependencia en Di.xml. ¿Por qué no inyectas \Magento\Framwork\Urldirectamente?
Paul Dong
Principio de segregación de interfaz, de SOLID
KAndy
@KAndy Intenté esto ... pero no pude obtener la URL del producto ... :( por favor publique el código completo aquí ... Estoy tratando de hacer una columna en la cuadrícula del producto con el enlace de la interfaz del producto.
Preguntar Bytes
@KAndy, ¿qué significa YouClass? Necesitamos hacer cualquier clase aquí. ¿Puedes por favor elaborarlo más para que esta respuesta pueda ayudar a muchos otros como yo?
Rutvee Sojitra
7

Respondo mi pregunta La respuesta de mtns_cll a la pregunta de Magento 2 obtiene la URL de la tienda frontend para que una ruta en admin funcione para mí.

Publico mi solución aquí en caso de que alguien la necesite:

interfaz de producto :

inyectar \Magento\Framework\Url $url

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

producto backend

inyecta \Magento\Framework\UrlInterface $urlo usa la interfaz url heredada de la clase padre.

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

interfaz de categoría

inyectar `\ Magento \ Framework \ Url $ url

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

categoría backend

inyecta \Magento\Framework\UrlInterface $urlo usa la interfaz url heredada de la clase padre.

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

interfaz de la página de cms

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

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

backend de página de cms

inyecta \Magento\Framework\UrlInterface $urlo usa la interfaz url heredada de la clase padre.

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

bloque de cms backend

inyecta \Magento\Framework\UrlInterface $urlo usa la interfaz url heredada de la clase padre.

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

Puedes intentar usarlo Magento/Store/Model/StoreManager. Inyecte en un constructor a través de Magento/Store/Model/StoreManagerInterface, más o menos así:

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

Debes notar que la función getStore()como argumento puede tomar no solo un entero, sino también una cadena u 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
fuente
A mi no me funciona. devuelve la URL del backend, como http: // <dominio> / admin / ....
Paul Dong