THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour la communauté,

Lorsque je fais un import dans Thelia 2, mes déclinaisons tailles et couleurs se retrouvent mélangées dans un champ options.
Lorsque je crée un fiche produit avec un gabarit, j'ai bien une déclinaison taille et une déclinaison couleur séparées.
Sur le thelia 1 elles sont bien séparées en déclinaisons tailles et couleurs.
C'est la génération des combinaisons qui ne s'est pas faite.
Une idée? (Je n'ai pas envie de me retaper 370 produit à la main).

Petite question?
Lors de l'importation est-ce qu'il est fait appel au générateur de combinaisons?

Autre petite question:
Les relations entre les tables pour générer les combinaisons produits?
Je voudrais repartir de ma table produit pour générer les combinaisons en ne gardant que la table product et en faisant une copie des autres tables
J'ai réussi à le faire mais quand je reviens dans le catalogue il n'y a aucun produit dans aucune catégorie.

Je prends la table
product

Je fais une sauvegarde des 3 suivantes avec les clés liées.
product_sale_elements -> product_sale_elements_save
product_price -> product_price_save
attribute combination -> attribute combination_save

Je vide ensuite les 3 tables originelles.
Puis je génère toutes les combinaisons.


Un script php fonctionnel fait à l'arrache.

<?php
set_time_limit(0);
$link = mysqli_connect('localhost', 'user, 'pass', 'database');
if (!$link) {
    die('Erreur de connexion (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}

if ($result = mysqli_query($link, "SELECT DATABASE()")) {
    $row = mysqli_fetch_row($result);
    printf("La base de données courante est %s.<br />\n", $row[0]);
    mysqli_free_result($result);
}

if(!$_GET["page"]){
$page = 1;
}else{
$page = $_GET["page"];
}
$next = $page+1;

/**Faire une copie des tables et vider les tables courantes*/
//require("copy_truncate_product_tables.php");

/**Restaurer les tables produits*/
//require("dump_product_tables.php");

/**Prendre les ID, REF des produits et vérifier s'ils peuvent être déclinés*/
$ta=0; // Nb de tailles
$co=0; // Nb de couleurs
$prodsalelist = array();
$products = array();

//$request = mysqli_query($link, "SELECT `id`,`ref` FROM `product` ORDER BY `id` ASC"); //WHERE ref='SJOLER'
$request = mysqli_query($link, "SELECT `id`,`ref` FROM `product_save` WHERE `ref` NOT LIKE 'CADEAU%' ORDER BY `id` ASC LIMIT 1");
if(mysqli_num_rows($request) === 0){
    echo "FINISH";
    exit();
}
while($row = mysqli_fetch_array($request)){
    echo "<h4>id produit: ".$row[0]." ref: ".$row[1]."</h4>";
    $requesta = mysqli_query($link, "SELECT * FROM `product_sale_elements_save` WHERE `product_id`='".$row[0]."'") or die("erreur");
    while($rowa = mysqli_fetch_array($requesta)){
        //echo $rowa[0]."<br />";       
        $prodsalelist[] = array($rowa[0]);   
    }

    foreach($prodsalelist as $prodlist){
        //echo $prodlist[0]."<br />";
        $requestb = mysqli_query($link, "SELECT `attribute_id` FROM `attribute_combination_save` WHERE `product_sale_elements_id`='".$prodlist[0]."'");
        while($rowb = mysqli_fetch_array($requestb)){
        //echo $rowb[0]."<br />";
       
            if($rowb[0] == 1){ //taille id=1
                $ta++;
            }else{       
                $co++;
            }   
        }   
        mysqli_free_result($requestb);       
    }

    echo $ta." tailles<br />";
    echo $co." couleurs<br />";
    /**Vérification déclinable tailles * couleurs*/
    $gencomb = $ta*$co;
    $decli = $gencomb*2;
    echo $gencomb." product_sale_elements - ".$gencomb." product_price - ".$decli." attribute_combination";
    if($ta !== 0 && $co !== 0){
        //array_push($products, array($row[0], $row[1]));
        $products[] = array($row[0], $row[1]);               
    }else{
        mysqli_query($link, "DELETE FROM `product_save` WHERE `id`='".$row[0]."'");   
        ?>
        <script>
        setTimeout(function(){
        document.location='produits.php?page=<?php echo $next; ?>';
        }, 1500);
        </script>
        <?php
        exit();
    }
}
mysqli_free_result($request);

mysqli_query($link, "DELETE FROM `product_save` WHERE `id`='".$products[0][0]."'");
echo "<br />DELETE: ".$products[0][0];
//exit();


foreach($products as $product){
$i=1;
$ta=0;
$co=0;
$product_attribute = array();
    $requesta = mysqli_query($link, "SELECT `id`,`newness`,`weight` FROM `product_sale_elements_save` WHERE `ref`='".$product[1]."'");
    while($rowa = mysqli_fetch_array($requesta)){
            $new = $rowa[1];       
            $weight = $rowa[2];
            //echo "<h4>id product_sale_elements: ".$rowa[0]."</h4>";
            $requestb = mysqli_query($link, "SELECT * FROM `attribute_combination_save` WHERE `product_sale_elements_id`='".$rowa[0]."'");
            $rowb = mysqli_fetch_row($requestb);
            $product_attribute[] = array($rowb[0], $rowb[1]);
            //echo $rowb[0]."<br />";
            if($rowb[0] == 1){
                $ta += 1;
            }else{
                $co += 1;
            }
            mysqli_free_result($requestb);
           
            /** Récupération du prix*/
            $requestc = mysqli_query($link, "SELECT `price` FROM `product_price_save` WHERE `product_sale_elements_id`='".$rowa[0]."' LIMIT 1");
            $rowc = mysqli_fetch_row($requestc);
            $price = $rowc[0];
            mysqli_free_result($requestc);
    }
    echo "<br />genecombinaison ";
    echo $gencomb = $ta*$co;
    echo "<br />decli ";
    echo $decli = $gencomb*2;
    echo "<br />";
    for($k=1;$k<=$gencomb;$k++){
        /** Génération des product_price*/
        $requestlast = mysqli_query($link, "SELECT * FROM `product_sale_elements` ORDER BY `id` DESC LIMIT 1");
        $rowlast = mysqli_fetch_row($requestlast);
        if(mysqli_num_rows($requestlast) === 0){
        $newid = 1;   
        }else{
        $newid = ($rowlast[0]+1);
        }
        mysqli_free_result($requestlast);
        echo "ID:".$newid."<br />";
        echo "PRIX: ".$price."<br/>";       
        mysqli_query($link, "INSERT IGNORE INTO `product_price` (product_sale_elements_id, currency_id, price, promo_price, from_default_currency, created_at, updated_at) VALUES ('".$newid."',
        1,
        '".$price."',
        '0.000000',
        '',
        '".date("Y-m-d H:i:s")."',
        '".date("Y-m-d H:i:s")."'
        )") or die("erreur price");   
       
        /** Génération des product_sale_elements*/       
        mysqli_query($link, "INSERT IGNORE INTO `product_sale_elements` (id,product_id,ref,quantity,promo,newness,weight,is_default,ean_code,created_at,updated_at) VALUES ('".$newid."',
        '".$product[0]."',
        '".$product[1]."',
        10000,
        0,
        '".$new."',
        '".$weight."',
        0,
        '',
        '".date("Y-m-d H:i:s")."',
        '".date("Y-m-d H:i:s")."'
        )") or die("erreur sale");
    }
   
    $i++;
    mysqli_free_result($requesta);

    //var_dump($product_attribute);
    /** Prendre le premier id de sale element*/
    $requestd = mysqli_query($link, "SELECT `id` FROM `product_sale_elements` WHERE `ref`='".$product[1]."' ORDER BY `id` ASC LIMIT 1");
    $rowd = mysqli_fetch_row($requestd);
    mysqli_query($link, "UPDATE `product_sale_elements` SET `is_default`=1 WHERE `id`='".$rowd[0]."'");
    $prosalelems = $rowd[0];
    mysqli_free_result($requestd);
    //var_dump($prosalelem);

    /**Trier le tableau taille/taille, couleur/couleur*/
    $size = array();
    $color = array();
    foreach($product_attribute as $prodattr){
        if($prodattr[0] == 1 ){
            $size[] = array($prodattr[0],$prodattr[1]);
        }else{
            $color[] = array($prodattr[0],$prodattr[1]);
        }
    }
    //var_dump($size);
    //var_dump($color);
    /*generer la combinaison de toutes les déclinaisons*/
    $l=1;
    $m=1;
    foreach($size as $prodsize){
        foreach($color as $prodcolor){
            //echo "<h4>taille</h4>";
            //echo $prodsize[0]." - ".$prodsize[1]." - ".$prosalelems."<br />";

            mysqli_query($link, "INSERT IGNORE INTO `attribute_combination` (attribute_id, attribute_av_id, product_sale_elements_id, position, created_at, updated_at) VALUES ('".$prodsize[0]."',    
                                '".$prodsize[1]."',
                                '".$prosalelems."',
                                NULL,
                                '".date("Y-m-d H:i:s")."',
                                '".date("Y-m-d H:i:s")."'
                                )") or die("erreur taille");
            //echo "<h4>couleur</h4>";
            //echo $prodcolor[0]." - ".$prodcolor[1]." - ".$prosalelems."<br />";
            mysqli_query($link, "INSERT IGNORE INTO `attribute_combination` (attribute_id, attribute_av_id, product_sale_elements_id, position, created_at, updated_at) VALUES ('".$prodcolor[0]."',
                                '".$prodcolor[1]."',
                                '".$prosalelems."',
                                NULL,
                                '".date("Y-m-d H:i:s")."',
                                '".date("Y-m-d H:i:s")."'
                                )") or die("erreur couleur");   
                               
            $prosalelems++;
        }
    }
}

mysqli_close($link);

?>
<script>
setTimeout(function(){
document.location='produits.php?page=<?php echo $next; ?>';
}, 1500);
</script>

Last edited by fredodefrance (11-05-2017 02:30:44)


C'est en faisant qu'on apprends.

Offline


Il me manquait juste de mettre un produit par défaut dans le product_sale_elements.
Les combinaisons sont bien générées avec les 3 tables product_sale_elements, product_price et attribute_combination.
Sujet résolu.


C'est en faisant qu'on apprends.