Bagaimana cara mendapatkan url frontend produk dari backend?

8

Saya mengembangkan ekstensi Magento 2. Saya perlu mendapatkan url frontend produk dari backend. Saya sudah mencoba menggunakan:

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

tetapi $urlselalu mengembalikan url backend, seperti http://<domain>/admin/catalog/product..... mereka dapat bekerja di Magento 1.x tetapi tidak untuk 2.x. Apakah ada cara untuk mendapatkan URL frontend?

Paul Dong
sumber
Anda mungkin menghadapi masalah yang sama seperti saya di magento.stackexchange.com/questions/138216/... - ini benar-benar rusak di M2
Fabian Schmengler

Jawaban:

6

Tambahkan dependensi konstruktor baru ke kelas Anda untukntUrlModel:

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

Dan gunakan DI untuk menyuntikkan ketergantungan yang benar

<type name="YouClass"> 
    <arguments>
        <argument name="frontUrlModel" xsi:type="object" shared="false">Magento\Framework\Url</argument>
    </arguments>
</type>
KAndy
sumber
Terima kasih. Saya melihat Anda menyuntikkan UrlInterface dan menentukan ketergantungan di Di.xml. Mengapa Anda tidak menyuntikkan \Magento\Framwork\Urlsecara langsung?
Paul Dong
Prinsip pemisahan antarmuka, dari SOLID
KAndy
@KAndy saya sudah mencoba ini .. tetapi tidak bisa mendapatkan url produk .. :( tolong kirim kode lengkap di sini .. Saya mencoba membuat kolom di kisi-kisi produk dengan tautan muka produk.
Ask Bytes
@KAndy apa arti YouClass? kita perlu membuat kelas di sini. Bisakah Anda menjelaskan lebih lanjut sehingga jawaban ini dapat membantu banyak orang lain seperti saya
Rutvee Sojitra
7

Saya menjawab pertanyaan saya. mtns_cll menjawab pertanyaan Magento 2 dapatkan frontend store url untuk path di admin berfungsi untuk saya.

Saya memposting solusi saya di sini jika seseorang membutuhkannya:

frontend produk :

menyuntikkan \Magento\Framework\Url $url

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

backend produk

menyuntikkan \Magento\Framework\UrlInterface $urlatau menggunakan antarmuka url yang diwarisi dari kelas induk.

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

frontend kategori

menyuntikkan `\ Magento \ Framework \ Url $ url

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

backend kategori

menyuntikkan \Magento\Framework\UrlInterface $urlatau menggunakan antarmuka url yang diwarisi dari kelas induk.

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

frontend halaman cms

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

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

backend halaman cms

menyuntikkan \Magento\Framework\UrlInterface $urlatau menggunakan antarmuka url yang diwarisi dari kelas induk.

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

cms memblokir backend

menyuntikkan \Magento\Framework\UrlInterface $urlatau menggunakan antarmuka url yang diwarisi dari kelas induk.

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

Anda dapat mencoba menggunakannya Magento/Store/Model/StoreManager. Suntikkan ke konstruktor melalui Magento/Store/Model/StoreManagerInterface, kurang lebih seperti ini:

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

Anda harus memperhatikan bahwa fungsi getStore()sebagai argumen tidak hanya dapat mengambil integer, tetapi juga string atau objek:

/**
 * 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
sumber
Itu tidak bekerja untuk saya. ia mengembalikan url backend, seperti http: // <domain> / admin / ....
Paul Dong