Gå til innhold

Trenger hjelp med uthenting av data fra XML-feed


Anbefalte innlegg

Videoannonse
Annonse

Hvis det er riktig at dette skal inn i "class.avinor.php"

function fix_norwegian_characters( $subject )
{
       // Hvilke bokstaver skal vi se etter?
       $search  = array( 'Æ', 'Ø', 'Å', 'æ', 'ø', 'å' );

       // Hvis de finnes, bytt de ut med følgende
       $replace = array( 'A', 'O', 'A', 'a', 'o', 'a' );

       // Hvis du opplever spørsmålstegn eller andre rare symboler
       // istedet for AOA, fjerner du kommentaren fra linjen under:
	// $subject = utf8_decode( $subject );

       // Returner nytt, korrekt navn
       return str_replace( $search, $replace, $subject );
}

 

Så blir det seende ut slik -> http://trondheimlufthavn.net/test1.php#

Lenke til kommentar

fix_norwegian_characters() er en funksjon du kan bruke hvis du må gjøre norske bokstaver, Æ, Ø og Å om til de mer nøytrale A, O og A. Den kan du legge øverst i samme fil hvor dataene vises (den du postet øverst på forrige side), eller i en ekstern fil du inkluderer.

 

Hvis du ikke visste det fra før, så brukes funksjoner på følgende måte:

 

<?php
   echo fix_norwegian_characters( $airport );
?>

 

Her blir variabelen $airport sendt til funksjonen vi har laget og returnerer i det du ba om, hvis ikke alt skjærer seg.

 

Du må bytte ut utf8_decode() som er brukt i linkene (-elementene) jeg viste deg i denne posten med den nye funksjonen vi har laget. Dette bør du klare selv :)

Lenke til kommentar

Ta kvelden og kast deg over problemene i morgen. Det er lurt å gi seg når alt bare blir kluss :)

 

Hvis du fortsatt ikke finner løsningen i morgen, så legger du ut alle filer du har rørt etter at de sist fungerte her og sender meg linken, så skal jeg ta en titt.

Lenke til kommentar

Jeg har lagt inn denne i tabellen nå:

<td>
       <a href="/<?php echo fix_norwegian_characters($flight['airline']['name']); ?>.html">
               <img src="<?php echo $flight['airline']['icon']; ?>" alt="" class="airlineIcon" /> 
               <?php echo fix_norwegian_characters($flight['airline']['name']); ?>
       </a>
</td>

 

Også har jeg puttet denne inn i class.avinor.php (API'n):

function fix_norwegian_characters( $subject )
{
       // Hvilke bokstaver skal vi se etter?
       $search  = array( 'Æ', 'Ø', 'Å', 'æ', 'ø', 'å' );

       // Hvis de finnes, bytt de ut med følgende
       $replace = array( 'A', 'O', 'A', 'a', 'o', 'a' );

       // Hvis du opplever spørsmålstegn eller andre rare symboler
       // istedet for AOA, fjerner du kommentaren fra linjen under:
       // $subject = utf8_decode( $subject );

       // Returner nytt, korrekt navn
       return str_replace( $search, $replace, $subject );
}

 

Men det blir bare seende ut slik: http://trondheimlufthavn.net/test1

 

Har jeg tatt rett når det gjelder plassering av funciton-fix_norwegian_characters funksjonen?

- For den ligger nå her:

<?php
/**
* Avinor PHP API Library
* @version 1.1
* @author Flamur Mavraj - OXODesign TEAM
* @link http://www.oxodesign.no/avinorPhpApi
* @name avinor
* @license Domain Public
*/
class avinor{

private $timeFrom;
private $timeTo;
private $airport;
private $direction;
private $lastUpdate;
private $apiRequestUri 			= "";

protected $apiUrlFlights 		= "http://flydata.avinor.no/XmlFeed.asp?";
protected $apiUrlFlightStatus 	= "http://flydata.avinor.no/flightStatuses.asp";
protected $apiUrlAirportNames	= "http://flydata.avinor.no/airportNames.asp";
protected $apiUrlAirlineNames	= "http://flydata.avinor.no/airlineNames.asp";

public $statusCodes = array();
public $airlineNames= array(
	/**
	 * Avinor does not have thoose airline codes
	 * on their airline search api, so we created manually.
	 */
	'BGT'=> array('code' => 'BGT', 'name' => 'BergenAir'),
	'2N' => array('code' => '2N', 'name' => 'NextJet', 'icon' => 'gfx/icons/2N.png'),
	'FHY' => array('code' => 'FHY', 'name' => 'Freebird', 'icon' => 'gfx/icons/FHY.png'),
	'YK' => array('code' => 'YK', 'name' => 'Cyprus Turkish Airlines'),
	'MSC'=> array('code' => 'MSC', 'name' => 'Air Cairo')
);

public $airlineIconPath = "gfx/icons"; //  For Windows use "gfx\icons"
public $airlineIcons	= array();

public $airportNames= array(
	'LHE'=> array('code' => 'LHE', 'name' => 'Lahore')
);
public $flights		= array();

public function __construct() {

	/**
	 * Fetch airline icons from a directory
	 * Fetch airline names into an array
	 * Fetch airport names into an array
	 * Fetch flight status codes into an array
	 */
	$this->fetchAirlineIcons()
		 ->fetchAirlineNames()
		 ->fetchAirportNames()
		 ->fetchFlightStatusCodes();

	return true;
}

/**
 * Clear session cache
 * @param $name|null
 * @return avinor
 */
public function clearCache($name = null){
	if($name === null)
		unset($_SESSION['cache']);
	else
		unset($_SESSION['cache'][$name]);

	return $this;
}

/**
 * Return airport
 * @return string
 */
public function getAirport(){
	return $this->airport;
}

/**
 * Return current airport
 * @return array
 */
public function getCurrentAirport(){
	return $this->airportNames[$this->airport];
}

/**
 * Return array of airport names
 * @return array
 */
public function getAirportList(){
	return $this->airportNames;
}

/**
 * Define value for timeFrom
 * @param int $time
 * @return avinor
 */
public function setTimeFrom($time){
	$this->timeFrom = (int) $time;

	return $this;
}

/**
 * Define value for timeTo
 * @param int $time
 * @return avinor
 */
public function setTimeTo($time){
	$this->timeTo = (int) $time;

	return $this;
}

/**
 * Define airport
 * @param string $airport
 * @return avinor
 */
public function setAirport($airport){
	$this->airport = $airport;

	return $this;
}

/**
 * Define direction
 * @param string $direction
 * @return avinor
 */
public function setDirection($direction){
	$this->direction = $direction;

	return $this;
}

/**
 * Define lastUpdate
 * @param string $lastUpdate
 * @return avinor
 */
public function setLastUpdate($lastUpdate){
	$this->lastUpdate = $lastUpdate;

	return $this;
}

/**
 * Build flight request query
 * @return avinor
 */
private function buildRequestQuery(){
	$this->apiRequestUri = $this->apiUrlFlights;
	$this->apiRequestUri.= (isset($this->airport) ? 'airport=' . urlencode($this->airport) : '');
	$this->apiRequestUri.= (isset($this->timeTo) ? '&timeTo=' . urlencode($this->timeTo) : '');
	$this->apiRequestUri.= (isset($this->timeFrom) ? '&timeFrom=' . urlencode($this->timeFrom) : '');
	$this->apiRequestUri.= (isset($this->direction) ? '&direction=' . urlencode($this->direction) : '');
	$this->apiRequestUri.= (isset($this->lastUpdate) ? '&lastUpdate=' . urlencode($this->lastUpdate) : '');

	return $this;
}


/**
 * Get result of request. 
 * It returns the result or boolean if something goes wrong
 * @return array/boolean
 */
public function getResult(){
	try{
		// Check if airport is set, if not throw an exception
		if(!isset($this->airport))
			throw new Exception('Airport is not defined!');


		// Build flight request query
		$this->buildRequestQuery();

		// Get xml from the server
		$xml = new SimpleXMLElement($this->apiRequestUri, null, true);

		// Parse the XML output
		foreach($xml->flights->flight as $flight){
			// Create an array with the name of the airports the plane has been through
			$viaAirport = null;
			if(isset($flight->via_airport)){
				$viaAirport = array();
				$viaAirports = explode(",", (string) $flight->via_airport);
				foreach($viaAirports as $via){
					$viaAirport[] = $this->airportNames[(string) $via];
				}
			}

			$this->flights[(string) $flight['uniqueID']] = array(
				'airport'		=> $this->airportNames[(string)$flight->airport],
				'flightId'		=> (string) $flight->flight_id,
				'airline'		=> (isset($this->airlineNames[(string) $flight->airline]) ? 
										$this->airlineNames[(string) $flight->airline] : 
										array('code' => (string) $flight->airline, 'name' => (string) $flight->airline)
									),
				'domInt'		=> (string) $flight->dom_int,
				'scheduleTime'	=> (string) $flight->schedule_time,
				'direction'		=> (string) $flight->arr_dep,
				'viaAirport'	=> $viaAirport,
				'checkIn'		=> (isset($flight->check_in) ? (string) $flight->check_in : null),
				'gate'			=> (isset($flight->gate) ? (string) $flight->gate : null),
				'status'		=> (isset($flight->status) ? 
										array(
											'code' => $this->statusCodes[(string) $flight->status['code']],
											'time' => (string) $flight->status['time']
										) : null
									),
				'beltNumber'	=> (isset($flight->belt_number) ? (string) $flight->belt_number : null)		
			);
		}
	}catch (Exception $e){
		echo "Error: " . $e->getMessage();
		return false;
	}

	return $this->flights;
}

function fix_norwegian_characters( $subject )
{
       // Hvilke bokstaver skal vi se etter?
       $search  = array( 'Æ', 'Ø', 'Å', 'æ', 'ø', 'å' );

       // Hvis de finnes, bytt de ut med følgende
       $replace = array( 'A', 'O', 'A', 'a', 'o', 'a' );

       // Hvis du opplever spørsmålstegn eller andre rare symboler
       // istedet for AOA, fjerner du kommentaren fra linjen under:
       // $subject = utf8_decode( $subject );

       // Returner nytt, korrekt navn
       return str_replace( $search, $replace, $subject );
}


/**
 * Fetch airline icons from a directory
 * @return avinor
 */
private function fetchAirlineIcons(){
	if(isset($_SESSION['cache']['airlineIcons'])){
		$this->airlineIcons = unserialize($_SESSION['cache']['airlineIcons']);
		return $this;
	}

	try{
		$files = new DirectoryIterator($this->airlineIconPath);
	}catch (Exception $e){
		echo "<font style='color: #ff0000'>
			Error: Failed to open airlineIconPath: <b>" . $this->airlineIconPath . "</b></font>";
		return $this;
	}


	foreach($files as $file){
		if(!$file->isDot()){
			$fileInfo = pathinfo($file->getFilename());
			$this->airlineIcons[strtolower((string)$fileInfo['filename'])] = str_replace("\\", "/", (string) $file->getPathname());
		}
	}

	$_SESSION['cache']['airlineIcons'] = serialize($this->airlineIcons);

	return $this;
}

/**
 * Fetch flight status codes into an array
 * @return avinor
 */
private function fetchFlightStatusCodes(){
	if(isset($_SESSION['cache']['statusCodes'])){
		$this->statusCodes = unserialize($_SESSION['cache']['statusCodes']);
		return $this;
	}

	$xml = new SimpleXMLElement($this->apiUrlFlightStatus, null, true);

	foreach($xml->flightStatus as $status){
		$this->statusCodes[(string) $status["code"]] = array(
			'code'	=> (string) $status["code"],
			'no' 	=> (string) $status['statusTextNo'],
			'en' 	=> (string) $status['statusTextEn']
		);	
	}

	$_SESSION['cache']['statusCodes'] = serialize($this->statusCodes);

	return $this;
}

/**
 * Fetch airline names into an array
 * @return avinor
 */
private function fetchAirlineNames(){
	if(isset($_SESSION['cache']['airlineNames'])){
		$this->airlineNames = unserialize($_SESSION['cache']['airlineNames']);
		return $this;
	}

	$xml = new SimpleXMLElement($this->apiUrlAirlineNames, null, true);

	foreach($xml->airlineName as $airline){
		$this->airlineNames[(string) $airline["code"]] = array(
			'code' => (string) $airline["code"],
			'name' => (string) $airline["name"],
			'icon' => ( isset($this->airlineIcons[strtolower((string) $airline["code"])]) ? 
						$this->airlineIcons[strtolower((string)$airline["code"])] : 
						false)	
		);
	}

	$_SESSION['cache']['airlineNames'] = serialize($this->airlineNames);

	return $this;
}

/**
 * Fetch airport names into an array
 * @return avinor
 */
private function fetchAirportNames(){
	if(isset($_SESSION['cache']['airportNames'])){
		$this->airportNames = unserialize($_SESSION['cache']['airportNames']);
		return $this;
	}

	$xml = new SimpleXMLElement($this->apiUrlAirportNames, null, true);

	foreach($xml->airportName as $airport){
		$this->airportNames[(string) $airport["code"]] = array(
			'code' => (string) $airport["code"],
			'name' => (string) $airport["name"]
		);
	}

	$_SESSION['cache']['airportNames'] = serialize($this->airportNames);

	return $this;
}
}

 

????

Lenke til kommentar

fix_norwegian_characters() kan ikke ligge i class.avinor.php da denne filen inneholder en klasse. Det du gjør nå er å legge en funksjon inn i en klasse som ikke har noe med funksjonen å gjøre, og deretter bruker funksjonen som om den lå utenfor klassen. Fjern funksjonen fra class.avinor.php og legg den i en ny fil du kaller hva som helst, som du inkluderer øverst i filen hvor tabellen vises.

 

Eller så legger du funksjonskoden øverst i filen hvor du viser tabellen. Det er vel enkleste løsning.

Lenke til kommentar

Les kommentarene i den lille funksjonen jeg ga deg, og se om du finner noe relatert til nettopp rare symboler.

 

Jeg ser også at den ikke er helt komplett med tanke på mellomrom, som i Bergen Air Transport. Dette kan jeg prøve å løse i morgen hvis du ikke har fått løst det på egenhånd.

Lenke til kommentar

Jeg har fjernet den linjen du nevnte.

Men det hjalp ikke.. :hmm:

 

Grunnen til at Bergen Air Transport ikke fungerer, er at jeg ikke har laget en underside om selskapet da de ikke trafikkerer lufthavnen på regulær basis. ;)

 

En annen ting som kanskje kan hjelpe deg angående rare tegn på http://trondheimlufthavn.net/test1.php er at jeg bruker "charset=iso-8859-1" istedenfor vanlig utf8. Men prøvde å bytte til utf8 uten noen resultat.

Endret av enva
Lenke til kommentar

Da fungerer det vet du.

 

Men har fortsatt et lite problem :innocent:

Jeg har utvidet flytidene slik at du kan bla ned et stykke og finne flyselskapet som står oppført som "krohnair.no"

 

Jeg har imidlertid laget en underside som heter /Krohn.html, og det er litt tungvindt og begynne å endre navnet i sufikset :nei:

 

Derfor lurer jeg på om det er noen måte å endre "krohnair.no" til "Krohn Air" eller "Krohn"?

 

Prøvde å legge inn denne i class.avinor.php, men det skjer ingenting:

'EZ' => array('code' => 'EZ', 'name' => 'Krohn Air'),

 

Any idea? :D

Lenke til kommentar
  • 4 måneder senere...

Det er denne jeg vil filtrere. Akkurat nå vises mange forskjellige selskaper og flyplasser: http://trondheimlufthavn.net/Flybuss/flytider

 

SÅ! Hva må jeg legge til / endre i php koden for å KUN vise Norwegians ankomster fra Oslo???

 

Her er php-koden:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Trondheim Flybuss | Forside</title>
   <link rel="stylesheet" type="text/css" href="css/flytider.css" media="screen" />
<!-- Copyright 2000, 2001, 2002, 2003 Macromedia, Inc. All rights reserved. -->
</head>

<body><?php 
include 'class.avinor.php';
?>
</p>
<div>
<h1 class="bold">
   <?php 
	$avinor 	= new avinor();
	$timeNow 	= time();

	if(isset($_POST) && isset($_POST['btnSearch'])){
		$airport 	= $_POST['airport'];
		$timeFrom	= $_POST['timeFrom'];
		$timeTo		= $_POST['timeTo'];
		$direction	= $_POST['direction'];
	}else{

		$airport 	= "TRD";
		$timeFrom	= 0;
		$timeTo		= 24;
		$direction	= "A";
	}

	$directions = array(
		'0' => 'Begge retninger',
		'A' => 'Ankomster',
		'D' => 'Avganger'
	);
?>
 </h1>
 <?php 
	function getHoursFromDate($time){
		date_default_timezone_set('UTC');
		if($time != ""){
			$currentTime 	= str_replace("T", " ", $time);
			$date 			= new DateTime($currentTime);

			$timeZone		= new DateTimeZone('Europe/Oslo');
			$date->setTimezone($timeZone);

			return $date->format('H:i');
		}

		return '';
	}

	$avinor->setAirport($airport)
		   ->setTimeFrom($timeFrom)
		   ->setTimeTo($timeTo);

	if($direction != "0")
		$avinor->setDirection($direction);

	$result = $avinor->getResult();
?>
 <table width="400">
   <thead>
   </thead>
   <tr>

     <td width="30"></thead>
       <?php 
		foreach($result as $flight):

			$avg 	= getHoursFromDate($flight['scheduleTime']);
			$status	= $flight['status']['code']['no'] . ' ' . getHoursFromDate($flight['status']['time']);

			if($flight['airport']['code'] == $avinor->getAirport() && $flight['direction'] != "A"){
				$airport = $flight['viaAirport'][0]['name'];
			}else $airport = $flight['airport']['name'];

			if($flight['direction'] == "A"){
				$fligtIcon = array(
					'src' => 'iconArrowDown.png',
					'text'=> 'Ankomster'
				);
			}else{
				$fligtIcon = array(
					'src' => 'iconArrowUp.png',
					'text'=> 'Avganger'
				);
			}
	?></td>
   </tr>
   <tr>
     <td height="24" class="none"><img src="gfx/index/<?php echo $fligtIcon['src']; ?>" alt="<?php echo $fligtIcon['text']; ?>" width="16" height="16" /></td>
     <td width="93"><?php echo $flight['airline']['name'] ?></td>
     <td width="66"><?php echo $flight['flightId']; ?></td>
     <td width="66"><?php echo utf8_decode($airport); ?></td>
     <td width="66"><?php echo $avg; ?></td>
     <td width="66"> </td>
     </tr>
   <?php endforeach; ?>
 </table>
</body>
</html>

 

Som man kan se, så er det allerede mulighet for å filtrere hvor langt frem i tid man vil hente flytidene, hvilken retning man vil ha (ankomst eller avgang) osv. Men trenger som sagt å få lagt inn et filter som bestemmer hvilke(t) flyselskap som skal vises og hvilken destinasjonsflyplass som skal vises.

Endret av enva
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...