Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SOLVED] pobieranie aukcji przez api i paginacja
Aquarius
post 22.07.2015, 12:28:14
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 1
Dołączył: 18.10.2008

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


witam,
udało mi się przerobić po wielu bojach starą metodę pobierania informacji o aukcjach na nową (w końcu zrozumiałem czemu ktoś w internecie napisał że to Allegro API to koszmar programisty), nie otrzymuję już błędów przy pobieraniu informacji, mam jednak problem z paginacją (stronicowaniem), załączam cały kod, być może przyda się komuś do przejścia na nową metodę:

  1. $offset = ($_GET['id']) ;
  2. $limit = 12;
  3. $soap = new SoapClient('https://webapi.allegro.pl/service.php?wsdl', array('trace' => true));
  4.  
  5. $items = $soap->doGetItemsList(
  6. 'webapiKey' => 'XXXXXXXX',
  7. 'countryId' => 1,
  8. 'filterOptions' => array(
  9. 'filterId' => 'userId',
  10. 'filterValueId' => array('XXXXXXX')
  11. )
  12. )
  13. )
  14. );
  15.  
  16. $items = get_object_vars($items);
  17. $ile_stron = $items['itemsCount'] / $limit;
  18. $pag = floor($ile_stron);
  19. if ($offset >= "1") {
  20. $back = ($_GET['id'] - 1);
  21. }
  22. else {
  23. $back = $pag;
  24. }
  25. if ($offset != $ile_stron) {
  26. $next = ($_GET['id'] + 1);
  27. }
  28. else {
  29. $next = "0";
  30. }
  31. echo "<span style=\"font-size: 16px\"><strong>Strona:</strong></span><br /><div style=\"line-height: 16px;padding-top: 5px\"><a href=\"aukcje?id=".$back."\"><img src=\"images/arrow-left.png\" style=\"padding-right:3px\" /></a> <span style=\"font-size: 16px\"><a href=\"aukcje?id=0\"> 0 </a>";
  32. for($i = 1; $i < $ile_stron; $i++)
  33. {
  34. echo '<a href="aukcje?id='.$i.'"> '.$i.' </a>';
  35. }
  36. echo " <a href=\"aukcje?id=".$next."\"><img src=\"images/arrow-right.png\" style=\"padding-left:3px\" /></a></span></div><br /><br />";
  37.  
  38. for($i=0;$i<$limit ;$i++)
  39. {
  40. echo '<div style="margin-right: 10px;margin-bottom: 10px;display: inline-block;">';
  41. echo '<a target="_blank" href="http://allegro.pl/show_item.php?item='.$items[$i]['itemsList']['itemId'].'"><img src="'.$items[$i]['itemsList']['photosInfo']['photoUrl'].'"/></a>';
  42. echo '<div style="width: 130px;margin-top: 5px;margin-bottom: 8px;line-height: 16px"><span style="line-height:14px;font-size: 11px;font-weight: bold">'.$items[$i]['itemsList']['itemTitle'].'</span><br />';
  43. if ($items[$i]['itemsList']['priceInfo']['priceType'] == "buyNow") {
  44. echo '<span style="line-height:20px;color: red;font-size: 16px;font-weight: bold">'.$items[$i]['itemsList']['priceInfo']['priceValue'].' zł</span></div>';
  45. }
  46. else {
  47. echo '<span style="line-height:20px;color: red;font-size: 16px;font-weight: bold">'.$items[$i]['itemsList']['priceInfo']['priceValue'].' zł</span></div>';
  48. }
  49. echo '</div>';
  50. }



problem w tym że serwer zwraca błąd:
Kod
PHP Notice:  Undefined offset: 0
PHP Notice:  Undefined offset: 1
PHP Notice:  Undefined offset: 2
PHP Notice:  Undefined offset: 3
PHP Notice:  Undefined offset: 4
PHP Notice:  Undefined offset: 5
PHP Notice:  Undefined offset: 6
PHP Notice:  Undefined offset: 7
PHP Notice:  Undefined offset: 8
PHP Notice:  Undefined offset: 9
PHP Notice:  Undefined offset: 10
PHP Notice:  Undefined offset: 11



przypuszczam że mam błąd w kodzie, jednak przejrzałem go już tyle razy i nie mam pojęcia w czym problem, proszę o pomoc

Ten post edytował Aquarius 23.07.2015, 10:24:14
Go to the top of the page
+Quote Post
IProSoft
post 22.07.2015, 14:28:45
Post #2





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Co zwróci
  1. var_dump($items);
?


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
Aquarius
post 23.07.2015, 07:21:03
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 1
Dołączył: 18.10.2008

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


mniej więcej tak to wygląda:
Kod
array(5) { ["itemsCount"]=> int(501) ["itemsFeaturedCount"]=> int(0) ["itemsList"]=> object(stdClass)#3 (1) { ["item"]=> array(100) { [0]=> object(stdClass)#4 (14) { ["itemId"]=> int(5118545340) ["itemTitle"]=> string(36) "RENAULT TRAFIC 2011 2,5 DCI KOMPLET" ["leftCount"]=> int(1) ["bidsCount"]=> int(0) ["biddersCount"]=> int(0) ["quantityType"]=> string(6) "pieces" ["timeToEnd"]=> string(27) "do wyczerpania przedmiotów" ["categoryId"]=> int(50851) ["conditionInfo"]=> string(4) "used" ["promotionInfo"]=> int(0) ["additionalInfo"]=> int(0) ["sellerInfo"]=> object(stdClass)#5 (5) { ["userId"]=> int(4921350) ["userLogin"]=> string(9) "xxxxxx" ["userRating"]=> int(225) ["userIcons"]=> int(10) ["countryId"]=> int(1) } ["priceInfo"]=> object(stdClass)#6 (1) { ["item"]=> array(2) { [0]=> object(stdClass)#7 (2) { ["priceType"]=> string(6) "buyNow" ["priceValue"]=> float(14000) } [1]=> object(stdClass)#8 (2) { ["priceType"]=> string(12) "withDelivery" ["priceValue"]=> float(14160) } } } ["photosInfo"]=> object(stdClass)#9 (0) { } } [1]=> object(stdClass)#10 (14)

...


pominąłem konwersję na zmienne:
  1. //$items = get_object_vars($items)


i chcę teraz wywołać dane w ten sposób:
  1. for($i=0; $i < $limit; $i++)
  2. {
  3. echo '<div style="margin-right: 10px;margin-bottom: 10px;display: inline-block;">';
  4. echo '<a target="_blank" href="http://allegro.pl/show_item.php?item='.$items[$i]->itemsList->itemId.'"><img src="'.$items[$i]->itemsList->photosInfo->photoUrl.'"/></a>';
  5. }


jednak tak jest jeszcze gorzej:
Kod
PHP Fatal error:  Cannot use object of type stdClass as array


Ten post edytował Aquarius 23.07.2015, 06:58:56
Go to the top of the page
+Quote Post
thek
post 23.07.2015, 08:18:54
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Przyjrzyj się strukturze zwrotnej z serwisu i dopasuj do tego pętlę smile.gif var_dump Ci jasno pokazuje ją, a PHP także daje wskazówkę, że coś nie tak jest z indeksem. Może po prostu iterujesz nie po tym co trzeba? wink.gif Jeśli nadal nie kumasz to rozpiszę Ci to nieco według tego co pokazuje var_dump jaki dałeś:
Kod
$items = array(5) {
   ["itemsCount"]=> int(501) <- element tablicy typu int
   ["itemsFeaturedCount"]=> int(0)  <- element tablicy typu int
   ["itemsList"]=> object(stdClass)#3 (1) { element tablicy typu object
      ["item"]=> array(100) { <- atrybut obiektu typu array
         [0]=> object(stdClass)#4 (14) { element tablicy typu object
            ["itemId"]=> int(5118545340) <- atrybut obiektu typu int
(...)

Widzisz dlaczego $items[0] zawoła błędem? Oraz dlaczego $items[0]['itemsList']['itemId'] także się wysypie? Wcale nie patrzysz na dane zwracane, ich strukturę i typy oraz z bardzo radosną twórczością podchodzisz do nich wink.gif Popatrz na to jak ja rozpisałem co jest czym i wyciągnij wnioski kiedy używać [], kiedy -> a kiedy użyć pętli...

EDIT: I uważaj na zawartość "itemsList" oraz "item", bo "itemsCount" sugeruje istnienie 501 przedmiotów, ale już "item" wskazuje 100, a reszty var_dump brak, więc ciężko wyrokować o dalszej strukturze całości i jak obie wartości współgrają ze sobą. Myślę, że ta mała uwaga naprowadzi Cię na to, gdzie byka w logice robisz.
Powód edycji: [thek]: Mała uwaga


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Aquarius
post 23.07.2015, 08:30:04
Post #5





Grupa: Zarejestrowani
Postów: 35
Pomógł: 1
Dołączył: 18.10.2008

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


ok, właśnie dochodziłem do tego że trzeba każdy element tej pętli "wylistować" aby otrzymać element docelowy, pomogło rozpisanie sobie struktury całej pętli elementów obiektu do nowej linii, każdą pętlę elementu do nowej itd.,
czyli:
  1. for($i=0; $i < $limit; $i++)
  2. {
  3. echo '<div style="margin-right: 10px;margin-bottom: 10px;display: inline-block;">';
  4. echo '<a target="_blank" href="http://allegro.pl/show_item.php?item='.$items->itemsList->item[0]->itemId.'"><img src="'.$items->itemsList->item[0]->photosInfo->item[1]->photoUrl.'"/></a>';
  5. }


i to działa już dobrze, informacje pobrane i poprawnie wyświetlone

słabo u mnie z pisaniem obiektowym i to tylu elementów, czas to podciągnąć bo to podobno przyszłość PHP, pytanie teraz jak to zapętlić aby otrzymać te 12 aukcji? jak tylko próbuję zapętlić wywala mi błąd że nie można zapętlić obiektu:

Kod
Cannot use object of type stdClass as array


co do item które podaje wartość 100 elementów to dlatego że Allegro ma limit pobierania 100 aukcji jednocześnie, aby pobrać większą zawartość trzeba to zdefiniować przy inicjacji połączenia api

Ten post edytował Aquarius 23.07.2015, 08:38:41
Go to the top of the page
+Quote Post
thek
post 23.07.2015, 08:42:11
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To może napisz jak tę pętlę chcesz przeprowadzić? Bo sprawa jest prosta jeśli tylko chwilkę pomyślisz. To wariacja na temat jednej pętli, numeru strony i limitu na stronę. Inna sprawa że użycie floor do wyliczania ilości stron wprowadzi Cię w mały kłopot, skoro mając 14 elementów floor(14/12) = 1? wink.gif

EDIT: Jeśli limit przedmiotów to 100, to chyba warto też zwrócić uwagę czy dostajemy 100 czy tyle ile wskazuje "itemsCount", bo inaczej z paginacją też będą cyrki smile.gif bo 501 podzielisz na 12, da Ci to około 40 stron, ale tylko 9 będzie cokolwiek zawierać biggrin.gif
Powód edycji: [thek]: Odnośnie limitów w API...


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Aquarius
post 23.07.2015, 08:52:18
Post #7





Grupa: Zarejestrowani
Postów: 35
Pomógł: 1
Dołączył: 18.10.2008

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


zapętlać się zapętla do tych 12 elementów, ale dostaję 12 tych samych, jak miałem zmienne zamiast obiektów w poprzedniej metodzie pobierania aukcji to najnormalniej zwiększałem numer wyświetlanej aukcji poprzez
Kod
[$i]


no i pętla for
  1. for($i=0; $i < $limit; $i++)

robiła swoje

tutaj właśnie kiedy chcę zapętlić dostaję informację
Kod
Cannot use object of type stdClass as array



co do limitów API - powinienem oczywiście to inaczej zrobić, mianowicie definiować na każdej stronie że chcę pobrać 12 aukcji, na każdej kolejnej również 12 począwszy od (strona poprzednia * 12), ale problem sprawiało mi samo wyświetlanie jak na razie

Ten post edytował Aquarius 23.07.2015, 08:55:59
Go to the top of the page
+Quote Post
thek
post 23.07.2015, 08:55:32
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Chodzi mi o to po czym iterujesz... gdzie jest to $i, które potem łapiesz. Jak wygląda Twoje wnętrze pętli for. Bo to tam siedzi diabeł smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Aquarius
post 23.07.2015, 09:00:14
Post #9





Grupa: Zarejestrowani
Postów: 35
Pomógł: 1
Dołączył: 18.10.2008

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


starą dobrą metodą prób i błędów sprawdzałem i na początku:
  1. for($i=0; $i < $limit; $i++)
  2. {
  3. echo '<a target="_blank" href="http://allegro.pl/show_item.php?item='.$items[$i]->itemsList->item[0]->itemId.'"><img src="'.$items[$i]->itemsList->item[0]->photosInfo->item[1]->photoUrl.'"/></a>';
  4. }


i na końcu:
  1. for($i=0; $i < $limit; $i++)
  2. {
  3. echo '<a target="_blank" href="http://allegro.pl/show_item.php?item='.$items->itemsList->item[0]->itemId[$i].'"><img src="'.$items[$i]->itemsList->item[0]->photosInfo->item[1]->photoUrl[$i].'"/></a>';
  4. }


zazwyczaj problemu ze zrozumieniem że tak jest źle albo tak jest dobrze nie mam, ale pierwszy raz trafiło mi się zderzyć z taką ilością elementów i pętli w obrębie jednego obiektu, oczywiście zdaję sobie sprawę że tak to nie może być bo oznaczałoby to element w strukturze samego obiektu a nie iterację

Ten post edytował Aquarius 23.07.2015, 09:37:07
Go to the top of the page
+Quote Post
aniolekx
post 23.07.2015, 09:36:53
Post #10





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

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


  1. foreach ($items->itemsList->item as $item) {
  2. {
  3. echo '<a target="_blank" href="http://allegro.pl/show_item.php?item='.$item->itemId.'"><img src="'.$item->photosInfo->item[1]->photoUrl.'"/></a>';
  4. }



chyba tak bedzie czytelniej? wink.gif

Ten post edytował aniolekx 23.07.2015, 09:39:05
Go to the top of the page
+Quote Post
thek
post 23.07.2015, 09:45:00
Post #11





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




W takim wypadku chyba nadal nie widzisz gdzie jest Twoja tablica z obiektami. Chyba zrobię to co poprzednio i Ci to rozpiszę smile.gif
Kod
$items = array(5) {
   ["itemsCount"]=> int(501) <- element tablicy zawierający liczbę przedmiotów
   ["itemsFeaturedCount"]=> int(0)  <- element tablicy zawierający liczbę przedmiotów wyszczególnionych
   ["itemsList"]=> object(stdClass)#3 (1) { element tablicy typu object zawierający listę wszystkich informacji związanych z przedmiotami
      ["item"]=> array(100) { <- atrybut obiektu  będący tablicą przedmiotów
         [0]=> object(stdClass)#4 (14) { element tablicy typu object będący konkretnym przedmiotem
            ["itemId"]=> int(5118545340) <- atrybut przedmiotu
(...)


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Aquarius
post 23.07.2015, 10:23:17
Post #12





Grupa: Zarejestrowani
Postów: 35
Pomógł: 1
Dołączył: 18.10.2008

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


zrobiłem tak jak się należało od początku, czyli pobranie 12 aukcji (a nie 100), dla każdej strony inną porcję zaczynając tak jak pisałem wcześniej od
  1. $resultOffset = ($offset - 1) * 12;


i tu już było łatwiej dla mnie bo wystarczyło zapętlić w pętli foreach tak jak zasugerował aniolekx

w oczekiwaniu na odpowiedzi do tematu poczytałem trochę o zapętlaniu obiektów, ale nie wpadłem na żaden trop jaki podsuwałeś thek, być może będę miał jeszcze w przyszłości okazję (czyt. potrzebę)
w każdym razie sposób z pobieraniem od razu właściwej porcji aukcji jest poprawniejszy,

podziękował pięknie za podpowiedzi smile.gif


PS. co do funkcji floor - uważałem że jest ona tutaj właściwa, ale zaokrąglenie w dół np. 41,75 strony da mi 41 stron czyli niewłaściwą ilość (41 * 12 = 492), w moim przypadku przy 12 wynikach na stronę, zamieniłem ją na ceil

Ten post edytował Aquarius 23.07.2015, 10:36:33
Go to the top of the page
+Quote Post
thek
post 23.07.2015, 12:25:03
Post #13





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




I o to mi chodziło co rzucił @aniolekx smile.gif Chciałem byś zauważył, że u Ciebie iteracja idzie po $items->itemsList->item, bo to jest wlaściwa tablica obiektów klasy stdClass smile.gif Ty wcześniej iterowałeś albo za płytko (po $items), więc rzucało Ci undefined index, albo za głęboko ($items->itemsList->item[0]->itemId), co kończyło się próbą iteracji po liczbie typu int wink.gif A nie sugerowałem Ci foreach, bo foreach potrafi iterować po publicznych atrybutach obiektu. To by Cię mogło zupełnie w błąd wprowadzić. Dlatego taki nacisk położyłem na zrozumienie przez Ciebie struktury odpowiedzi zwracanej przez serwer. Tak byś sam załapał co jest nie tak.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 22:24