• Ei tuloksia

Karttakäyttöliittymä yksinkertaisuudessaan näyttää kohteet kartalta.

Kohdetta klikattaessa käyttäjälle näytetään tarkemmat tiedot kohteesta.

Kuva 9. Karttakäyttöliittymä

8 YHTEENVETO

Opinnäytetyön tarkoituksena oli toteuttaa paikkatietokanta Kanta-Hämee-seen. Tuloksena syntyi avoin rajapinta ja tarvittavat peruskäyttöliittymät.

Toteutuksessa käytettiin paljon avoimen lähdekoodin kirjastoja ja niiden yhteensovittaminen oli välillä haastavaa.

Opinnäytetyön aikana osa suunnitelluista teknologioista vaihdettiin.

GoogleMaps vaihdettiin OpenStreetMap-palveluun, koska se oli ilmainen ja käyttötarkoitukseen riittävä. Alun perin ajateltiin käyttää GeoServer-pal-velua karttatasojen esittämiseen. Sovelluksessa ei kuitenkaan ollut varsi-naisia karttatasoja, esim. omia pohjakarttoja, vaan vain pistemäisiä koh-teita. Pistemäisten kohteiden näyttämiseen GeoServer olisi ollut turhan raskas vaihtoehto. Tämän vuoksi sovelluksessa päädyttiin käyttämään LeafLet-kirjaston geojson tasoja. GeoJSON on muutenkin yleistymässä ja hyvin tuettuna mobiililaitteissa ja se voi sisältää myös omia tietoja, kuten tässä sovelluksessa haluttiin.

MVC-malli ja RESTful-arkkitehtuurimallit helpottivat tekemistä. Ne saneli-vat yhtenäisen tavan tehdä asioita. Myös jatkokehitys on helpompaa, kun asiat on tehty samalla tavalla. Aluksi tietokanta operaatiot tehtiin suoraan PHP:n tietokantaluokkien avulla. Tämä kuitenkin osoittautui työlääksi ja sen vuoksi käyttöön otettiin Doctrine-kirjasto. Se helpotti tietokantaohjel-mointia huomattavasti.

Lopputuloksena syntyi jatkokehitettävä paikkatietokanta, johon on

mah-dollista säilöä paljon hyödyllistä tietoa. Avoimet rajapinnat mahmah-dollistavat

uusien käyttöliittymien tekemisen. Käyttäjähallinta ja mobiilikäyttöliittymä

ovat varmasti seuraavia jatkokehityskohteita tälle sovellukselle.

LÄHTEET

codecademy. (ei pvm). MVC: Model, View, Controller. Haettu 25. 03 2019 osoitteesta https://www.codecademy.com/articles/mvc

R. Fielding, J. R. (2014). Hypertext Transfer Protocol (HTTP/1.1): Semantics

and Content. Haettu 08. 04 2019 osoitteesta

https://tools.ietf.org/html/rfc7231#section-4.2.3

Reenskaug, T. (1979). MODELS - VIEWS - CONTROLLERS. Haettu 25. 03 2019 osoitteesta http://heim.ifi.uio.no/~trygver/1979/mvc-2/1979-12-MVC.pdf RESTfulAPI.net, REST Architectural Constraints. (2017b). REST Architectural Constraints. Haettu 07. 04 2019 osoitteesta https://restfulapi.net/rest-architectural-constraints/

RESTfulAPI.net, What is REST. (2017a). What is REST. Haettu 07. 04 2019 osoitteesta https://restfulapi.net/

Trygve Mikkjel Heyerdahl Reenskaug. (2003). MVC:

Model-View-Controller. Haettu 20. 03 2019 osoitteesta

http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html

Wiki.c2. (2014). Model View Controller History. Haettu 02. 04 2019 osoitteesta http://wiki.c2.com/?ModelViewControllerHistory

Wikipedia. (2019a). Model–view–controller. Haettu 06. 04 2019 osoitteesta

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93control ler

Wikipedia. (2019b). Representational state transfer. Haettu 06. 04 2019 osoitteesta

https://en.wikipedia.org/wiki/Representational_state_transfer

Liite 1 TERMIT

HTTP

HyperText Transfer Protocol. Selaimen ja palvelimen väliseen tiedonsiir-toon käytettävä protokolla.

JAVASCRIPT

Ohjelmointikieli, jota käytetään lisäämään dynaamista toiminnallisuutta www-sivuille.

JSON

JavaScript Object Notation. Yksikertainen tiedonvälitykseen käytetty for-maatti.

MVC MVC-arkkitehtuurimalli on ohjelmistoarkkitehtuurimalli, joka jakaa ohjel-miston kolmeen osaan: malli (englanniksi model), näkymä (englanniksi view) ja ohjain (englanniksi controller).

ORM Object Relational Mapping. Tekniikka, jota käytetään olio-ohjelmointikie-lissä tiedon muuntamiseen yhteensopimattomien järjestelmien kanssa.

PHP PHP on palvelinpuolen ohjelmointikieli web kehitykseen.

Liite 2 RESTAPI LÄHDEKOODIT

./api/api/aukioloapi.class.php

<?php

include_once 'controller.class.php';

class AukioloApi extends Controller { private $aukiolodao;

function __construct() {

$this->aukiolodao = new AukioloDAO();

}

function luo($aukiolo) {

$aukiolo_id = $this->aukiolodao->luoAukiolo($aukiolo);

error_log ("aukioloid1 " . $aukiolo_id);

$id = $this->tallennaPaiva($aukiolo_id, $aukiolo, $aukiolo['maanantai'], 1);

$id = $this->tallennaPaiva($aukiolo_id, $aukiolo, $aukiolo['tiistai'], 2);

$id = $this->tallennaPaiva($aukiolo_id, $aukiolo, $aukiolo['keskiviikko'], 3);

$id = $this->tallennaPaiva($aukiolo_id, $aukiolo, $aukiolo['torstai'], 4);

$id = $this->tallennaPaiva($aukiolo_id, $aukiolo, $aukiolo['perjantai'], 5);

$id = $this->tallennaPaiva($aukiolo_id, $aukiolo, $aukiolo['lauantai'], 6);

$id = $this->tallennaPaiva($aukiolo_id, $aukiolo, $aukiolo['sunnuntai'], 7);

if($id != null) {

return $this->haeAvaimella($id);

} return null;

}

function tallennaPaiva($aukiolo_id, $aukiolo, $paiva, $tyyppi_id) { if(!isset($paiva['alkuaika']) || !isset($paiva['loppuaika'])) return -1;

$id = $this->aukiolodao->luoAukioloaika($paiva);

}

function haePaikantiedot($paikka_id) {

$linki = $this->aukiolodao->haePaikanAukiolot($paikka_id);

return $linki;

}

function haeAvaimella($id) {

$aukiolo = $this->aukiolodao->haeAukiolo($id);

return $aukiolo;

}

function poista($id) {

return $this->aukiolodao->poistaAukiolo($id);

}

private function getJsonObject() {

$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';

if(strcasecmp($contentType, 'application/json') != 0){

throw new Exception('Content type must be: application/json');

}

$content = trim(file_get_contents("php://input"));

$jsonobject = json_decode($content, true);

return $jsonobject;

}

public function dispatch($subAction,$id) { if ($this->customdispatch($subAction,$id)) { return;

}

$httpverb = strtoupper($_SERVER['REQUEST_METHOD']);

$result = null;

break;

function customdispatch($subAction,$id) { return false;

}

function virhe($teksti) {

header('Content-type: application/json; charset=iso-8859-1');

echo "{ \"error\": \"" .$teksti. "\" }";

}

function geojson() {

return "{ \"error\": \"not implemented\"";

}

function haePaikantiedot($paikka_id) {

return "{ \"error\": \"haePaikantiedot not implemented\"";

}

function haeKaikki() {

return "{ \"error\": \"haeKaikki not implemented\"";

}

function luo($newobject) {

return "{ \"error\": \"luo not implemented\"";

}

function paivita($newobject) {

return "{ \"error\": \"paivita not implemented\"";

}

function haeAvaimella($id) {

return "{ \"error\": \"haeAvaimella not implemented\"";

}

function poista($id) {

return "{ \"error\": \"poista not implemented\"";

}

function validoi($schemajson,$newobject) { $validator = new Validator;

$realpath = realpath(__DIR__.'/schema/'.$schemajson);

$schema = 'file://'.$realpath;

class KuvaApi extends Controller { private $kuvadao;

function customdispatch($subAction,$id) { if($subAction === "getimage") {

$kuva_id = $this->kuvadao->luoKuva($newobject);

if($kuva_id != null) {

return $this->haeAvaimella($kuva_id);

} return null;

}

function haePaikantiedot($paikka_id) {

return $this->kuvadao->haePaikanKuvat($paikka_id);

}

class LinkkiApi extends Controller { private $linkkidao;

function __construct() {

$this->linkkidao = new LinkkiDAO();

}

function luo($newobject) {

if ($this->validoi("linkkischema.json", $newobject)) { $id = $this->linkkidao->luoLinkki($newobject);

if($id != null) {

return $this->haeAvaimella($id);

} }

return null;

}

function haePaikantiedot($paikka_id) {

$linki = $this->linkkidao->haePaikanLinkit($paikka_id);

return $linki;

function paivita($newobject) {

if ($this->validoi("linkkischema.json", $newobject)) { $linki = $this->linkkidao->paivitaLinkki($newobject);

class LuokitteluApi extends Controller { private $luokitteludao;

$luokittelut = $this->luokitteludao->haeLuokittelut();

return $luokittelut;

class PaikkaApi extends Controller { private $paikkadao;

private $aukiolodao;

private $yhteystietodao;

private $kuvadao;

return $this->paikkadao->haeGeot()->values();

}

$paikat = $this->paikkadao->haePaikat($whereclause);

return $paikat;

}

function luo($newobject) {

$id = $this->paikkadao->luoPaikka($newobject);

if($id != null) {

return $this->haeAvaimella($id);

} return null;

}

function paivita($newobject) {

return $this->paikkadao->paivitaPaikka($newobject);

}

$this->yhteystietodao->poistaPaikanYhteystiedot($paikka_id);

$this->linkkidao->poistaPaikanLinkit($paikka_id);

$this->kuvadao->poistaPaikanKuvat($paikka_id);

$this->aukiolodao->poistaPaikanAukiolot($paikka_id);

return $this->paikkadao->poistaPaikka($paikka_id);

} }

?>

./api/api/schema/linkkischema.json

{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "linkki",

"description": "paikkaan liityvat www linkit", "type": "array",

"paikka_id": {

"required": ["paikka_id", "linki"]

}

./api/api/yhteystietoapi.class.php

<?php

include_once 'controller.class.php';

class YhteystietoApi extends Controller { private $yhteystietodao;

function __construct() {

$this->yhteystietodao = new YhteystietoDAO();

}

function luo($newobject) {

$id = $this->yhteystietodao->luoYhteystieto($newobject);

if($id != null) {

$yhteystieto = $this->yhteystietodao->haeyhteystieto($id);

return $yhteystieto;

}

function poista($id) {

return $this->yhteystietodao->poistaYhteystieto($id);

}

function haePaikantiedot($paikka_id) {

return $this->yhteystietodao->haePaikanYhteystiedot($paikka_id);

}

function paivita($yhteystieto) {

return $this->yhteystietodao->paivitaYhteystieto($yhteystieto);

} }

?>

./api/dao/aukiolodao.class.php

<?php

class AukioloDAO extends BaseDao{

public function luoAukioloAika($aukioloaika){

$aukioloaikaEntity = new Aukioloaika(); //make new model $aukioloaikaEntity->fromJson($aukioloaika);

error_log ("aukioloid " . $aukioloaikaEntity->getAukioloId());

$this->getEntityManager()->persist($aukioloaikaEntity);

$this->getEntityManager()->flush();

return $aukioloaikaEntity->getAukioloaika_id();

}

public function luoAukiolo($aukiolo){

$aukiolo_id = $this->getSequenceNextValue(null, "paikkatieto.aukiolo_aukiolo_id_seq");

$aukioloEntity = new Aukiolo(); //make new model $aukioloEntity->fromJson($aukiolo);

$aukioloEntity->setAukioloId($aukiolo_id);

$this->getEntityManager()->persist($aukioloEntity);

$this->getEntityManager()->flush();

public function poistaPaikanAukiolot($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT a FROM aukioloaika a WHERE a.paikka_id = " .

$paikka_id);

$aukioloajat = $query->getResult();

foreach($aukioloajat as $aukioloaika) {

$this->getEntityManager()->remove($aukioloaika);

}

$query = $this->getEntityManager()->createQuery("SELECT a FROM aukiolo a WHERE a.paikka_id = " . $paikka_id);

$aukiolot = $query->getResult();

public function haePaikanAukiolot($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT a FROM aukiolo a WHERE a.paikka_id = " . $paikka_id);

$aukiolot = $query->getResult();

return $aukiolot;

}

public function poistaAukiolo($id) { $conn = $this->getConnection();

$poistaPaikkaQuery = "delete from paikkatieto.aukioloaika where aukiolo_id = " . $id . ";";

$result = pg_query($conn, $poistaPaikkaQuery);

$paikkaEntity = $this->getEntityManager()->find("aukiolo", $id);

$this->getEntityManager()->remove($paikkaEntity);

$this->getEntityManager()->flush();

public function getConnection() {

$conn = pg_connect("host=172.27.48.64 port=5435 dbname=paikkatieto user=paikkatieto password=paik-katieto1234");

return $conn;

}

public function getGeojson($from) { if($from != null) {

public function getGeometry($geojson) { if($geojson != null) {

public function getSequenceNextValue($conn, $sequencename) { $dbConnection = $this->getEntityManager()->getConnection();

$nextvalQuery = $dbConnection->getDatabasePlatform()->getSequenceNextValSQL($sequencename);

return (int)$dbConnection->fetchColumn($nextvalQuery);

}

public function getEntityManager() { if(isset($this->entityManager)) { return $this->entityManager;

}

$isDevMode = true;

$ormconfig = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);

$ormconn = array(

$this->entityManager = EntityManager::create($ormconn, $ormconfig);

return $this->entityManager;

}

public function notFound($entityname) {

return "{ \"error\": \"Not found ".$entityname . "\"}";

class KuvaDAO extends BaseDao{

public function haeKuva($id) {

$kuvaEntity = $this->getEntityManager()->find("Kuva", $id);

return $kuvaEntity;

}

public function luoKuva($kuva){

$kuvaEntity = new Kuva();

$kuvaEntity->fromJson($kuva);

$this->getEntityManager()->persist($kuvaEntity);

$this->getEntityManager()->flush();

return $kuvaEntity->getKuva_id();

}

public function haePaikanKuvat($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT k FROM Kuva k WHERE k.paikka_id = " . $paikka_id);

$kuvat = $query->getResult();

return $kuvat;

}

public function poistaKuva($id) {

$kuvaEntity = $this->getEntityManager()->find("kuva", $id);

$this->getEntityManager()->remove($kuvaEntity);

$this->getEntityManager()->flush();

return "success";

}

public function poistaPaikanKuvat($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT k FROM Kuva k WHERE k.paikka_id = " . $paikka_id);

$kuvat = $query->getResult();

class LinkkiDAO extends BaseDao{

public function luoLinkki($linkki){

$linkkiEntity = new Linkki();

$linkkiEntity->fromJson($linkki);

$this->getEntityManager()->persist($linkkiEntity);

$this->getEntityManager()->flush();

return $linkkiEntity->getLinkki_id();

}

public function haeLinkki($linki_id){

$linkki = $this->getEntityManager()->find("Linkki", $linki_id);

if($linkki === null) {

$linkkiEntity = $this->getEntityManager()->find("Linkki", $id);

$this->getEntityManager()->remove($linkkiEntity);

$this->getEntityManager()->flush();

return "success";

}

public function haePaikanLinkit($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT l FROM Linkki l WHERE l.paikka_id = " . $paikka_id);

$linkit = $query->getResult();

return $linkit;

}

public function paivitaLinkki($linkki){

$linkkiEntity = $this->getEntityManager()->find("Linkki", $linkki['linkki_id']);

$linkkiEntity->fromJson($linkki);

$this->getEntityManager()->persist($linkkiEntity);

$this->getEntityManager()->flush();

return $linkkiEntity;

}

public function poistaPaikanLinkit($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT l FROM Linkki l WHERE l.paikka_id = " . $paikka_id);

$linkit = $query->getResult();

class LuokitteluDAO extends BaseDao { public function haeLuokittelut() {

$luokitteluRepository = $this->getEntityManager()->getRepository("Luokittelu");

$luokittelut = $luokitteluRepository->findBy(array(), array('nimi' => 'ASC'));;

return $luokittelut;

class PaikkaDAO extends BaseDAO { public function haeGeot() {

$paikkaRepository = $this->getEntityManager()->getRepository("Paikka");

$paikat = $paikkaRepository->findAll();

public function haePaikat($whereclause) {

$query = $this->getEntityManager()->createQuery("select p from Paikka p, Paikkatieto t where t.paikka_id = p.paikka_id " . $whereclause);

$paikkatiedot = $query->getResult();

foreach ($paikkatiedot as $paikka) { $paikkatieto = $paikka->getPaikkatieto();

$koordinaatti = $paikkatieto->getKoordinaatti();

$geokoordinaatti = $this->getGeojson($koordinaatti);

$paikkatieto->setKoordinaatti($geokoordinaatti);

$this->getEntityManager()->detach($paikka);

}

return $paikkatiedot;

}

public function haePaikka($id) {

$paikkaRepository = $this->getEntityManager()->getRepository("Paikka");

$paikka = $paikkaRepository->find($id);

$paikkatieto = $paikka->getPaikkatieto();

$koordinaatti = $paikkatieto->getKoordinaatti();

$geokoordinaatti = $this->getGeojson($koordinaatti);

$paikkatieto->setKoordinaatti($geokoordinaatti);

return $paikka;

}

public function luoPaikka($paikka) { $paikkaEntity = new Paikka();

$paikka_id = $this->getSequenceNextValue(null, "paikkatieto.paikka_paikka_id_seq");

$paikkaEntity->fromJson($paikka);

$paikkaEntity->setPaikka_id($paikka_id);

$paikkatieto = $paikka['paikkatieto'];

$paikkatietoEntity = new Paikkatieto();

$paikkatietoEntity->fromJson($paikkatieto);

$paikkatietoEntity->setKoordinaatti($this->getGeometry(json_encode($paikkatieto['koordinaatti'])));

$paikkatietoEntity->setPaikka_id($paikka_id);

$paikkatietoEntity->setPaikkatieto_id($paikka_id);

$paikkaEntity->setPaikkatieto($paikkatietoEntity);

$this->getEntityManager()->persist($paikkaEntity);

$this->getEntityManager()->flush();

return $paikka_id;

}

public function poistaPaikka($id) { $conn = $this->getConnection();

$poistaPaikkaQuery = "delete from paikkatieto.paikkatieto where paikka_id = " . $id . ";";

$result = pg_query($conn, $poistaPaikkaQuery);

$paikkaEntity = $this->getEntityManager()->find("paikka", $id);

$this->getEntityManager()->remove($paikkaEntity);

$this->getEntityManager()->flush();

return "success";

}

public function paivitaPaikka($paikka) {

$paikkaEntity = $this->getEntityManager()->find("paikka", $paikka['paikka_id']);

$paikkaEntity->fromJson($paikka);

$this->getEntityManager()->persist($paikkaEntity);

$this->getEntityManager()->flush();

$paikkatieto = $paikka['paikkatieto'];

$paikkatietoEntity = $this->getEntityManager()->find("paikkatieto", $paikkatieto['paikkatieto_id']);

$paikkatieto = $paikka['paikkatieto'];

$paikkatietoEntity->fromJson($paikkatieto);

$paikkatietoEntity->setKoordinaatti($this->getGeometry(json_encode($paikkatieto['koordinaatti'])));

$this->getEntityManager()->persist($paikkatietoEntity);

$this->getEntityManager()->flush();

return $this->haePaikka($paikkaEntity->getPaikka_id());

} }

?>

./api/dao/yhteystietodao.class.php

<?php

class YhteystietoDAO extends BaseDao{

public function luoYhteystieto($yhteystieto){

$yhteystietoEntity = new yhteystieto();

$yhteystietoEntity->fromJson($yhteystieto);

$this->getEntityManager()->persist($yhteystietoEntity);

$this->getEntityManager()->flush();

return $yhteystietoEntity->getYhteystieto_id();

}

public function haeyhteystieto($id) {

$yhteystieto = $this->getEntityManager()->find("yhteystieto", $id);

if($yhteystieto === null) {

return $this->notFound('yhteystieto');

}

return $yhteystieto;

}

public function haePaikanYhteystiedot($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT yht FROM yhteystieto yht WHERE yht.paikka_id = " .

$paikka_id);

$yhteystiedot = $query->getResult();

return $yhteystiedot;

}

public function poistaYhteystieto($id) {

$yhteystietoEntity = $this->getEntityManager()->find("yhteystieto", $id);

$this->getEntityManager()->remove($yhteystietoEntity);

$this->getEntityManager()->flush();

return "success";

}

public function paivitaYhteystieto($yhteystieto) {

$yhteystietoEntity = $this->getEntityManager()->find("yhteystieto", $yhteystieto['yhteystieto_id']);

$yhteystietoEntity->fromJson($yhteystieto);

$this->getEntityManager()->persist($yhteystietoEntity);

$this->getEntityManager()->flush();

return $yhteystietoEntity;

}

public function poistaPaikanYhteystiedot($paikka_id) {

$query = $this->getEntityManager()->createQuery("SELECT yht FROM yhteystieto yht WHERE yht.paikka_id = " .

$paikka_id);

/** * @Entity @Table(name="paikkatieto.aukiolo") */ class Aukiolo extends BaseModel {

/** @Id @Column(type="integer") @GeneratedValue **/

protected $aukiolo_id;

$this->aukiolo_id = $this->getValue($json, 'aukiolo_id');

$this->alkupaiva = $this->getValue($json, 'alkupaiva');

$this->loppupaiva = $this->getValue($json, 'loppupaiva');

$this->paikka_id = $this->getValue($json, 'paikka_id');

$this->selite = $this->getValue($json, 'selite');

} /**

* @return mixed */

public function getAukioloId() {

public function setAukioloId($aukiolo_id) {

public function getPaikkaId() {

public function setPaikkaId($paikka_id) {

public function getAlkupaiva() {

public function setAlkupaiva($alkupaiva) {

public function getLoppupaiva() {

return $this->loppupaiva;

} /**

* @param mixed $loppupaiva */

public function setLoppupaiva($loppupaiva) {

public function setSelite($selite) {

/** * @Entity @Table(name="paikkatieto.aukioloaika") */ class Aukioloaika extends BaseModel {

/** @Id @Column(type="integer") @GeneratedValue **/

protected $aukioloaika_id;

/** @Column(type="integer") **/

$this->aukioloaika_id = $this->getValue($json, 'aukioloaika_id');

$this->aukiolo_id = $this->getValue($json, 'aukiolo_id');

$this->paikka_id = $this->getValue($json, 'paikka_id');

$this->loppuaika = $this->getValue($json, 'loppuaika');

$this->alkuaika = $this->getValue($json, 'alkuaika');

$this->tyyppi_id = $this->getValue($json, 'tyyppi_id');

} /**

* @return mixed */

public function getAukioloaika_id() {

public function getPaikka_id() {

public function getTyyppi_id() {

public function getAlkuaika() {

public function setAukioloaika_id($aukioloaika_id) {

public function setPaikka_id($paikka_id) {

public function setTyyppi_id($tyyppi_id) {

public function setAlkuaika($alkuaika) {

public function setLoppuaika($loppuaika)

{

public function setAlkupaiva($alkupaiva) {

public function setLoppupaiva($loppupaiva) {

public function getAukioloId() {

public function setAukioloId($aukiolo_id) {

class BaseModel implements \JsonSerializable { public function jsonSerialize() {

$vars = get_object_vars($this);

return $vars;

}

public function getValue($json, $field) { if(isset($json[$field])) { return $json[$field];

} return null;

}

public function getGeometry($geojson) { $geojson = new GeoJSON();

public function getGeometry() {

public function getProperties() {

public function setType($type) {

public function setGeometry($geometry) {

public function setProperties($properties) {

$this->properties = $properties;

}

}

?>

./api/model/kategoria.class.php

<?php

/** * @Entity @Table(name="paikkatieto.kategoria") **/

class Kategoria {

/** @Id @Column(type="integer") @GeneratedValue **/

public $kategoria_id;

public function getKategoria_id() {

public function setKategoria_id($kategoria_id) {

public function setNimi($nimi) {

/** * @Entity @Table(name="paikkatieto.kuva") **/

class Kuva extends BaseModel {

/** @Id @Column(type="integer") @GeneratedValue **/

protected $kuva_id;

protected $tiedostonimi;

/** @Column(type="integer") **/

$this->paikka_id = $this->getValue($json, 'paikka_id');

$this->kuva = $this->getValue($json, 'kuva');

$this->tyyppi = $this->getValue($json, 'tyyppi');

$this->tiedostonimi = $this->getValue($json, 'tiedostonimi');

$this->koko = $this->getValue($json, 'koko');

public function getKuva_id() {

public function setKuvaus($kuvaus) {

public function getPaikka_id() {

public function setKuva_id($kuva_id) {

$this->kuva_id = $kuva_id;

} /**

* @param mixed $paikka_id */

public function setPaikka_id($paikka_id) {

public function setKuva($kuva) {

public function setTyyppi($tyyppi) {

public function getTiedostonimi() {

public function setTiedostonimi($tiedostonimi) {

public function setKoko($koko) {

/** * @Entity @Table(name="paikkatieto.linkki") **/

class Linkki extends BaseModel {

/** @Id @Column(type="integer") @GeneratedValue **/

protected $linkki_id;

$this->linkki_id=$this->getValue($json,'linkki_id');

$this->paikka_id=$this->getValue($json,'paikka_id');

$this->linkki=$this->getValue($json,'linkki');

} /**

* @return mixed */

public function getLinkki_id() {

public function getPaikka_id() {

public function setLinkki_id($linkki_id) {

public function setPaikka_id($paikka_id) {

$this->paikka_id = $paikka_id;

} /**

* @param mixed $linki */

public function setLinkki($linkki) {

/** * @Entity @Table(name="paikkatieto.luokittelu") **/

class Luokittelu {

/** @Id @Column(type="integer") @GeneratedValue **/

public $luokittelu_id;

public function getLuokittelu_id() {

public function getKategoria_id() {

public function setLuokittelu_id($luokittelu_id) {

public function setKategoria_id($kategoria_id) {

public function setNimi($nimi) {

/** * @Entity @Table(name="paikkatieto.paikka") **/

class Paikka extends BaseModel {

/** @Id @Column(type="integer") @GeneratedValue **/

protected $paikka_id;

/** @Column(type="integer") **/

protected $luokittelu_id;

/** @Column(type="string") **/

protected $nimi;

/** @Column(type="string") **/

protected $kuvaus;

/**

* @OneToOne(targetEntity="Paikkatieto", cascade={"persist"}) * @JoinColumn(name="paikka_id", referencedColumnName="paikkatieto_id") */

protected $paikkatieto;

function fromJson($json) {

$this->luokittelu_id=$this->getValue($json,'luokittelu_id');

$this->nimi=$this->getValue($json,'nimi');

$this->kuvaus=$this->getValue($json,'kuvaus');

} /**

* @return mixed */

public function getPaikkatieto() {

public function setPaikkatieto($paikkatieto) {

public function getPaikka_id() {

return $this->paikka_id;

} /**

* @return mixed */

public function getLuokittelu_id() {

public function setPaikka_id($paikka_id) {

public function setLuokittelu_id($luokittelu_id) {

public function setNimi($nimi) {

public function setKuvaus($kuvaus) {

/** * @Entity @Table(name="paikkatieto.paikkatieto") **/

class Paikkatieto extends BaseModel { /** @Id @Column(type="integer") **/

protected $paikkatieto_id;

/** @Column(type="integer") **/

protected $paikka_id;

/** @Column(type="string") **/

protected $osoite;

/** @Column(type="string") **/

protected $koordinaatti;

function fromJson($json) {

$this->paikkatieto_id=$this->getValue($json,'paikkatieto_id');

$this->paikka_id=$this->getValue($json,'paikka_id');

$this->osoite=$this->getValue($json,'osoite');

} /**

* @return mixed */

public function getPaikkatieto_id() {

public function getPaikka_id() {

public function getKoordinaatti() {

public function setPaikkatieto_id($paikkatieto_id) {

$this->paikkatieto_id = $paikkatieto_id;

} /**

* @param mixed $paikka_id */

public function setPaikka_id($paikka_id) {

public function setOsoite($osoite) {

public function setKoordinaatti($koordinaatti) {

/** * @Entity @Table(name="paikkatieto.yhteystieto") **/

class Yhteystieto extends BaseModel {

/** @Id @Column(type="integer") @GeneratedValue **/

protected $yhteystieto_id;

/** @Column(type="integer") **/

$this->yhteystieto_id=$this->getValue($json,'yhteystieto_id');

$this->paikka_id=$this->getValue($json,'paikka_id');

$this->nimi=$this->getValue($json,'nimi');

$this->puhelin=$this->getValue($json,'puhelin');

$this->sahkoposti=$this->getValue($json,'sahkoposti');

} /**

* @return mixed */

public function getYhteystieto_id() {

public function getPaikka_id() {

public function getPuhelin() {

public function getSahkoposti() {

public function setYhteystieto_id($yhteystieto_id) {

public function setPaikka_id($paikka_id) {

public function setNimi($nimi) {

public function setPuhelin($puhelin) {

$this->puhelin = $puhelin;

} /**

* @param mixed $sahkoposti

*/

public function setSahkoposti($sahkoposti) {

$explode_url = explode('/', $url);

$explode_url = array_slice($explode_url, 2);

$controllerName = $explode_url[1];

$id=null;

$subAction=null;

if(isset($explode_url[3])) { $subAction = $explode_url[1];

$pos = strpos($explode_url[3],"?");

$id = $explode_url[2];

if($pos === false) {

$controllerName = $explode_url[3];

} else {

$controllerName = substr($explode_url[3],0,$pos);

}

} else if(isset($explode_url[2])) { $pos = strpos($explode_url[2],"?");

if($pos === false) {

if($controller != null) {

echo $controller->dispatch($subAction,$id);

} else {

header('Content-type: application/json; charset=iso-8859-1');

echo "{ \"error\": \"tuntematon toiminto\" }";

}

Liite 3 YLLÄPITOKÄYTTÖLIITTYMÄN LÄHDEKOODIT

./gui/css/gui.css

.jsgrid-edit-row > .jsgrid-cell { font-weight: bold;

background: #999;

}

.jsgrid-filter-row > .jsgrid-cell { font-weight: bold;

background: #c3c3c3;

}

.jsgrid-insert-row > .jsgrid-cell { font-weight: bold;

border-bottom: 2px solid #ddd;

margin-bottom: 20px;

padding: 20px 12px 10px 20px;

font: 13px Arial, Helvetica, sans-serif;

} .form {

max-width: 500px;

padding: 20px 12px 10px 20px;

font: 13px Arial, Helvetica, sans-serif;

} .label{

display: block;

margin: 0px 0px 15px 0px;

font-weight: bold;

border: 1px solid #C2C2C2;

box-shadow: 1px 1px 4px #EBEBEB;

-moz-box-shadow: 1px 1px 4px #EBEBEB;

-webkit-box-shadow: 1px 1px 4px #EBEBEB;

border-radius: 3px;

-moz-box-shadow: 0 0 8px #88D5E9;

-webkit-box-shadow: 0 0 8px #88D5E9;

box-shadow: 0 0 8px #88D5E9;

border: 1px solid #88D5E9;

}

.form input[type=submit], .form input[type=button]{

background: #4B99AD;

padding: 8px 15px 8px 15px;

border: none;

color: #fff;

} .form input[type=submit]:hover, .form input[type=button]:hover{

background: #4691A4;

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<link rel="stylesheet" href="../map/leaflet/leaflet.css">

<script src="js/gui.js"></script>

<div class="heading">Anna paikan tiedot</div>

<div id="tabs">

<form id="lisaaAukioloForm" >

<fieldset>

<in-put type="hidden" name="paikka_id" id="aukiolo_paikka_id" value="15"/>

<la-bel class="la<la-bel" for="aukiolo">Aukiolo</la<la-bel>

<la-bel class="la<la-bel" for="aukioloalkupaiva">Alku päivä ja loppu päivä</la<la-bel>

<in-put type="date" name="alkupaiva" id="aukioloalkupaiva">

<in-put type="date" name="loppupaiva" id="aukiololoppupaiva">

<la-bel class="la<la-bel" for="selite">Selite</la<la-bel>

<in-put type="text" name="selite" id="selite">

<la-bel class="la<la-bel" for="maanantai">Maanantai alkuaika ja loppuaika</la<la-bel>

<in-put type="time" name="maanantai[alkuaika]" id="time11">

<in-put type="time" name="maanantai[loppuaika]" id="time12">

<la-bel class="la<la-bel" for="tiistai">Tiistai alkuaika ja loppuaika</la<la-bel>

<in-put type="time" name="tiistai[alkuaika]">

<in-put type="time" name="tiistai[loppuaika]">

<la-bel class="la<la-bel" for="keskiviikko">Keskiviikko alkuaika ja loppuaika</la<la-bel>

<in-put type="time" name="keskiviikko[alkuaika]">

<in-put type="time" name="keskiviikko[loppuaika]">

<la-bel class="la<la-bel" for="torstai">Torstai alkuaika ja loppuaika</la<la-bel>

<in-put type="time" name="torstai[alkuaika]">

<in-put type="time" name="torstai[loppuaika]">

<la-bel class="la<la-bel" for="perjantai">Perjantai alkuaika ja loppuaika</la<la-bel>

<in-put type="time" name="perjantai[alkuaika]">

<in-put type="time" name="perjantai[loppuaika]">

<la-bel class="la<la-bel" for="lauantai">Lauantai alkuaika ja loppuaika</la<la-bel>

<in-put type="time" name="lauantai[alkuaika]">

<in-put type="time" name="lauantai[loppuaika]">

<la-bel class="la<la-bel" for="sunnuntai">Sunnuntai alkuaika ja loppuaika</la<la-bel>

<in-put type="time" name="sunnuntai[alkuaika]">

<in-put type="time" name="sunnuntai[loppuaika]">

<in-put class="button" type="button" onclick="submitLisaaAukiolo();" value="Lisää" />

</fieldset> <in-put type="hidden" name="paikka_id" id="kuva_paikka_id" value="15"/>

<la-bel class="la<la-bel" for="kuva">Tallenna kuva</la<la-bel>

<in-put type="file" name="kuva" id="kuva">

<in-put class="button" type="button" onclick="submitLisaaKuva();" value="Lisää" />

</fieldset> var g_paikka_id = 0;

var g_paikka = null;

var g_paikka_bInserting;

var g_osoite = null;

class RestController {

dataType: "json",

url: "../api/paikkaapi.php/luokittelu/kaikki", data: '',

type: "GET", async: false, success: function(data) {

data.unshift({

"kategoria_id" : 0, "luokittelu_id": 0, "nimi": "---valitse---"

})

url: "../api/paikkaapi.php/paikka/"+g_paikka_id+"/"+apiName, data: filter,

if(apiName === "paikka") {

item.paikkatieto.koordinaatti.type = "Point";

updateItem(item,apiName) { return $.ajax({

deleteItem(item,apiName) {

var id;

var restcontroller = new RestController();

$(function() {

restcontroller.haeLuokittelut();

});

function initGrid(gridDivId,apiName,gridFields,bKaikki,bEditable, bInserting) { console.log(gridDivId);

console.log(apiName);

console.log(gridFields);

$(gridDivId).jsGrid({

width: "100%",

try {

return restcontroller.loadData(filter,apiName,bKaikki);

},

insertItem: function(item) {

return restcontroller.insertItem(item,apiName);

},

updateItem: function(item) {

return restcontroller.updateItem(item,apiName);

},

deleteItem: function(item) {

return restcontroller.deleteItem(item,apiName);

}

var paikkaGridFields = [

{ name: "paikka_id", title: "PaikkaId", type: "integer", width: 50, readOnly: true,

{ name: "paikka_id", title: "PaikkaId", type: "integer", width: 50, readOnly: true,

LIITTYVÄT TIEDOSTOT