Pfiouuuuuuuuuuuuuuuuu!
Ce que j'ai pas dû faire.......
Code de vérification des valeurs :
$featureId = str_replace('feature:','',$field);
$featureValues = array();
$feature = FeatureQuery::create()
->findOneById($featureId);
if(null === $feature){
Tlog::getInstance()->addError($this->getTranslator()->trans('Feature id="%id" not found.', ['%id' => $featureId], ProductsSync::DOMAIN_NAME, $locale));
continue 2;
}
$featureAvs = FeatureAvQuery::create()
->filterByFeatureId($featureId)
->useFeatureProductQuery()
->filterByIsFreeText(false)
->_or()
->filterByIsFreeText(null)
->endUse()
->distinct()
->find();
if(null !== $featureAvs){
foreach($featureAvs as $featureAv){
$featureValues[] = $featureAv->getId();
}
if(count($featureValues) && $oldValue != ''){
if(!is_array($value)){
$value = explode(",",$value);
}
foreach($value as $val){
if(!in_array($val,$featureValues)){
Tlog::getInstance()->addError($this->getTranslator()->trans('Value for feature ID=%id must be in %values.', ['%id' => $featureId,'%values' => implode(', ',$featureValues)], 'productssync.bo.default', $locale));
continue 2;
}
}
}
}
Code de sauvegarde en BDD
$featureId = $dataFeatureProduct['id'];
$value = $dataFeatureProduct['value'];
$featureAvs = FeatureAvQuery::create()
->filterByFeatureId($featureId)
->useFeatureProductQuery()
->filterByIsFreeText(false)
->_or()
->filterByIsFreeText(null)
->endUse()
->distinct()
->find();
$featureValues = array();
if(null !== $featureAvs){
foreach($featureAvs as $featureAv){
$featureValues[] = $featureAv->getId();
}
}
if(count($featureValues)){
$featuresProduct = FeatureProductQuery::create()
->filterByProductId($productId)
->filterByFeatureId($featureId)
->find();
foreach($featuresProduct as $featureProduct){
$featureProduct->delete();
}
Tlog::getInstance()->info($this->getTranslator()->trans('All features av. for feature ID=%id deleted.', ['%id' => $featureId], ProductsSync::DOMAIN_NAME, $locale));
foreach($value as $val){
$featureProduct = new FeatureProduct();
$featureProduct->setProductId($productId)
->setFeatureId($featureId)
->setFeatureAvId($val)
->save();
Tlog::getInstance()->info($this->getTranslator()->trans('Feature av. ID=%val for feature ID=%id saved.', ['%id' => $featureId,'%val' => $val], ProductsSync::DOMAIN_NAME, $locale));
}
}else{
$featureProduct = FeatureProductQuery::create()
->filterByProductId($productId)
->findOneByFeatureId($featureId);
if(null !== $featureProduct){
$featureAvId = $featureProduct->getFeatureAvId();
$featureAv = FeatureAvQuery::create()
->findOneById($featureAvId);
if($value == ''){
$featureAv->delete();
Tlog::getInstance()->info($this->getTranslator()->trans('Free text feature av. ID="%value" for feature ID=%id deleted.', ['%id' => $featureId,'%value' => $featureAvId], ProductsSync::DOMAIN_NAME, $locale));
/*$featureProduct->delete(); // <===== inutile
Tlog::getInstance()->info($this->getTranslator()->trans('Feature product for feature ID=%id deleted.', ['%id' => $featureId], ProductsSync::DOMAIN_NAME, $locale));*/
}else{
if($findLocale && isset($dataProduct['locale'])){
$featureAv->setLocale($dataProduct['locale']);
}else{
$featureAv->setLocale($defaultLocale);
}
$featureAv->setTitle($value)
->save();
Tlog::getInstance()->info($this->getTranslator()->trans('Free Feature av. "%value" for feature ID=%id saved.', ['%id' => $featureId,'%value' => $value], ProductsSync::DOMAIN_NAME, $locale));
}
}else if($value != ''){
$featureAv = new FeatureAv();
$featureAv->setFeatureId($featureId);
if($findLocale && isset($dataProduct['locale'])){
$featureAv->setLocale($dataProduct['locale']);
}else{
$featureAv->setLocale($defaultLocale);
}
$featureAv->setTitle($value)
->save();
Tlog::getInstance()->info($this->getTranslator()->trans('Feature av. "%value" for feature ID=%id saved.', ['%id' => $featureId,'%value' => $value], ProductsSync::DOMAIN_NAME, $locale));
$featureProduct = new FeatureProduct();
$featureProduct->setProductId($productId)
->setFeatureId($featureId)
->setFeatureAvId($featureAv->getId())
->setIsFreeText(true)
->save();
Tlog::getInstance()->info($this->getTranslator()->trans('Feature product for feature av. ID=%val for feature ID=%id saved.', ['%id' => $featureId,'%val' => $featureAv->getId()], ProductsSync::DOMAIN_NAME, $locale));
}
}
ça a l'air de fonctionner... si quelqu'un peut jeter un oeil vite fait ça serait cool
Sinon peut-on me confirmer que
$featureProduct->delete();
est inutile si avant on lance un
(en sachant bien sûr que le feature_av_id correspond).