Verbinding met een externe database via een Computed field

Moeilijkheidsgraad

Voorwoord

Soms is het aangewezen om een combinatie te maken tussen nodes van een bepaald inhoudstype en een externe database.

Ik denk daarbij bijvoorbeeld aan een combinatie tussen nodes en de database die door Webform wordt gebruikt. Ook zeer grote databases komen in aanmerking, waarbij het niet aangewezen is dat ze geïmporteerd worden in de Drupal structuur, omwille van hun grootte. Stocklijsten van bedrijven worden soms met andere programma's gegenereerd en komen hier dus zeker ook in aanmerking. Zelfs gegevens uitwisselen tussen verschillende sites (niet noodzakelijk een Drupal site) is mogelijk... mits je natuurlijk de connectie kunt maken (paswoorden, enz...).

Ik neem een concreet voorbeeld om deze materie te behandelen.

Zo bestaat er een database met alle gegevens van de schaakspelers in België met 23000 records en hun gegevens. Ze is zowat 2,5 GB groot. Als je nu een schaakclub beheert en je wilt de ploegopstelling tonen voor de komende speeldag met andere clubs, dan zou het interessant zijn dat de gegevens van je eigen spelers en tegenstanders vanuit deze database komen.

Ik werk het voorbeeld uit dat bij het ingeven van een speler in ons inhoudstype, via een berekend veld (computed field), de sterkte van deze speler wordt bewaard, uit de officiële database van de Belgische Schaakfederatie.----Ik heb deze database lokaal op mijn server geplaatst aangezien er geen toelating is om rechtstreeks op hun server te werken.---

Bij het maken van een node wordt automatisch de ranking (=soort sterkte ven de speler) vanuit de database met 23000 records gehaald. Bij de node kan je natuurlijk alle mogelijke velden gebruiken (afbeelding, lidgeld betaald?,..). Ik hou het hier simpel, al is dit laatste misschien een understatement...LOL

Screen001865_0.png

Een database maken en de inhoud toevoegen.

Laat ons eerst de database maken.

Screen001853.png

Je moet ook een gebruiker maken, met een paswoord.
Screen001854.png

Daarna koppel je de database met de gebruiker.
Screen001855.png

Je geeft jezelf alle rechten natuurlijk. Hier komt er dus al een eerste sterkte naar voor... Je kunt dus gebruikers aanmaken die enkel de database kunnen bekijken en niet aanpassen...


Screen001856.png

In de phpMyAdmin zie je nu freewe1q_schaken staan.


Screen001857.png

Ik heb van de database een CSV bestandje gemaakt. Simpel openen met Excel en opslaan als CSV (UTF8). En importeren in je database. Kijk naar de instellingen...Ze zijn belangrijk.
Screen001858.png
Screen001859.png

Je krijgt een belangrijke statusmelding. Hier kan je via Opties de tabelnaam wijzigen. Anders heet het ding TABLE 1. Niemand wordt daar blij van.

Screen001861.png


Screen001862.png

De tabel is nu in de database aangemaakt

Screen001863.png

En heeft talrijke velden. Omwille van privacy redenen toon ik niet alle gegevens...Ik heb ook gefilterd op de Lokerse schaakvereniging (clubnummer = 436)

Screen001860.png

Het inhoudstype en de velden

Ik beperk mij tot enkele velden. Het computed field is belangrijk. Het zal de ranking vanuit de andere database halen. Omdat dit een geheel getal is neem ik het type Computed (integer). Ik kan er dan in een view mooi op sorteren.

Screen001866.png

Nu ga je de standaardwaarde van het computed field instellen. Je begrijpt dat dit de belangrijkste stap is van deze handleiding.

Screen001867.png

Laat ons eens deze code van naderbij bekijken.

$conn = mysqli_connect("localhost","freewe1q_dirk","je_paswoord","freewe1q_schaken");

Dit is de connectie string. Ze bestaat uit 4 delen. De host. Dit kan zoals reeds gezegd een database zijn op een andere server. Ze moeten daar toelating voor geven en hun database open stellen voor externe toegang. Wij werken op onze eigen database zodanig dat localhost kan worden gebruikt. Dan volgen de gebruiker en het paswoord van de gebruiker. Tenslotte volgt de database.

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

We bouwen een veiligheid in als er geen connectie wordt gemaakt. Bij een computed field is dit niet erg nuttig. Je zult enkel een flits zien met de tekst. We werken met een integer veld dat geen tekst aankan hé..

$sql = "SELECT * FROM schaakgegevens";
$result = mysqli_query($conn, $sql);

Deze regels zorgen er voor dat we alle velden (*) van de tabel schaakgegevens nemen. Alle rijen worden in een variabele $result opgeslagen. $result is een speciale variabele die daarvoor  gemaakt werd.

if (mysqli_num_rows($result) > 0) {
    
    while($row = mysqli_fetch_assoc($result)) {
  
   if($row["TRICULE"]==$entity->field_stamnummer->value){
         $value=$row["ELO_CALCUL"];
                                                               }
                                                                      }
} else {
    $value= 0;
}

Hier doorlopen we alle rijen van de variabele $result. Als er 23000 leden zijn, zijn er 23000 rijen. Voor elke rij kijken we of het stamnummer overeenkomt met dit van stamnummer dat we ingetikt hebben in onze node. Ik had kunnen op de naam filteren, maar waarschijnlijk zijn er spelers met dezelfde naam.

mysqli_close($conn);

Tenslotte sluiten w emooi af door onze connectie te sluiten.

Nog eens de volledige code:

$value=0;

$conn = mysqli_connect("localhost","freewe1q_dirk","je_paswoord","freewe1q_schaken");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql = "SELECT * FROM schaakgegevens";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    
    while($row = mysqli_fetch_assoc($result)) {
  
   if($row["TRICULE"]==$entity->field_stamnummer->value){
         $value=$row["ELO_CALCUL"];
                                                               }
                                                                      }
} else {
    $value= 0;
}

mysqli_close($conn);

 

Bij wijze van test voeg ik onze sterspeler toe aan onze Drupal site. Yep.. zijn ranking komt er automatisch bij.


Screen001864.png

Weet dat Computed fields worden berekend bij het opslaan van een node (standaard). Je kunt dit ook anders instellen. Dit wordt echter afgeraden omdat de getoonde en de opgeslagen waarde dan verschilt.

Screen001868.png

 

Deze werkwijze biedt zo veel mogelijkheden omdat je twee werelden kunt combineren. Die van Drupal met zijn structuur (en views) in combinatie met ergens een externe lijst met gegevens.

In een volgende bespreking gaan we nog een stap verder en gaan we in views gegevens vanuit een externe database halen, zonder dat ze in nodes worden opgeslagen.