Ja ostatnio zbudowałem sobie zestaw do tworzenia słowników z bazy danych w oparciu o własną warstwę abstrakcyjną do łączenia się z bazą.
Problem już wcześniej miałem rozwiązany funkcjami (funkcja do selecta, do multiselect, do checkboxa) ale jakoś mi się to nie podobało i teraz mam jeden mały zestaw:
abstract.menuList.php
abstract class menuList {
protected $sortBy;
protected $sql;
protected $tableName;
protected $fieldName;
protected $idName;
protected $checkBy;
private $whereAnd = array(); private $whereOr = array(); private $db;
abstract public function PrintList();
abstract protected function prepear();
public function __construct($tableName, $fieldName, $idName) {
...}
protected function getItemDB() {
...}
protected function addWhereAnd($item) {
...}
protected function addWhereOr($item) {
...}
public function sortByName($rodzaj = 'ASC') {
...}
public function sortById($rodzaj = 'ASC') {
...}
public function checkById(){
...}
public function checkByName(){
...}
}
(na potrzeby pytania wykasowałem środek bo trochę tego jest)
czyli klasa robi prawie wszystko poza odpowiednim wyglądem. A teraz dziedziczenie:
include_once 'abstract.menuList.php';
/**
* Klasa odpowiedzialna za wyświetlenie listy Radio na podstawie słowników
* z bazy danych
*
* @author Paweł Wołkowski
*
* @param uchwyt $con połaczenie z bazą danych
* @param string $tableName nazwa tabeli z której będzie tworzona rozwijalna lista
* @param string $fieldName wyświetlane pole w liście
* @param string $idName pole odpowiedzialne za identyfikator zrwacany z listy (id tabeli)
* @param variant $checkVal wartość domyślnego zaznaczenia (default = 0)
* @param boolean $aktywny wyświetlaj tylko aktywne wiersze (default = true)
*/
class radioList extends menuList {
private $checkVal;
private $aktywny;
private $obrazki = False;
private $scierzka;
private $sortName;
public function __construct($tableName, $fieldName, $idName, $checkVal = 0, $aktywny = True) {
parent::__construct($tableName, $fieldName, $idName);
}
protected function prepear() {
if($this->aktywny == TRUE) {
$this->addWhereAnd("aktywny = 't'");
}
if($this->checkVal != 0) $this->addWhereOr($this->idName = $this->checkVal);
$this->sortById();
}
/**
* Funckaja ustawia parametr obrazki na true/false jeżeli w liście radio zamiast tekstu
* mają być wyświetlane obrazki
* @param boolean
*/
public function setObrazki($obrazki) {
$this->obrazki = $obrazki;
}
/**
* Funckaja ustawia parametr ścierzka na string jeżeli w liście radio zamiast tekstu
* mają być wyświetlane obrazki wg podanej ścierzki
* @param string $scierzka
*/
public function setScierzka($scierzka = 'pic/') {
$this->scierzka = $scierzka;
}
public function PrintList() {
$ar = $this->getItemDB();
foreach ($ar as $pole) {
if($this->checkVal == $pole[$this->fieldName]) {
$selected = ' checked="checked" ';
}else {
$selected = '';
}
if($this->obrazki){
$label = '<img src="pic/'.$pole[$this->fieldName].'.png" width="16" height="16" alt="'.$pole[$this->fieldName].'" title="'.$pole[$this->fieldName].'"/>';
}else{
$label = $pole[$this->fieldName];
}
$tekst .= '<input type="radio" '.$selected.' name="'.$this->tableName.'" value="'.$pole['id'].'" /><label for="imie">'.$label.'</label>';
}
return $tekst;
}
}
Druga klasa
include_once 'abstract.menuList.php';
/**
*
*
* @author Paweł Wołkowski
*
*/
final class selectMenu extends menuList {
private $aktywny;
private $checkVal;
private $wolne;
private $firstField = '___BRAK___';
public function __construct($tableName, $fieldName, $idName, $checkVal = '', $aktywny = False, $wolne = False) {
parent::__construct($tableName, $fieldName, $idName);
$this->aktywny = $aktywny;
$this->checkVal = $checkVal;
$this->wolne = $wolne;
$this->prepear();
}
protected function prepear() {
if($this->aktywny == TRUE) {
$this->addWhereAnd("aktywny = 't'");
if($this->checkVal != '') {
$this->addWhereOr("$this->idName = $this->checkVal");
}
}
if($this->wolne == TRUE) {
$this->addWhereAnd("stan = 'W'");
if($this->checkVal != '') {
$this->addWhereOr("$this->idName = $this->checkVal");
}
}
$this->checkByName();
$this->sortByName();
}
public function PrintList() {
$ar = $this->getItemDB();
$tekst = '<SELECT NAME="'.$this->idName.'" SIZE="1" style="width:111">'. "\n";
$tekst .= '<OPTION VALUE="">'.$this->firstField.'</OPTION>'. "\n";
foreach ($ar as $pole) {
if($this->checkVal == $pole[$this->checkBy]) {
$selected = ' SELECTED = "SELECTED" ';
}else {
$selected = '';
}
$tekst .= '<OPTION VALUE="'.$pole[$this->idName].'"'.$selected.'>'.$pole[$this->fieldName].'</OPTION>'. "\n";
}
$tekst .= '</SELECT>'. "\n";
return $tekst;
}
}
$test = new selectMenu('nawigacja', 'numer_ewidencyjny', 'id_naw','30');//nawigacja nazwa tabeli, numer_ewidencyjny - wyświetlana wartość, id_naw zwracany identyfikator, 30 - zaznaczona pozycja
$test->checkById();
$test->sortByName('DESC');//standardowo malejąco ale jak trzeba to można rosnąco
Dziedziczenie jest w tym przypadku bardzo fajne bo teraz wpadłem na pomysł i chcę rozbudować te klasy o możliwość podawania tablicy z której wygenerowane zostaną słowniki a nie jak teraz tylko z bazy. Tak musiałbym przerabiać funkcje pod nowe wymagania a tak tylko przeciążenie konstruktora i pozamiatane (IMG:
style_emoticons/default/smile.gif)