Les 5 – Database koppelen en Create & Read

Lesbeschrijving

In deze les gaan we de applicatie met de database tabel uitbreiden. Voordat de de CRUD gemaakt kan worden moet er fysiek een database tabel gemaakt worden. In WordPress moet een database uitbreiding tijdens de installatie procedure worden uitgevoerd. Het gedeelte installatie en de-installatie wordt later in de tutorial behandeld. Daarom maken we nu de tabel aan in een programma zoals PHPMyAdmin of MySql Workbench.

WordPress $wpdb.

In WordPress worden database acties via de globale variabele $wpdb (WordPress database) afgehandeld. Omdat WordPress meerdere installaties in 1 database faciliteert kun je voor elke installatie een database tabel prefix opgeven. De default hiervoor is wp_. Deze tabel prefix moet je zelf ook gebruiken, je kunt deze ophalen via :

$wpdb->prefix

Tabel naam

Elke tabel begint dus met de wordpress prefix, daarbij is het ook handig om je eigen prefix te gebruiken, daardoor heb je niet gauw een probleem met eventuele tabellen van andere plugins. Ook is het handig om jouw tabellen allemaal onder elkaar te hebben staan, omdat ze dezelfde prefix hebben.

In deze tutorial gebruiken we de prefix meo voor de tabellen.

Stappenplan

1. Database tabel aanmaken.

Maak de volgende tabel aan met de naam ( tabel prefix is hier wp_ / project prefix is meo ) wp_meo_event_category.

Name Type Null Extra Index
id_event_category Bigint(10) No AUTO_INCREMENT Primary
name Varchar(32) No Unique
description Varchar(1024) No

2. Event categorieën tellen in database

Eerst voegen we nu in de klasse EventCategory een functie toe die het aantal event categorieën telt. Hiervoor moeten we de database functionaliteit van wordpress ($wpdb) toevoegen. Daarna kunnen we de query maken en uitvoeren.

Open EventCategory.php en verander de volgende functie:

* @return int number of Event categories stored in db
*/
public function getNrOfEventCategories(){
global $wpdb;

$query = "SELECT COUNT(*) AS nr FROM `". $wpdb->prefix ."meo_event_category`";
$result = $wpdb->get_results( $query, ARRAY_A );

return $result[0]['nr'];
}

3. Read functionaliteit toevoegen

Voordat de Create wordt uitgewerkt ga je eerst de Read functionaliteit toevoegen. Hierdoor kun je de Create ook meteen testen. Hiervoor moet er eerst in de klasse functionaliteit worden toegevoegd dit bestaat uit de volgende stappen:

  • Functie toevoegen om een lijstje met objecten van het type EventCategory uit de database te lezen.
  • Getters toevoegen om de info op het scherm te zetten.
  • Setter toevoegen om de info uit de database in de klasse te zetten.
  • Gui aanpassen om de lijst op het scherm te kunnen zetten.

3.2 Functie om lijstje op te halen maken

Maak een functie die uit de database alle event categorieën uitleest en ze in een array met objecten van het type EventCategory zet.

Voeg de volgende functie toe:

/**
* 
* @return type
*/
public function getEventCategoryList(){
global $wpdb;
$return_array = array();
$result_array = $wpdb->get_results( "SELECT * FROM `". $wpdb->prefix . "meo_event_category` ORDER BY `id_event_category`", ARRAY_A);
/*
echo '<pre>';
echo __FILE__.__LINE__.'<br />';
var_dump($result_array);
echo '</pre>';
//*/

// For all database results:
foreach ( $result_array as $idx => $array){

// New object
$cat = new EventCategory();

// Set all info
$cat->setName($array['name']);
$cat->setId($array['id_event_category']);
$cat->setDescription($array['description']);

// Add new object toe return array.
$return_array[] = $cat;
}
return $return_array;
}

Je ziet dat er hier gebruik gemaakt wordt van setters. Deze bestaan nu nog niet, dus maak je die in de volgende stap aan.

3.3 Setters toevoegen

Voeg voor alle klasse attributen een set functie toe aan het begin van de klasse :

/**
* 
* @param type $id Id of the event category
*/
public function setId( $id ){
if ( is_int(intval($id) ) ){
$this->id = $id;
}
}

/**
* 
* @param type $name name of the event category
*/
public function setName( $name ){
if ( is_string( $name )){
$this->name = trim($name);
}
}

/**
* 
* @param type $desc The help text of the event category
*/
public function setDescription ($desc){
if ( is_string($desc)){
$this->decription = trim($desc);
}
}

3.4 Getters in de klasse toevoegen

Voeg voor alle klasse attributen een get functie toe:

/**
* 
* @return int The db id of this event
*/
public function getId(){
return $this->id;
}

/**
* 
* @return string The name of the Event Category
*/
public function getName(){
return $this->name;
}

/**
* 
* @return string The help text of the description
*/
public function getDescription(){
return $this->decription;
}

3.5 GUI aanpassen

In de GUI ga je de lijst nu op het scherm tonen door de volgende code toe te voegen:

<tr><td colspan="3">Start adding Event Categories</tr>
<?php } 
else {
$cat_list = $event_categories->getEventCategoryList();

//** Show all event categories in the tabel
foreach( $cat_list as $event_cat_obj){
?>
<tr>
<td width="10"><?php echo $event_cat_obj->getId(); ?></td>
<td width="180"><?php echo $event_cat_obj->getName(); ?></td>
<td width="200"><?php echo $event_cat_obj->getDescription();?></td>
<td><button onclick="myFunction(<?php echo $event_cat_obj->getId();?>)">Click me</button></td>
</tr>
<?php    
}

4. Save functie werkend maken

Voordat je nu de save toevoegt in de GUI, moet de save eerst werkend gemaakt worden. Dat betekend dat je nu de SQL code en database functionaliteit gaat toevoegen.

Voor de fout afhandeling maak je gebruik van de object georiënteerde functionaliteit exception handling. Dit zie je terug komen in de try, throw, catch functionaliteit. Later ga je de plek waar de fout wordt opgevangen (Catch) aanpassen, voor nu zetten we het probleem gewoon op het scherm.

Verander de save() functie in EventCategory naar:

/**
* 
* @global type $wpdb The WordPress database class
* @param type $input_array containing insert data
* @return boolean TRUE on succes OR FALSE
*/
public function save($input_array){
try {
if ( !isset($input_array['name']) OR !isset($input_array['description'])){

// Mandatory fields are missing
throw new Exception(__("Missing mandatory fields"));
}

if (  (strlen($input_array['name']) < 1) OR (strlen($input_array['description']) < 1) ){

// Mandatory fields are empty
throw new Exception( __("Empty mandatory fields") );  
}

global $wpdb;

// Insert query
$wpdb->query($wpdb->prepare("INSERT INTO `". $wpdb->prefix .
"meo_event_category` ( `name`, `description`)".
" VALUES ( '%s', '%s');",$input_array['name'], 
$input_array['description']) );

// Error ? It's in there:
if ( !empty($wpdb->last_error) ){
$this->last_error = $wpdb->last_error;
return FALSE;
}

/*
echo '<pre>';
echo __FILE__.__LINE__.'<br />';
var_dump($wpdb);
echo '</pre>';
/
/*/

//echo 'Insert name and description for this Category:"'.$input_array['name'].
//        '"-"'. $input_array['description'].'"<br />';

} catch (Exception $exc) {
// @todo: Add error handling
echo '<pre>'. $exc->getTraceAsString() .'</pre>';
}

return TRUE;

}

5. Save functie in GUI aanroepen

De laatste stap is om de klasse save functie in de GUI te gaan gebruiken. Hiervoor moet je wel eerst checken of het formulier is verzonden en dus of er data aanwezig is.

Voeg de volgende code toe:

// Get the POST data in filtered array
$post_array = $event_categories->getPostValues();

// Collect Errors
$error = FALSE;

// Check the POST data 
if(!empty($post_array)){
// Check the add form:
$add = FALSE;
if (isset($post_array['add']) ){

// Save event categorie
$result = $event_categories->save($post_array);
if ($result){
// Save was succesfull
$add = TRUE;
} else {
// Indicate error
$error = TRUE;

}

}

}

Wanneer je de code goed hebt ingevoerd kun je het testen door een nieuwe event categorie toe te voegen.