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,