Was läuft hier schief? Es würde ja schon sehr helfen, wenn ich mehr Infos zu dem 500er bekäme!
Hat jemand ein funktionierendes Beispiel, wie man ein über den Cronjob hochgeladenes Bild einem Artikel zuordnen kann und/oder weiß wie man mehr Informationen zu dem 500er erhalten kann?
In der Regel werden 500er Fehler im PHP-Log des Servers geschrieben. Hierzu kann keiner antworten, weil es alles mögliche sein kann. Da musst du leider selber aktiv werden:
Fehlermeldungen in error_log auf Server untersuchen (mögliche PHP-Fehler)
Bitte nicht mit Shopware Log verwechseln. Liegt meist außerhalb vom httpdocs-Order der Domain - ggf. beim Hoster anfragen.
Vielen Dank für deine Antwort - ich bin zwar ein Stück weitergekommen - aber letztendlich scheitere ich immer noch an der Zuordnung des neuen Bildes zum Artikel.
Mit Hilfe des Providers konnte ich mir den Fehler ausgeben lassen und das Problem lag daran, das
getOne()
standardmäßig ein Array zurückliefert, ich aber ein Object benötigt habe.
Mein Code sieht jetzt wie folgt aus und läuft soweit fehlerfrei durch - neu ist die 2 Zeile, damit $articleResource ein Objekt ist:
Er legt das Bild dann einwandfrei im Album ab. Aber anscheinend funktioniert die Methode createNewArticleImage so nicht!?
Fehlermeldung erhalte ich keine, das Skript terminiert sauber. Muss ich hier etwas manuell persistieren?
Ist es so ungewöhnlich Bilder zu den Artikeln per Cron hochzuladen/zu aktualisieren? Ich finde nirgends eine Beispiel für die interne API. Wäre es besser auf die REST API zurückzugreifen?
Freue mich über Ideen, Anregungen, Beispiele, … was auch immer ihr habt
der Bilder-Import und die Zuordnung zum Artikel funktioniert bei mir mit der Shopware API. Die Zuordnung und der Import der Bilder erfolgt direkt mit der API-Artikel und nicht über die API-Media.
Vielen Dank. Aber welche API Methode verwendest du?
Habe gerade nochmal durch engine/Shopware/Components/Api/Resource/Article.php geschaut. Für mich sinnig wäre eben
createNewArticleImage
diese erwartet aber ein Media Objekt:
/\*\* \* Helper function which creates a new article image with the passed media object. \* \* @param ArticleModel $article \* @param MediaModel $media \* \* @return Image \*/ public function createNewArticleImage(ArticleModel $article, MediaModel $media)
Die Lösung aus dem Beitrag zeigt auch, wie man ein bereits importiertes Bild (MediaID vorhanden) mit einem Artikel verknüpft. Das sieht dann halt ein wenig anders aus.
Danke aber das ist ja dann doch die REST API - ich wollte es ja mittels der lokalen API lösen.
Ob das jetzt effektiver ist als die REST API weiß ich auch nicht
Falle es jemanden interessiert, hier meine Lösung :
$filename = basename($oXML->BILD_B);
$path_parts = pathinfo($filename);
$articleManager = \Shopware\Components\Api\Manager::getResource('Article');
$articleManager->setResultMode(\Shopware\Components\Api\Resource\Resource::HYDRATE_OBJECT);
/** @var \Shopware\Models\Article\Article $articleResource */
$articleResource = $articleManager->getOne($article['articleID']);
$newFileName = $this->slugify($articleResource->getSupplier()->getName() . ' ' . $articleResource->getName()).'.'.$path_parts['extension'];
$sql = 'SELECT id FROM s_media WHERE path = "media/image/'.$newFileName.'"';
$mediaid = Shopware()->Db()->fetchOne($sql);
if ($mediaid > 1) {
$mediares = \Shopware\Components\Api\Manager::getResource('Media');
$mediares->update($mediaid, [
'file' => 'h t t p s : / / drittanbieter.tld'.$oXML->BILD_B
]);
} else {
/** @var \Shopware\Models\Media\Album $album */
$album = Shopware()->Models()->find('Shopware\Models\Media\Album', 2);
//create a new model and set the properties
$media = new \Shopware\Models\Media\Media();
$media->setAlbum($album);
$media->setDescription('');
$media->setCreated(new DateTime());
$media->setUserId(0);
$path = Shopware()->DocPath() . 'tmp';
if (!file_exists($path)) {
mkdir($path);
}
file_put_contents($path.'/'.$newFileName, file_get_contents('h t t p s : / / drittanbieter.tld'.$oXML->BILD_B));
$fileObject = new \Symfony\Component\HttpFoundation\File\File($path.'/'.$newFileName);
$media->setFile($fileObject);
Shopware()->Models()->persist($media);
Shopware()->Models()->flush();
$builder = Shopware()->Models()->createQueryBuilder();
$data = $builder->select(array('media'))
->from('Shopware\Models\Media\Media', 'media')
->where('media.id = ?1')
->setParameter(1, $media->getId())->getQuery()->getArrayResult();
if ($media->getType() === \Shopware\Models\Media\Media::TYPE_IMAGE) {
$manager = Shopware()->Container()->get('thumbnail_manager');
$manager->createMediaThumbnail($media, array(), true);
}
unlink($path.'/'.$newFileName);
$repository = Shopware()->Models()->getRepository('Shopware\Models\Article\Detail');
/** @var Detail $articleDetail */
$articleDetail = $repository->findOneBy(['articleId' => $article['articleID']]);
if ($articleDetail) {
$articleobj = $articleDetail->getArticle();
/** @var \Shopware\Models\Article\Image $articleImage */
$articleImage = new \Shopware\Models\Article\Image();
$articleImage->setArticle($articleobj);
$articleImage->setPath($media->getName());
$articleImage->setExtension($media->getExtension());
$detailImage = new \Shopware\Models\Article\Image();
$detailImage->setArticleDetail($articleDetail);
$detailImage->setParent($articleImage);
$detailImage->setPosition(0);
$articleImage->setMain(2);
$articleImage->setDescription($articleobj->getSupplier()->getName() . ' ' . $articleobj->getName() . ' ' . $articleDetail->getNumber() );
$oldImages = $articleobj->getImages();
foreach ($oldImages as $tmp) {
$tmp->setMain(2);
}
$articleImage->setMain(1);
$articleImage->setPosition(0);
$articleImage->setMedia($media);
$media->setAlbum($album);
Shopware()->Models()->persist($articleImage);
Shopware()->Models()->flush();
$articleImages = $articleobj->getImages();
$articleImages->add($articleImage);
$articleobj->setImages($articleImages);
Shopware()->Models()->persist($articleobj);
Shopware()->Models()->persist($media);
Shopware()->Models()->flush();
}
}
Ich hole mir vorher alle Artikel und laufe dann Artikel für Artikel durch. Anhand der EAN des Artikels hole ich mir vom Drittanbieter das Bild (ich bekomme die URL über ein XML:
$oXML-\>BILD\_B
Vielleicht hilft es jemanden weiter. Keine Ahnung ob das so der “geschickteste” Weg ist - aber nach ersten Test scheint es so zuverlässig zu funktionieren. Ist das Bild noch nicht da wird es in Shopware “eingefügt” und dem Artikel als erstes Bild zugeordnet. Ist das Bild schon in Shopware wird es lediglich ersetzt…