Polskie wsparcie PrestaShop

PrestaShop => Konfiguracja => Wątek zaczęty przez: cel3ct w Lipiec 06, 2012, 01:05:32 pm

Tytuł: Wzajemne powiązanie produktów
Wiadomość wysłana przez: cel3ct w Lipiec 06, 2012, 01:05:32 pm
Oto tresc porady z innego forum:
"Na chwile obecna w prescie jest tak że jezeli produkt A powiążemy z produktem B to to powiązanie jest jedno stronne. Jeżeli chcemy aby automatycznie na stronie produktu B było pokazane ze jest on powiązany z A to w classes/Product.php w funkcji

foreach ($accessories_id as $id_product_2)

dodajemy linie
Kod: Zaznacz cały
Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($this->id)), 'INSERT'); 

W przypadku gdy chcemy za jednym razem powiązać produkty A, B, C, D .... każdy z każdym

należy dodać jeszcze do tego ten kod

    foreach ($accessories_id as $pomoc){
            if($id_product_2!=$pomoc)
            Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($pomoc)), 'INSERT');
            }


Jest to przydatne gdy produkty powiązane sa zamiennikami w przypadku gdy produkt A jest zamiennikiem produkty B a B jest zamiennikiem C to C musi też być zamiennikiem A wystarczy dodać produkty i w jednym z nich zrobić powiązania a reszta doda się z automatu."

Zrobilem tak jak w opisie i oto moj kod:
public function changeAccessories($accessories_id)
{
foreach ($accessories_id as $id_product_2)
Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($this->id), 'id_product_2' => (int)($id_product_2)), 'INSERT');
Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($this->id)), 'INSERT');
foreach ($accessories_id as $pomoc){
            if($id_product_2!=$pomoc)
            Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($pomoc)), 'INSERT');
            }
}

Problem w tym, ze gdy chce powiazac cztery produkty A, B, C, D, to wzajemne powiazanie mam wylacznie w dwoch skrajnych, tj.:
- produkt A jest powiazany z B, C, D,
- produkt B nie ma powiazania,
- produkt C nie ma powiazania,
- produkt D ma powiazanie z A, B, C

Co dziwne, wazna jest tu kolejnosc powiazywania produktow. Dla powyzszej sytuacji produkt A wiazalem po kolei z B, C, D. Natomiast gdy zmieniam kolejnosc; produkt A wiaze z D, C, B, to otrzymuje takie powiazanie:
- produkt A jest powiazany z B, C, D,
- produkt B jest powiazany z A, C, D
- produkt C nie ma powiazania,
- produkt D nie ma powiazania.

Jakies pomysly? :)
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: mario w Lipiec 06, 2012, 02:03:21 pm
tak na pierwszy rzut oka to brakuje ci nawiasow klamrowych dla pierwszej petli foreach.
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: cel3ct w Lipiec 06, 2012, 02:24:00 pm
Nie wiem, czy chodzilo o to:
public function changeAccessories($accessories_id)
{
foreach ($accessories_id as $id_product_2){
Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($this->id), 'id_product_2' => (int)($id_product_2)), 'INSERT');
Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($this->id)), 'INSERT');
}
foreach ($accessories_id as $pomoc){
            if($id_product_2!=$pomoc)
            Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($pomoc)), 'INSERT');
            }
}

ale jest maly progres i teraz:
- produkt A jest powiazany z B, C, D,
- produkt B jest powiazany z A,
- produkt C jest powiazany z A,
- produkt D ma powiazanie z A, B, C
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: mario w Lipiec 06, 2012, 02:36:34 pm
wniskuje, ze if i drugi foreach powinien wykonac sie w ciele pierwszej petli foreach,
wiec nawias zamykajacy powinien znalesc sie za nawiasem zamykajacym 2 petli
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: cel3ct w Lipiec 06, 2012, 03:02:07 pm
Probowalem zrozumiec, ale nie dalem rady. :) Te foreachy i petle to dla mnie czarna magia. Moglbys podac gotowy kod z odpowienio rozstawionymi nawiasami? :)
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: mario w Lipiec 06, 2012, 03:07:44 pm
public function changeAccessories($accessories_id)
   {
      foreach ($accessories_id as $id_product_2)
                {
         Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($this->id), 'id_product_2' => (int)($id_product_2)), 'INSERT');
         Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($this->id)), 'INSERT');
      
              foreach ($accessories_id as $pomoc)
                        {
                               if($id_product_2!=$pomoc)
                                              Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($id_product_2), 'id_product_2' => (int)($pomoc)), 'INSERT');
                        }
          }
       }
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: mario w Lipiec 06, 2012, 03:08:30 pm
troche formatowanie sie rozjechalo, sorki
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: cel3ct w Lipiec 06, 2012, 03:13:21 pm
Wielkie dzieki! I to jest poprawny kod! :) Teraz wszystkie produkty sie ladnie wiaza.
Tytuł: Odp: Wzajemne powiązanie produktów
Wiadomość wysłana przez: illuminator w Lipiec 10, 2013, 01:12:40 pm
Wielkie dzieki! I to jest poprawny kod! :) Teraz wszystkie produkty sie ladnie wiaza.

Chyba jednak to nie działa jak trzeba, niektóre produkty wystawiają się podwójnie, czy ktoś zna lepsze rozwiązanie ?