Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Koszy z XML i powtarzające się przedmioty
gcdreak
post
Post #1





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
gcdreak
post
Post #3





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


@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.
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Najprościej: iterować po każdym elemencie ITEM i sprawdzać czy ID jest równe temu, które chcesz dodać.
Go to the top of the page
+Quote Post
gcdreak
post
Post #5





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 16:24