Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Koszy z XML i powtarzające się przedmioty
Forum PHP.pl > Forum > PHP
gcdreak
Witam!
Chcę stworzyć klasę Koszyk działającą w oparciu o plik XML.
Mam jednak problem z kilkukrotnym dodawaniem tego samego przedmiotu.
Moja metoda dodająca produkty do pliku wygląda tak:
Kod
public function addItem($itemId, $itemQuantity){
            $this->createCard();
            $xml = new SimpleXMLElement(self::CARDS_DIR.$this->cardName.'.xml', NULL, true);
            $item = $xml->addChild('item');
        if(! in_array($itemId,$xml->xpath('//id'))){ //z tą linijką mam problem:/
                $item->addChild('id', $itemId);
                $item->addChild('quantity', $itemQuantity);
        }else{
            //kombinuj z powtórkami!
        }
            $xml->asXML(self::CARDS_DIR.$this->cardName.'.xml');
        }

Troche kombinowałem ale niestety bezskutecznie.
Plik XML wygląda tak:
Kod
<items>
    <item>
        <id>
            klawiatura
        </id>
        <quantity>
            2
        </quantity>
    </item>
    <item>
        <id>
            klawiatura
        </id>
        <quantity>
            2
        </quantity>
    </item>
</items>

Jak zmienić metodę addItem, aby w razie istnienia produktu w pliku, jedynie zwiększała jego ilość, a nie dodawała nowy węzeł <item />.
Pozatym to co sądzicie o takim podejściu do budowy koszyka?
Crozin
Kod
<items>
   <item id="123" qty="321" />
   <item id="123" qty="321" />
   <item id="123" qty="321" />
</items>
Sprawdzasz czy istnieje element ITEM z ID równemu dodawanemu produktowi. Jeśli tak wystarczy zwiększyć wartość w QTY, jeśli nie tworzysz nowy.
gcdreak
@Crozin
1. Nie wiem czy doczytałeś mojego posta, ale ja wiem, że mam dokładnie to zrobić i pytałem jak.
2. Nie bawie się w atrybuty, tylko w nowe elementy(<id />, <quantity />). Argumentów powinno się urzywać do metadanych.
Crozin
Najprościej: iterować po każdym elemencie ITEM i sprawdzać czy ID jest równe temu, które chcesz dodać.
gcdreak
Ale chodzi mi o ten kawałek kodu. To można by zmieścić w dwóch linijkach.
Właśnie chodzi o to, że nie wiem jak to wyciągnąć poprawnie i porównać.
Próbowałem z xPath ale mi to nie wychodziło i dlatego założyłem ten temat.
Crozin
Pseudo-kod:
  1. <?php
  2. id = 123 //id dodawanaego produktu
  3. qty = 3
  4.  
  5. xml = simplexml(kod_koszyka)
  6. foreach(xml->item as item){
  7.  if item->id == id{
  8.    uaktualnanie
  9.    return
  10.  }
  11. }
  12.  
  13. dodawanie nowego
  14. return
  15. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.