Wie erhalte ich die Frontend-URL des Produkts vom Backend?

8

Ich entwickle eine Erweiterung von Magento 2. Ich muss die Frontend-URL eines Produkts vom Backend abrufen. Ich habe versucht zu verwenden:

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

aber die geben $urlimmer eine backend url zurück, wie http://<domain>/admin/catalog/product..... Sie funktionieren möglicherweise in Magento 1.x, jedoch nicht in 2.x. Gibt es eine Möglichkeit, eine Frontend-URL zu erhalten?

Paul Dong
quelle
Möglicherweise haben Sie ein ähnliches Problem wie ich in magento.stackexchange.com/questions/138216/… - dies ist in M2 völlig kaputt
Fabian Schmengler

Antworten:

6

Fügen Sie Ihrer Klasse forntUrlModel eine neue Konstruktorabhängigkeit hinzu:

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

Und verwenden Sie DI, um die richtige Abhängigkeit einzufügen

<type name="YouClass"> 
    <arguments>
        <argument name="frontUrlModel" xsi:type="object" shared="false">Magento\Framework\Url</argument>
    </arguments>
</type>
KAndy
quelle
Vielen Dank. Ich sehe, dass Sie UrlInterface injizieren und die Abhängigkeit in Di.xml definieren. Warum spritzt du nicht \Magento\Framwork\Urldirekt?
Paul Dong
Prinzip der Schnittstellentrennung, von SOLID
KAndy
@KAndy Ich hatte dies versucht .. aber nicht in der Lage, die Produkt-URL zu erhalten .. :( Bitte posten Sie den vollständigen Code hier .. Ich versuche, eine Spalte im Produktraster mit Produkt-Frontend-Link zu erstellen.
Ask Bytes
@KAndy was bedeutet die YouClass? Wir müssen hier jede Klasse machen. Können Sie es bitte näher erläutern, damit diese Antwort vielen anderen wie mir helfen kann
Rutvee Sojitra
7

Ich beantworte meine Frage. Die Antwort von mtns_cll auf die Frage, ob Magento 2 die Frontend-Store-URL für einen Pfad in admin erhält, funktioniert für mich.

Ich poste meine Lösung hier, falls jemand sie braucht:

Produkt-Frontend :

injizieren \Magento\Framework\Url $url

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

Produkt-Backend

Injizieren \Magento\Framework\UrlInterface $urloder Verwenden der von der übergeordneten Klasse geerbten URL-Schnittstelle.

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

Kategorie Frontend

injizieren Sie \ Magento \ Framework \ Url $ url

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

Kategorie Backend

Injizieren \Magento\Framework\UrlInterface $urloder Verwenden der von der übergeordneten Klasse geerbten URL-Schnittstelle.

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

CMS-Seiten-Frontend

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

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

CMS-Seiten-Backend

Injizieren \Magento\Framework\UrlInterface $urloder Verwenden der von der übergeordneten Klasse geerbten URL-Schnittstelle.

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

cms block backend

Injizieren \Magento\Framework\UrlInterface $urloder Verwenden der von der übergeordneten Klasse geerbten URL-Schnittstelle.

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

Sie können versuchen, zu verwenden Magento/Store/Model/StoreManager. Injizieren Sie es über Magento/Store/Model/StoreManagerInterfacemehr oder weniger folgendermaßen in einen Konstruktor :

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

Sie sollten beachten, dass die Funktion getStore()als Argument nicht nur eine Ganzzahl, sondern auch eine Zeichenfolge oder ein Objekt annehmen kann:

/**
 * 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
quelle
Es funktioniert nicht bei mir. es gibt Backend-URL zurück, wie http: // <domain> / admin / ....
Paul Dong