Při rozsáhlejších projektech je a pravděpodobně vždy bude potřeba rozšířit typy obsahu WordPressu o nějaké vlastní. Nemyslím tím jenom custom post_type – ale udělat například i databázový model. Poté je potřeba také tato data nějak z databáze číst, mazat, ukládat a přidávat. Pro tento účel vznikl abstraktní objekt KT CRUD (Create, Read, Update, Delete).
Nezapomeňte, že se jedná o model – jeho umístění bude tedy v příslušné složce: …/yours/models/kt_wp_fw_crud_model.inc.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php class KT_WP_FW_CRUD_Model extends KT_Crud { const TABLE = "kt_wp_fw_crud_table"; const PREFIX = "custom_crud_prefix"; const FORM_PREFIX = "kt-crud-form-prefix"; // sloupce v DB // jednotlivé názvy sloupců si také definujeme jako konstanty // Vždy je zde najdeme a nestane se nám, že bychom název popletli const ID_COLUMN = "id"; const TITLE_COLUMN = "title"; const DESCRIPTION_COLUMN = "description"; const VISIBILITY_COLUMN = "visibility"; public function __construct($rowId = null) { parent::__construct( self::TABLE, // Název naší tabulky self::ID_COLUMN, // Primární sloupec pro select na ID záznamu null, // Prefix sloupců, který nyní nebudeme používat $rowId // Případné ID záznamu ); } // Vždy je nutné mít zavedenou abstraktní metodu initColumns // která zavede potřebnou kolekci sloupců. protected function initColumns() { $this->addColumn(self::ID_COLUMN, KT_CRUD_Column::INT); $this->addColumn(self::TITLE_COLUMN); $this->addColumn(self::DESCRIPTION_COLUMN); $this->addColumn(self::VISIBILITY_COLUMN, KT_CRUD_Column::INT); } } |
V rámci nového modelu je důležité vždy definovat několik konstant:
Těchto několik konstant doporučujeme vždy definovat. Pokud je nevyplníte, nic se nestane. Budete ale poté odkázání vždy na string pro dané údaje, což je nepraktické a do budoucna velmi neefektivní.
Každý model, který dětí svou základní strukturu z KT CRUD musí mít zavedenou abstraktní metodu initColumns() která zajišťuje nastavení všech sloupců, s kterými bude model pracovat.
Přidá do kolekce sloupců modelu nový model
|
1 2 |
$model->addColumn("id", KT_CRUD_Column::INT, false); // ... |
Tímto způsobem je nutné přidat všechny sloupce, s kterými bude KT CRUD model dále pracovat – vše se zavádí v rámci abstraktní metody initColumns().
Pokud potřebujeme po definici sloupců získat instanci daného sloupce, můžeme využít tuto funkci.
|
1 2 |
$idColumn = $model->getColumnByName("title"); $idColumn->setValue("Hello world"); |
V rámci CRUD modelů je možné využívat dva „typy“ inicializace modelu.
|
1 2 3 4 5 |
$model = new KT_WP_FW_CRUD_Model(); // Nyní v modelu nic není - žádná data. Pouze "prázdná" instance modelu $model = new KT_WP_FW_CRUD_Model(1); // Nyní jsou v modelu načtena data záznamu z tabulky s ID 1 |
Funkce sama rozpozná, zda se má provést UPDATE nebo INSERT záznamu na základě toho, zda byla data modelu načtena z DB nebo se jedná o nový model bez existujícího ID.
|
1 2 3 4 5 6 7 8 9 10 11 |
// Model provede INSERT nového záznamu $model = new KT_WP_FW_CRUD_Model(); $model->addNewColumnToData(self::TITLE_COLUMN, "Titulek záznamu"); $model->saveRow(); // Provede se UPDATE záznamu na ID 1 $model = new KT_WP_FW_CRUD_Model(1); $model->addNewColumnToData(self::TITLE_COLUMN, "Změna titulku záznamu"); $model->saveRow(); |
Provede DELETE daného záznamu, který byl načten z DB. Pokud záznam neexistuje, neprovede se žádná operace.
|
1 2 3 4 |
// Záznam s ID 1 bude trvale odstraněn $model = new KT_WP_FW_CRUD_Model(1); $model->deleteRow(); |
Vrátí logickou hodnotu na základě toho, zda model při komunikaci s DB obdržel nějakou chybu a operace se neprovedla.
|
1 2 3 4 5 6 7 8 9 10 |
$model = new KT_WP_FW_CRUD_Model(1); $model->saveRow(); // Vypíše chyby, které vznikly při komunikaci s DB if($model->hasError()){ $errors = $model->getErrors(); foreach($errors as $error){ echo $error; } } |
Model obsahuje základní sadu funkcí, kterou je možné využívat pro manipulaci, přidávání a změnu dat daného modelu.
Přidá hodnotu na název daného sloupce.
|
1 2 |
$model->addNewColumnValue(self::VISIBILITY_COLUMN, 0) ->addNewColumnValue(self::TITLE_COLUMN, "Název záznamu"); |
Přidá hodnoty na příslušné sloupce. Pole je zadáváno ve tvaru $columnName => $columnValue. U funkce je důležité, že provádí merge dat. Můžete pomocí funkce přidávat části dat po částech bez toho, že byste přepsali již naplněná data. Dochází však k přepisu jednotlivých hodnot sloupců!
|
1 2 3 4 5 |
$model->addNewColumnsToValue(array( self::TITLE_COLUMN => "Titulek záznamu", self::DESCRIPTION_COLUMN => "Nějaký popisek záznamu", self::VISIBILITY_COLUMN => 2 )); |
Nastaví a přemaže všechna existující data daty novými – například i prázdným polem pro smazání všech údajů sloupců. Zde již neprobíhá merge dat, ale „tvrdý“ set jiné hodnoty.
|
1 2 3 4 5 6 7 8 9 10 |
$model->addNewColumnToData(self::TITLE_COLUMN, "Titulek záznamu); // Nyní je ve sloupci title naše hodnota $model->setData(array( self::VISIBILITY_COLUMN => 0 )); // Původní data a title byl přenastaven novou sadou hodnot, kde je definovaný // Pouze sloupec visibility |
Vrátí hodnotu na daném názvu sloupce
|
1 2 3 4 5 6 7 8 |
$title = $model->getColumnValue(self::TITLE_COLUMN); $description = $model->getColumnValue(self::DESCRIPTION_COLUMN); // K datům se dá přistupovat i pomocí stringu; doporučujeme však využívat popsané // Funkce, které k tomu byly připraveny. $title = $model->title; // title = přesný název sloupce $description = $model->description // description = přesný název sloupce |
Vrátí pole se všemi sloupci a hodnotami, které jsou v modelu nastaveny. V podobě $columnName => $columnValue.
|
1 2 3 4 |
$allData = $model->getData(); $title = $allData[self::TITLE_COLUMN]; ... |
Po načtení modelu pomocí ID záznamu v inicializaci vrátí, zda záznam v DB skutečně existoval.
|
1 2 3 4 5 6 |
$model = new KT_WP_FW_CRUD_Model(545); if(! $model->isInDatabase()){ echo "Je nám líto, tento záznam v naší databázi neexistuje"; return; } |
Pro náš definovaný model by nám měla chybět ještě základní sada getterů a setterů pro získání jednotlivých dat. Můžeme využívat připravené funkce KT CRUD, ale pohodlnější, čistější a správné je, si jednotlivé „sloupce“ připravit ještě na modelu samotném.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
class KT_WP_FW_CRUD_Model extends KT_Crud { const TABLE = "kt_wp_fw_crud_table"; const ORDER_COLUMN = self::TITLE_COLUMN; const PREFIX = "custom_crud_prefix"; const FORM_PREFIX = "kt-crud-form-prefix"; // sloupce v DB const ID_COLUMN = "id"; const TITLE_COLUMN = "title"; const DESCRIPTION_COLUMN = "description"; const VISIBILITY_COLUMN = "visibility"; public function __construct($rowId = null) { parent::__construct( self::TABLE, // Název naší tabulky self::ID_COLUMN, // Primární sloupec pro select na ID záznamu null, // Prefix sloupců, který nyní nebudeme používat $rowId // Případné ID záznamu ); } // --- GETTERY a SETTERY --------------- // gettery public function getTitle(){ return $this->getColumnValue(self::TITLE_COLUMN); } public function getDescription(){ return $this->getColumnValue(self::DESCRIPTION_COLUMN); } public function getVisibility(){ return $this->getColumnValue(self::VISIBILITY_COLUMN); } // settery public function setTitle( $title = null ){ $this->addNewColumnToData(self::TITLE_COLUMN, $title); } public function setDescription( $description = null ){ $this->addNewColumnToData(self::DESCRIPTION_COLUMN, $description); } public function setVisibility( $visibility = null ){ $this->addNewColumnToData(self::VISIBILITY_COLUMN, $visibility); } /--- inicializace sloupců ------------------ protected function initColumns() { $this->addColumn(self::ID_COLUMN, KT_CRUD_Column::INT); $this->addColumn(self::TITLE_COLUMN); $this->addColumn(self::DESCRIPTION_COLUMN); $this->addColumn(self::VISIBILITY_COLUMN, KT_CRUD_Column::INT); } } |
Jistě si všimnete, že nemáme getter a setter pro ID samotné. To definovat není potřeba, protože v konstruktoru jsme definovali primární název sloupce. CRUD vždy počítá alespoň s jedním sloupcem a proto má getId() a setId() připravené defaultně a odkazuje se na název právě privátního názvu sloupce.
Odebírejte novinky z FW
Sledujte nás!
Follow @BriloTeam!