Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp09/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2009 - Gruppe 1 - Xml-ANZ

Controller und Templates zur Anzeige

Anfangs haben wir uns mit dem Anzeigen von nicht veränderbaren, aktuellen Daten beschäftigt. Dazu war es nötig, zuerst die Controller, die in der URL aufgerufen werden, zu implementieren. Ein Controller ist eine Klasse, die von ApplicationController erbt. Ein Controller besteht aus möglicherweise mehreren Actions (Methoden), deren Syntax wie folgt aussieht:

# Action, die in @s "text" speichert
def action1
  @s= 'text'
end

In jedem Controller haben wir einen before-Filter verwendet, der dafür sorgt, dass nur ein eingeloggter User die dahinter aufgelisteten Actions aufrufen kann.

before_filter :require_user, :only => [:action1, :action2, ... ]

Um Ruby-Code, z.B. eine lokale Variable @t, in XML-Dateien einzubetten (embedded ruby), muss eine spezielle Syntax befolgt werden:

<?xml version="1.0"?>
 <knoten t='<%= @t%>'>
  </knoten>

Die spitzen Klammern mit dem Prozentzeichen "<%...%>" deuten an, dass Ruby-Code folgt. Das Gleichheitszeichen "=" ist hierbei notwendig, damit der Ruby-Code ausgeführt und angezeigt wird. Lässt man das Gleichheitszeichen weg, wird der Ruby-Code nur ausgeführt. Dies ist beispielsweise hilfreich, um Iterationen über @s auszuführen:

<?xml version="1.0"?>
<%@s.each do |s|%>
 <knoten s='<%= s%>'>
  </knoten>
<%end%>

Sonnensysteme

Die allererste Aufgabe, die für das eigentliche Spiel relevant ist, war es, sich Informationen über Sonnensysteme und ihre Planeten anzeigen zu lassen. Hierfür haben wir im SolarSystemController einige Actions für das iPhone bereitgestellt. So kann man sich

  • mit Übergabe der SonnensystemID alle zugehörigen Planeten, jeweils mit Informationen zu UserID, Usernamen, PlanetenID, SonnensystemID, Planetennamen, Anzahl an Feldern, ob es ein Heimatplanet ist, BesitzerID und -namen, Erz-, Kristall- und Gasvorkommen, Erz-, Kristall- und Gasboni und bebauten Feldern
  • alle Planeten des eingeloggten Users, jeweils mit Informationen zu PlanetenID, SonnensystemID, Planetennamen, Anzahl an Feldern, Erz-, Kristall- und Gasvorkommen, Erz-, Kristall- und Gasboni und bebauten Feldern
  • mit Übergabe des Radius <= 15 und der SonnensystemID alle Sonnensysteme in diesem Umkreis, jeweils mit Informationen zu der SonnensystemID und dem -namen, den Koordinaten und der Anzahl an Planeten
  • alle Sonnensysteme mit Informationen zu der SonnensystemID, dem -namen und den Koordinaten
  • und alle Sonnensysteme, in denen der User Planeten besitzt, mit Informationen zu der SonnensystemID und dem -namen, den Koordinaten und der Anzahl an Planeten

anzeigen lassen.

Beispielhaft erläutern wir hier die Anzeige aller Planeten in einem Sonnensystem. Die Action show_planets befindet sich im SolarSystemController:

class SolarSystemController < ApplicationController
 before_filter :require_user, :only => [:show_my_planets, :show_planets, :show_all_solarsystems, 
               :show_solarsystems_with_my_planets, :show_solarsystems_within_radius]
 
# Action zum Anzeigen aller Planeten in einem Sonnensystem
 
def show_planets
  #Mit params[:id] wird aus der URL die übergebene ID geholt und damit die in diesem\\
  #Sonnensystem vorhandenen Planeten in @planets gespeichert    
  @planets = SolarSystem.find(params[:id]).planets
  #Den aktuellen User erreicht man mit:
  @user = current_user.id
 
    respond_to do |format|
     format.xml do
       render :template => 'solar_system/show_planets.xml.erb'
      end
    end
end

Das aufgerufene Template hat folgende Gestalt:

<?xml version="1.0"?>
 <planets user_id= '<%=@user%>'>
 	<%@planets.each do |planet| %>
 	 <planet planet_id= '<%= planet.id %>'
	         solarsystem_id= '<%=planet.solar_system.id%>'
	         name= '<%= planet.name %>'
                 fields= '<%= planet.fields%>'
	         homeplanet= '<%= planet.homeplanet%>'
		 <%if planet.has_owner?%>
		   owner = '<%= planet.owner.id %>'
		 <%else%>
		   owner= 'kein Owner'
		 <%end%>
		 ore= '<%= planet.ore%>' 
		 crystal= '<%= planet.crystal%>' 
	         gas= '<%= planet.gas%>' 
	         ore_boni= '<%= planet.ore_boni%>' 
		 gas_boni= '<%= planet.gas_boni%>'
	         crystal_boni= '<%= planet.crystal_boni%>'
	         used_fields= '<%=planet.fields - planet.available_fields()%>'>
	 </planet>
	<%end%>
 </planets>

Der Aufruf erfolgt mit der URL:

http://server:port/solar_system/show_planets.xml?id=[ID]

Planeten

Um nun nähere Informationen zu Raumschiffen und Gebäuden auf einem Planeten zu erhalten, haben wir im PlanetController die Actions show_buildings und show_spaceships implementiert, die bei übergebener PlanetenID alle sich im Bau befindlichen und fertigen Gebäude bzw. Raumschiffe anzeigen. Hierbei werden Informationen zu ID, Typ, Level, benötigten Resourcen für den Bau und Fertigstellungszeitpunkt angegeben. Bei den Raumschiffen erfährt der User zusätzlich die Anzahl der Raumschiffe, die im Bau sind, und deren Kapazität. Eine weitere Action in diesem Controller ist show_planet, welche alle Informationen wie UserID, Username, PlanetenID, SonnensystemID, Planetenname, Anzahl an Feldern, ob es ein Heimatplanet ist, BesitzerID und -namen, Erz-, Kristall- und Gasvorkommen, Erz-, Kristall- und Gasboni, bebaute Felder und Lagerkapazität über den Planeten, dessen ID übergeben wird, ausgibt.

Forschung

Zur Anzeige der aktuellen Forschungslevel der vier Technologien Waffenforschung, Förderbonus, Antriebsforschung und Konstruktionsforschung haben wir im ResearchController die Action show_techlevel implementiert, die die mit einem Ausbau verbundenen Kosten, die Vorteile, die ID jeder Technologie und ob ein Ausbau zur nächsten Stufe möglich ist, anzeigt. Um dann eine Technologie auf das ausgewählte Level zu erhöhen, steht die Action increase_techlevel zur Verfügung. Das Template, das in dem ResearchController aufgerufen wird, ist folgendes:

<?xml version="1.0"?>
<result text = '<%=@result%>' 
success='<%= @success%>'>
</result>

Dieses Template ist allgemein gehalten; es wird auch in diversen anderen Controllern aufgerufen, wenn für das iPhone-Frontend nur entscheidend ist, ob die Anfrage erfolgreich war (@success= 'YES') oder nicht (@success= 'NO'). Außerdem wird in @result beschrieben, warum die Anfrage nicht erfolgreich war bzw. die Anfrage bestätigt.


Page last modified on August 22, 2009, at 11:54 AM