¿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?


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>

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]);

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

A mi no me funciona. devuelve la URL del backend, como http: // <dominio> / admin / ....
Paul Dong
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.