_MikeB
17. Februar 2021 um 13:44
1
Hi.
In SW gibt es 2 Sales Channels (SC). Die Produkte sind beiden SC zugewiesen. Wenn ich mich jetzt im SC1 bewege bräuchte ich den Link zum gleichen Produkt in SC2. Wie erreiche ich das? Welche Möglichkeiten gibt es hier? Vielleicht gibt es ja schon Methoden im Standard die ich aktuell noch nicht sehe. Die Produkt-URL habe ich aktuell mittels Query ermittelt aber wie komme ich an die „Base Url“ von SC2 damit ich das zusammenfügen kann?
Gruß Mike
_MikeB
17. Februar 2021 um 14:28
2
Ich habe es jetzt so gelöst. Vielleicht gibt es bessere Lösungen…
/**
* @param ProductEntity $productEntity
* @param string $salesChannelId
* @param SalesChannelContext $salesChannelContext
* @return string
*/
public function getProductSeoUrlForChannel(ProductEntity $productEntity, string $salesChannelId, SalesChannelContext $salesChannelContext)
{
$currentLang = $this->getCurrentLanguage($salesChannelContext); // helper methode zum bestimmen der aktuellen sprache
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('foreignKey', $productEntity->getId()));
$criteria->addFilter(new EqualsFilter('languageId', $currentLang->getId()));
$criteria->addFilter(new EqualsFilter('salesChannelId', $salesChannelId));
$criteria->addSorting(new FieldSorting('isCanonical', 'desc'));
/** @var SeoUrlEntity $seoUrl */
$seoUrl = $this->seoUrlRepository->search($criteria, Context::createDefaultContext())->getEntities()->first();
$salesChannel = $this->getSalesChannel($salesChannelId); // helper method um ziel SC zu laden
$domains = $salesChannel->getDomains()->filterByProperty('languageId', $currentLang->getId());
$channelBaseUrl = '';
/** @var SalesChannelDomainEntity $channelDomain */
foreach ($domains as $channelDomain)
{
$urls = $productEntity->getSeoUrls()->getElements();
foreach ($urls as $urlEntity) {
if ($urlEntity->getLanguageId() == $channelDomain->getLanguageId()) {
$channelBaseUrl = $channelDomain->getUrl();
}
}
}
return implode('/', [$channelBaseUrl,$seoUrl->getSeoPathInfo()]);
}