php blog magyarul

Aktuális időjárás kijelzése egyszerűen

Néhány helyen láthatjuk, hogy az aktuális időjárást megjelenítik a honlapokon. Ezek közül akad olyan is, ahol nemcsak az aktuális hőmérsékletet, hanem az időjárásnak megfelelő piktogramot is mutatják. Ennek elkészítésére ad lehetőséget a Yahoo! Weather RSS feed-je is, amelyre most bemutatunk egy példát.

Kezdők problémája 

Kezdők számára az alap problémát az szokta jelenteni, hogy az RSS feed-et milyen úton dolgozzuk fel. Erre rengeteg megoldás létezik. Az első, leginkább időigényes, ha saját XML értelmezőt írunk. Véleményem szerint halva született ötlet, mert rengeteg RSS feed értelmezőt találni, illetve PEAR tárházban is található néhány csomag, amik jól használhatóak. De mi van akkor, ha nem tudunk, vagy nem akarunk PEAR csomagokat, vagy külön osztályokat használni a feed értelmezésére. Egyszerűnek tűnhet egy olyan megoldás, ami az XML-t többdimenziós tömbbe konvertálja. Mielőtt nekiugranánk e megoldás elkészítésének, gondoljuk végig, hogy nem mi fogjuk a kereket feltalálni, és lehet, hogy valaki már kész, vagy használható félmegoldást publikált a neten. Ha XML-t akarunk konvertálni PHP tömbbe vagy fordítva, használjuk az XMLize.php-t.

Mivel most az egyszerűségre törekszünk, nem fogjuk teljes egészében felhasználni, csak néhány kódrészletet emelünk ki belőle, amik az XML => PHP tömb irányú konverzióhoz kellenek.

XML => PHP tömb konverzió

A konverzióval kapcsolatos részletekbe, most nem mennék bele, az ötletadóként felhasznált osztály honlapján megtalálhatjuk az eredeti kódot, leírást, illetve példákat. Annyit fűznék hozzá, hogy ennek segítségével, az XML-ből nagyon egyszerűen lehet a megfelelő értékeket kiolvasni, és egyszerű, kevésbé összetett feladatok megoldására tökéletesen alkalmas a megoldás, azt leszámítva, hogy nem a legelegánsabb. De megjegyzem: most az egyszerűségre törekszünk.

Rendben. Meg vannak az adatok, mi kell még?

Attól, hogy az adatokat kinyertük, még nem vagyunk készen. Nem tartom etikusnak, hogy a piktogramokat mindig a Yahoo! szervere szolgálja ki, ezért le kell azt töltenünk, és feltöltenünk a saját weblapunk tárhelyére. A fájlok listáját következő link tartalmazza: image_list.txt. Senkinek nem kell nekiállnia egyesével letöltenie. Az egész példa letölthető összecsomagolva (aktuális időjárás kijelzése - forráskód), amiben megtalálhatóak a Yahoo! által használt piktogramok. Tetszés szerint ezeket bármilyen képekre le lehet cserélni.

Jelenleg rendelkezésre állnak az adatok, és a piktogramok. Egyetlen problémát még az jelenti, hogy nem kellene minden egyes oldalletöltésnél lekérdezni a Yahoo! szerverétől az adatokat. Jó lenne gyorsítótárazni az eredményeket. A funkció ellátására tartalmazza a példa, a következő függvényeket:

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  private function read_cache() { 
    $ret = false; 
    if (file_exists($this->_cache_file) && is_readable($this->_cache_file)) { 
      $cache = unserialize(file_get_contents($this->_cache_file)); 
      if ($cache && ($cache['timestamp']+$this->_cache_lifetime >= time()) && md5(serialize($cache['result'])) == $cache['hash']) { 
        $this->_result = $cache['result']; 
        $this->_has_result = true; 
        $ret = true; 
      } 
    } 
    return $ret; 
  }      
 
  private function update_cache() { 
    $fp = fopen($this->_cache_file, 'w'); 
    if (!$fp) throw new Exception('Nem lehet irni a cache file-t!'); 
    $cache_str = serialize(array( 
      'timestamp' => time(), 
      'result' => $this->_result, 
      'hash' => md5(serialize($this->_result)), 
    )); 
    fwrite($fp,$cache_str,strlen($cache_str)); 
    fclose($fp); 
  }      
 
  public function empty_cache() { 
    if ($this->read_cache()) unlink($this->_cache_file); 
  }

A függvények nevei beszédesek. Az update_cache(); a meglévő adatokból generálja a cache fájlt, amit a read_cache() függvény tud beolvasni. Ezzel elérhető hogy nem kell minden oldalletöltésnél elkérni az adatokat a Yahoo! szerverétől. Az empty_cache() függvény szolgál a cache ürítésére, ha erre bármilyen okból szükségünk lenne.

Példa a használatra

Az osztály használata nagyon egyszerű, első lépésként be kell hívni az osztályt tartalmazó php állományt, majd pedig példányosítjuk az osztályt.

  require_once('yahooWeather.class.php'); 
  $yahooWeather = new yahooWeather();

Példányosításkor a konstruktorban megadható paraméterek és alapértelmezett értékeik a következők:

new yahooWeather($cache_file = 'yahoo_weather.cache', $cache_lifetime=3600, $feed_url = 'http://xml.weather.yahoo.com/forecastrss?p=HUXX0002&u=c');

A $cache_file, a gyorsítótárazáshoz használt állomány neve. Ennek írhatónak kell lennie, illetve ha nincs létrehozva, akkor a fájlt tartalmazó könyvtárban a PHP-nek tudnia kell állományt létrehozni. A $cache_lifetime az az idő másodpercben, amennyi időközönként a Yahoo! szerverétől le akarjuk kérdezni az információt. A $feed_url, az RSS feed címe, ami alap esetbe a budapesti adatokat Celsius fokban tartalmazza. További városok vagy mértékegységekhez használatos RSS feed-ek címét a következő oldalról kiindulva határozhatjuk meg: Yahoo! RSS Feed
Az adatok megjelenítésére a következő lehetőséget biztosítja az objektum:

//kép kódjának lekérdezése 
$yahooWeather->image_code; 
//hőmérséklet 
$yahooWeather->temp;

Az osztály nagyon könnyen módosítható, ha más RSS feed-et akarunk használni, vagy más adatokra van szükségünk, például előrejelzésre az aktuális adatok helyett. Módosítás csak a 88-89 sorban elhelyezett kódot kell. Ezek a sorok mondják meg, hogy az feed mely eleme melyik változóban kerüljön elhelyezésre:

88
89
      $this->_result['image_code'] = $array['rss']['#']['channel']['0']['#']['item']['0']['#']['yweather:condition']['0']['@']['code']; 
      $this->_result['temp'] = $array['rss']['#']['channel']['0']['#']['item']['0']['#']['yweather:condition']['0']['@']['temp'];

Demo és letöltés

A működő példaoldal megtekinthető: Aktuális időjárás kijelzése egyszerűen - példa. A forráskód letölthető: aktuális időjárás kijelzése - forráskód.

31 hozzászólás, szólj hozzá Te is!

  1. Szia!

    Próbaképp feltettem változtatás nélkül a zip-ben található file-okat, és még nem is változtattam rajtuk semmit, de már most nem működnek. Sajnos annyira nem értek hozzá, hogy meg tudjam állapítani, mi a gond, van valami ötleted?

    Itt van:
    http://www.zivatar.hu/tmp/weather/index.php
    és itt:
    http://macgyver.dyn.elte.hu/weather/index.php

    Kösz, Enikő

  2. Kétszer írtam hogy változatás nélkül :-)

  3. Szia!

    A második helyen már kaptam hibaüzenetet. Ebből arra következtetek, hogy a PHP verziód 4-es lesz. Sajnos a példa legalább 5-ös verziót követel meg.

  4. András

    Sziasztok,

    van valakinek 5lete arra, hogy hogyan lehet egyéb infókat is megjeleníteni?

    pl. szélirány, sebesség, előrejelzés x napra…

    Köszönöm:

    András

  5. De kár, akkor ez nem fog működni…

  6. András,
    előrejelzést is küld a yahoo, tehát az megoldott, csak a 88-89.sort kell módosítani. De maga a példa könnyen átalakítható bármilyen xml formátum feldolgozására. Ötletem viszont nincs, hogy szélirány-adatokat honnan lehet beszerezni.

    MacGyver,
    Aki kicsit tud php-ben programozni, az könnyen át tudja alakítani a példát, hogy működjön PHP4 alatt is.

  7. A szélirány ott van a yahoo-s forráskódjában:

    30° az ÉÉK.

    PHP-ben programozni sajnos kicsit sem tudok. Bár a zivatar.hu-n más lehet a gond, az admin felület azt írja, hogy a PHP verzió 5.2.4

  8. Kiszedte, akkor még egyszer:
    yweather:wind chill=”16″ direction=”30″ speed=”6.44″

  9. macgyver:
    A zivatar.hu-n nem ír ki semmilyen hibaüzenet sem. Próbáld meg, hogy az index.php elejére beszúrod ezt:
    < ?php
    error_reporting (E_ALL ^ E_NOTICE);
    ini_set('display_errors',true);
    ?>

    Ekkor elvileg ki kellene írnia, hogy mi a gond. Ha sikerült, akkor mutasd meg, vagy írd meg a hibaüzenetet. Valószínűnek tartom, hogy a weboldalt üzemeltető szerver úgy lehet beállítva, hogy a fopen függvény nem nyithat meg más szerver által szolgáltatott tartalmat. Ilyenkor más megoldást kell találni, pl.: CURL.

  10. Bemásoltam:

    update_cache() #1 /hosting/raid1/domains/zivatar.hu/www/tmp/weather/yahooWeather.class.php(21): yahooWeather->processFeed() #2 /hosting/raid1/domains/zivatar.hu/www/tmp/weather/index.php(26): yahooWeather->__get(’image_code’) #3 {main} thrown in /hosting/raid1/domains/zivatar.hu/www/tmp/weather/yahooWeather.class.php on line 52

  11. A probléma az, hogy a könyvtárban nem tud fájlt létrehozni a php, nincs jogosultsága. Ezt úgy tudod orvosolni, hogy ftp-n keresztül létrehozol egy könyvtárat, mondjuk legyen a neve “temp”, abban a könyvtárban ahol az index.php is van. Ennek 777-es jogot adsz, és a következő sort használod az index.php 18. sorában: $yahooWeather = new yahooWeather(’temp/yahoo_weather.cache’);

  12. Éljen, működik!
    Nagyon köszönöm!

    Vizsgaidőszak után be is üzemelem :-)

  13. Kakó Gábor

    Hali!

    Már kerestem egy hasonló leírást, nagyon köszi.
    De nekem előrejelzés is kellene, de kezdő lévén nem nagyon tudom mit hol, meg mire állítsak.
    És WAMP serveren tökéletesen működik, de az extrán nem. Televágja hibakóddal a képernyőt.

    Tudnál e nekem segíteni?

  14. Szia Gábor,

    Küldj egy emailt nekem, a polonkaig (kukac) freemail.hu-ra, az extra.hu-s url-el, és ránézek hogy mi lehet a gond.

  15. Kakó Gábor

    Köszi a segítséget.
    A sok hiba kód eltűnt, de a cURL-lal sem megy. :(
    Szóval mást tárhelyre talán jó lesz.

    Az előrejelzéses dologban tudnál segíteni?

    Kakó Gábor

  16. A 88-89. sort kell átírni, ha jól emlékszem a ‘yweather:condition’-t kell ‘yweather:forecast’-re.

  17. Kedves Gábor!
    Köszönöm a példát, nagyon örülök neki.
    Milyen más adatok nyerhetők ki a yahoo!-s weatherből?
    Mivel láthatnám a nyers XML-t?
    A Yahoo Weathernek van valami hivatalos ismertetése?(sajnos én nem találtam)

    Üdv
    Maczkó János

  18. Szia János,

    A Yahoo weather feed-ről bővebb információt itt találtsz: http://developer.yahoo.com/weather/

    Ha vmilyen kérdésed lenne vagy valamire kíváncsi vagy kérdezz nyugodtan!

  19. Köszönöm a segítséget.
    http://maczkojanos.opensourcesetup.com/pd/_block_available_dates.php
    Eddig ennyi sikerült, azonban a szél adatai kifognak rajtam, meg az előrejelzés részletei.

    Üdv:
    Maczkó János

  20. Hogy érted, hogy kifogtak? Nem sikerült kibányászni az XML-ből?

  21. Kedves Gábor!

    Örülök hogy rátaláltam a blogodra, gondolom rendszeres látogató leszek, a php-t csak szeretném ismerni és próbálok ismereteket gyüjtetni.
    üdv.
    Kis Zoltán

  22. Kedves Zoltán,

    Köszöntelek az oldalon, remélem sikerül majd hasznos információkat gyűjtened.

  23. GÁBOR

    Hello!

    ATW szerverre felraktam a zip-ben található fájlokat, de nem müködik:

    Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /demo/yahooWeather.class.php on line 4

    mi lehet a hiba?

  24. PÉTER

    Hogyan lehet magyarul kiirni azt, hogy most felhős az idő, vagy napos stb.?

  25. Gábor:
    Kérlek nézdd meg hogy jól töltötted-e fel, ha igen, akkor valószínű, hogy csak 4-es php verzió van a szerveren. A fenti példa pedig legalább 5-ös verzióval működik.

    Péter:
    Az első dolgod, hogy az itt található táblázatban szereplő elnevezéseket lefordítod magyarra: http://developer.yahoo.com/weather/#codes
    Ezután a példa index.php fájljában a < ?=$yahooWeather->image_code?> rész visszaad egy számot. A feladat hogy az adott szám alapján a lefordított táblázatból kikeresed a megfelelő szöveget, és így megkapod a magyar nyelvű meghatározást.

  26. Péter

    Azt tudom hogy a image_code?> rész egy számot ad vissza, de hogyan tudok “csatolni” egy számhoz egy szöveget? Tömbbel próbálkoztam, de nem sikerült! Igy kéne nem? –> Pl.: 20-as szám = Ködös idő.

  27. Kell egy ilyen tömb:

    $idoKodok = array(
    20 => ‘ködös idő’,
    21 => ‘napos idő’,
    22 => ‘nincs idő’,
    );

    Ha ez meg van, akkor pedig így tudod használni:
    echo ‘ilyen idő van: ‘. $idoKodok[$yahooWeather->image_code];

  28. Nagy István

    Sziasztok, hogy lehet más adatot megjeleníteni ezt sikerült

    $this->_result[’text’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:condition’][’0′][’@'][’text’];

    , de ezeket már nem tudom összehozni

    $this->_result[’chill’] = $array[’rss’][’#'][’channel’][’0′][’#'][’yweather:wind’][’0′][’#'][’item’][’0′][’@'][’chill’];

    Előre is köszönöm

  29. Sajnos sokan próbáltak támadni a példakódot futtatva, leginkább szlovák szerverekről, ezért a példát levettem az oldalról. A forráskód azonban továbbra is letölthető.

  30. idojaras

    Szia!

    Szeretnénk egy 3 napos időjárás jelzőt szerezni oldalunkra, de sehol se találtunk megoldást. Van valami ötleted, hogy honnan tudnánk találni?
    Ha tudsz valami jó kódot örömmel fogadnánk.

    Honlap címe az emailben olvasható.

    üdv.

  31. Mai, holnapi és holnap utáni időjárás kijelzéséhez egy kis segítség:

    $this->_result[’mai_image_code’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:condition’][’0′][’@'][’code’];
    $this->_result[’mai_temp’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:condition’][’0′][’@'][’temp’];
    $this->_result[’holnapi_image_code’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’0′][’@'][’code’];
    $this->_result[’holnapi_min’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’0′][’@'][’low’];
    $this->_result[’holnapi_max’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’0′][’@'][’high’];
    $this->_result[’holnaputani_image_code’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’1′][’@'][’code’];
    $this->_result[’holnaputani_min’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’1′][’@'][’low’];
    $this->_result[’holnaputani_max’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’1′][’@'][’high’];

Hozzászólás írása: “Aktuális időjárás kijelzése egyszerűen”