<?php
/**
* Klasa Fieldset
*
* Klasa udostepniająca jednolity interface do pobierania i modyfikacji danych.
Nie można bezpośrednio utworzyć obiektu klasy. Jedynie przez klasę potomną.
* Klasy nie się zastosować w przypadu tabel - relacji, w których nie ma jasno określonego klucza podstawowego. Rozwiązaniem t
ego problemu może być
* utworzenie widoku.
*
* @author Maciej "Batman" Wilgucki
* @package DataList
*
*/
abstract class Fieldset
{
/**
* Nazwa tabeli, którą wykorzystuje klasa
*
* @var string
*/
protected $stable;
/**
* Nazwa pola będącego kluczem podstawowym
*
* @var string
*/
protected $idfield;
/**
* Wartość pola będącego kluczem podstawowym
*
* @var mixed
*/
protected $idvalue;
/**
* Flaga określająca, czy dane zostały już załadowane
*
* @var bool
*/
protected $bloaded = false;
/**
* Tablica asocjacyjna zawierająca wiersz o identyfikatorze określonym przez $id
value
*
* @var array
*/
protected
$arow = array();
/**
* Flaga określająca, czy dokonano modyfikacji danych
*
* @var bool
*/
protected $bmodified = false;
/**
* Tablica asocjacyjna zawierająca zmodyfikowane pola
*
* @var array
*/
protected
$amodified_fields = array();
/**
* Metoda, która powinna zwracać kod SQL odpytujący bazę pod kątem ilości wiersz
y w tabeli. Musi zostać zadeklarowana w klasie potomnej
*/
abstract public function getTotal();
/**
* Metoda, która powinna zwracać kod SQL zwracający dane z bazy danych. Musi zos
tać zadeklarowana w klasie potomnej
*/
abstract public function getList();
/**
* Inicjalizacja obiektu (nie mylić z konstruktorem). Metoda ta musi być wywołana, nim jakiekolwiek inne operacje na danych będ
ą wykonywane.
* W metodzie tej ustawiane są nazwa tabeli, nazwa pola będącego kluczem podstaw
owym oraz opcjonalnie wartość tego pola
*
* @param string nazwa tabeli
* @param string nazwa pola będącego kluczem podstawowym
* @param string wartość pola będącego kluczem podstawowym
* @return void
*/
public function init($stable,$idfield,$idvalue=0) {
$this->stable = $stable;
$this->idfield = $idfield;
$this->idvalue = (int)$idvalue;
}
/**
* Zapisanie wiersza, jeśli jeszcze to nie miało miejsca, do tabeli asocjacyjnej
. Jeśli wiersz został pobrany,
* wówczas wszystkie zapytania o wartości poszczególnych pól, będą kierowane do
tablicy asocjacyjen $arow.
*
* @return void
*/
public function load() {
if(!$this->bloaded) $this->forceLoad();
}
/**
* Wymuszenie pobrania danych z bazy danych. Zawartość tablicy asocjacyjnej $aro
w zostaje zastąpiona wartościami pobranymi z bazy.
* Nie powinno się używać tej metody do ładowania danych, ponieważ każde jej wyw
ołanie powoduje wykonanie zapytania do bazy danych,
* co może spowodować spadek wydajności.
*
* @return void
*/
public function forceLoad() {
throw new FieldSetException("You can't load data with empty params. Use init first!");
$sql = "select * from ".$this->stable." where ".$this->idfield." = ".$this->idvalue;
$Connection = Connection::Main();
$tab = $Connection->getRows($sql);
$this->arow = $tab[0];
$this->bloaded = true;
}
/**
* Pobranie wartości pola bazy danych
*
* @param string nazwa pola z tabeli, którego wartość ma zostać zwrócona
*
* @return string
*/
public function getField($sname) {
if(!$this->bloaded) $this->load();
throw new FieldSetException("There is no <b>$sname</b> field in ".$this->stable);
return $this->arow[$sname];
}
/**
* Zapisanie nowej wartosci pola. By dane zostały zapisane do bazy należy wywoła
ć metodę save
* @see save
*
* @param string nazwa pola z tabeli, którego wartość ma zostać zapisana
* @param string wartość, która ma zostać zapisana
*
* @return void
*/
public function setField($sname, $svalue) {
$this->bmodified = true;
$this->amodified_fields[$sname] = $svalue;
}
/**
* Zapisuje do bazy danych zmiany dokonane w wiersdzu. Jeśli dane nie zostały wc
zesniej załadowane lub nie jest okreslona wartość
* pola bedącego kluczem podstawowym, wówczas dane dodawane są do tabeli. W prze
ciwnym razie - modyfikowane.
*
* @return void
*/
public function save() {
if($this->bmodified) {
$Connection = Connection::Main();
if($this->bloaded && $this->idvalue > 0)
$Connection->update($this->stable,$this->amodified_fields,"where ".$this->idfield." = ".$this->idvalue);
else
$Connection->insert($this->stable,$this->amodified_fields);
}
}
}
?>