Je suis confronté à ce problème lors de l'enregistrement d'un produit par programmation sur Magento 2.2.5
Dans n'importe quel module, si je fais $ product-> save ();
OU $ this-> productRepository-> save ($ product);
dans une boucle pour plusieurs produits. J'obtiens:
PDOException: SQLSTATE [23000]: Violation de contrainte d'intégrité: 1062 Entrée en double 'the-lipstick.html-1' pour la clé 'URL_REWRITE_REQUEST_PATH_STORE_ID' dans / home / dev3 / www / vendor / magento / zendframework1 / library / Zend / Db / Statement / Pdo.php: 228
L'erreur est similaire à celle décrite ici: https://www.human-element.com/url-key-specified-store-already-exists-magento-2/
Les produits enregistrent bien avec la connexion à la zone d'administration.
Les correctifs suggérés jusqu'à présent, y compris ceux modifiant les fichiers principaux (DBStorage.php) ne fonctionnent pas sur la version 2.2.5.
Ce que j'ai essayé jusqu'à présent: 1. Correction de https: // www .human-element.com / url-key-specified-store-already-exists-magento-2 / 2. Correction de https://magento.stackexchange.com/questions/210359/ magento-2-product-url-rewrite-issue
Veuillez suggérer une solution / un correctif pour M 2.2.5
3 Réponses :
Après une migration et une semaine à creuser le problème, la seule chose qui a fonctionné pour moi était https://www.safemage.com/url-optimization-after-migration-magento-2.html
J'ai dû passer à la version 2.2.7 pour l'utiliser. Il dit que cela fonctionne sur la version 2.3, mais ce n'est pas le cas.
Après avoir cherché sur Internet pendant des jours, je ne trouve pas de solution exacte à ce problème. Ensuite, j'ai trouvé que si nous modifions l'URLKEY de la catégorie, cette erreur ne s'affichera pas, alors je l'ai fait.
$category->setPath($parentCategory->getPath()) ->setParentId($parentId) ->setName('test1') ->setIsActive(true) ->setUrlKey(rand(1,1000000000)); $category->save();
J'utilise la fonction aléatoire pour ajouter une catégorie dans la base de données sans aléatoire en utilisant ->setUrlKey(rand(1,1000000000)); vous pouvez ajouter n'importe quoi dans ce nom de catégorie en double avec un non aléatoire, etc. et les erreurs disparaissent si cela vous aide à abandonner. merci
Salut Ghulam.M, où avez-vous effectué ce changement? Je reçois une erreur similaire lors de l'enregistrement de l'attribution de produits à des catégories dans la page de catégorie et je pense que cela peut être la réponse. Violation de contrainte unique trouvée {"exception": "[object] (Magento \ Framework \ Exception \ DéjàExistsException (code: 0): Violation de contrainte unique trouvée à /chroot/home/a60ed167/soupandsaladbars.com/vendor/magento/fr amework / EntityManage r / Operation / Update.p hp: 121, Magento \ Framework \ DB \ Adapter \ DuplicateException (code: 1062): SQLSTATE [23000]: Violation de contrainte d'intégrité: 1062 Entrée en double
Voici l'erreur exacte: techutils.in/blog/tag/serializer Il y a une intégrité violation de contrainte, suivie de cette exception: l'argument 1 passé à Magento \ Catalog \ Model \ Category \ FileInfo :: removeStorePath () doit être du type string, array donné, appelé dans / vendor / magento / module-catalog / Model / Category /FileInfo.php en ligne 167
Bonjour @ComputerGiant, je l'ai fait il y a quelque temps lors de la création d'une catégorie ... pour votre erreur, je vous recommande de publier une question sur magento.stackexchange.com < / a>
Ma solution: Dans di.xml -
Dans ProductFixUrl, écrivez ces deux fonctions:
protected function doReplace(array $urls){ $this->deleteOld($urls); $data = []; $storeId_requestPaths = []; foreach ($urls as $url) { $storeId = $url->getStoreId(); $requestPath = $url->getRequestPath(); // Skip if is exist in the database $sql = "SELECT * FROM url_rewrite where store_id = $storeId and request_path = '$requestPath'"; $exists = $this->connection->fetchOne($sql); if ($exists) { continue; } $storeId_requestPaths[] = $storeId . '-' . $requestPath; $data[] = $url->toArray(); } try { $n = count($storeId_requestPaths); for ($i = 0; $i < $n - 1; $i++) { for ($j = $i + 1; $j < $n; $j++) { if ($storeId_requestPaths[$i] == $storeId_requestPaths[$j]) { unset($data[$j]); } } } parent::insertMultiple($data); } catch (\Magento\Framework\Exception\AlreadyExistsException $e) { /** @var \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[] $urlConflicted */ $urlConflicted = []; foreach ($urls as $url) { $urlFound = parent::doFindOneByData( [ UrlRewriteData::REQUEST_PATH => $url->getRequestPath(), UrlRewriteData::STORE_ID => $url->getStoreId(), ] ); if (isset($urlFound[UrlRewriteData::URL_REWRITE_ID])) { $urlConflicted[$urlFound[UrlRewriteData::URL_REWRITE_ID]] = $url->toArray(); } } if ($urlConflicted) { throw new \Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException( __('URL key for specified store already exists.'), $e, $e->getCode(), $urlConflicted ); } else { throw $e->getPrevious() ?: $e; } } return $urls; } /** * @param UrlRewrite[] $urls * * @return void */ public function deleteOld(array $urls) { $oldUrlsSelect = $this->connection->select(); $oldUrlsSelect->from( $this->resource->getTableName(self::TABLE_NAME) ); /** @var UrlRewrite $url */ foreach ($urls as $url) { $oldUrlsSelect->orWhere( $this->connection->quoteIdentifier( UrlRewrite::ENTITY_TYPE ) . ' = ?', $url->getEntityType() ); $oldUrlsSelect->where( $this->connection->quoteIdentifier( UrlRewrite::ENTITY_ID ) . ' = ?', $url->getEntityId() ); $oldUrlsSelect->where( $this->connection->quoteIdentifier( UrlRewrite::STORE_ID ) . ' = ?', $url->getStoreId() ); } // prevent query locking in a case when nothing to delete $checkOldUrlsSelect = clone $oldUrlsSelect; $checkOldUrlsSelect->reset(Select::COLUMNS); $checkOldUrlsSelect->columns('count(*)'); $hasOldUrls = (bool) $this->connection->fetchOne($checkOldUrlsSelect); if ($hasOldUrls) { $this->connection->query( $oldUrlsSelect->deleteFromSelect( $this->resource->getTableName(self::TABLE_NAME) ) ); } }
Nous avons constaté que le
url_key
contenant un caractère majuscule lors de son enregistrement initial pouvait en être la cause. Magento affiche leurl_key
en minuscules, mais la base de données contient des caractères majuscules. Magento pense alors que la réécriture n'existe pas et essaie de l'ajouter à nouveau avec un boîtier différent.