Author Topic: Code Modul - Feld hinzufügen, wo?  (Read 1926 times)

chio

  • Guest
Code Modul - Feld hinzufügen, wo?
« on: February 28, 2008, 11:28:17 AM »
Ich habe mal vor einiger Zeit ein Code-Modul modifiziert, damit es auch ganz ohne Gefrickle normales html oder javascript ausgeben kann.
Um das beim bestehenden Modul zu machen, muss aber ein Feld mehr in die Datenbank ('whatis').
Dafür ist - wie es aussieht - das upgrade.php zuständig. Oder?

Frage: Wie mache ich das? wo wird das aufgerufen? Oder sollte ich einfach in der add.php abfragen, ob das feld vorhanden, und ggf einfach anlegen? Wäre doch einfacher, oder?


Ralf Hertsch

  • Guest
Re: Code Modul - Feld hinzufügen, wo?
« Reply #1 on: February 28, 2008, 12:24:34 PM »
Hallo Chio,

das machst du mit upgrade.php.

upgrade.php wird von WB automatisch aufgerufen und ausgeführt, du musst die Datei also nur deiner Installation hinzufügen.

Ein Beispiel dazu (wird von DirList verwendet):

Code: [Select]
/**
 * Upgrade from 0.10 to 0.11
 *
 * --> add row "sort" for options sorting DirList
 *
 */
$prompt = '';
$upgradeError = false;

$thisQuery = "DESCRIBE ".TABLE_PREFIX."mod_dirlist";
$oldErrorReporting = error_reporting(0);
$sql_result = $database->query($thisQuery);
error_reporting($oldErrorReporting);
if ($database->is_error()) {
  // Fehlermeldung anzeigen
  $upgradeError = true;
  $prompt .= sprintf(dl_error_describe_table,$database->get_error()); }
else {
  $fields = array();
  $searchField = 'sort';
  while (($data = $sql_result->fetchRow())) {
    $fields[] = $data["Field"];    }
    if (in_array($searchField, $fields)) {
      // Spalte bereits vorhanden
      $prompt .= sprintf(dl_upgrade_field_exists,'sort');    }
    else {
      // Tabelle muss ergaenzt werden
     $thisQuery = "ALTER TABLE ".TABLE_PREFIX."mod_dirlist ADD sort INT(11) DEFAULT 1";
     $oldErrorReporting = error_reporting(0);
     $sql_result = $database->query($thisQuery);
     error_reporting($oldErrorReporting);
     if ($database->is_error()) {
       // Fehler beim Einfuegen des Feldes
       $upgradeError = true;
       $prompt .= sprintf(dl_error_insert_field,'sort',$database->get_error()); }
     else {
       // Feld erfolgreich eingefuegt
       $prompt .= sprintf(dl_upgrade_insert_field,'sort'); }
  }
}

und am Ende der Upgrade Orgie dann noch eine Meldung ausgeben:

Code: [Select]
// Ergebnis des Upgrade melden
if ($upgradeError) {
  $admin->print_error($prompt); }
else {
  $admin->print_success($prompt); }

Gruß
Ralf
« Last Edit: February 28, 2008, 12:29:28 PM by Ralf (Berlin) »

chio

  • Guest
Re: Code Modul - Feld hinzufügen, wo?
« Reply #2 on: February 28, 2008, 02:59:50 PM »
Danke Ralf,
Irgendwie kommt mir das etwas "viel" vor, bei der normalen Installation wird weit weniger abgefragt. Aber ja, was weiß ich denn...


Anbei - wen's interessiert - ein leicht verändertes Modul "Code" für WB 2.7 only.
Die Veränderungen sind deutlich sichtbar ;-)
Und Geschmackssache..
Anbei Neues Code-Modul

[gelöscht durch Administrator]
« Last Edit: February 28, 2008, 04:11:57 PM by chio »

Ralf Hertsch

  • Guest
Re: Code Modul - Feld hinzufügen, wo?
« Reply #3 on: February 28, 2008, 03:28:40 PM »
Hallo Chio,

jo, da wird auch wesentlich mehr abgefragt. In der install.php beschränktst du dich auf die reine Ausführung der SQL Befehle:

Code: [Select]
$database->query("INSERT INTO ".TABLE_PREFIX."search (name,value,extra) VALUES ('module', 'code', '$field_info')");
Wenn hierbei ein Fehler auftritt hast du diesen netten weißen Bildschirm mit den aussagekräftigen Texten vor dir.

Bei der upgrade.php

Code: [Select]
$thisQuery = "ALTER TABLE ".TABLE_PREFIX."mod_code ADD whatis INT NOT NULL DEFAULT 0";
$oldErrorReporting = error_reporting(0);
$sql_result = $database->query($thisQuery);
error_reporting($oldErrorReporting);
if ($database->is_error()) {
   // Fehler beim Einfuegen des Feldes
   $upgradeError = true;
   $prompt .= sprintf(dl_error_insert_field,'whatis',$database->get_error()); }
else {
   // Feld erfolgreich eingefuegt
   $prompt .= sprintf(dl_upgrade_insert_field,'whatis'); }

wird zunächst die Standard Fehlermeldung ausgeschaltet, danach der SQL Befehl ausgeführt und die Standard Fehlermeldung wieder eingeschaltet. Wenn bei der Ausführung des SQL Befehl ein Fehler aufgetreten ist ist $database->error() == true und du hast die Möglichkeit dem Anwender eine Fehlermeldung zu zeigen:

Code: [Select]
$prompt .= sprintf(dl_error_insert_field,'whatis',$database->get_error());
die Konstante dl_error_insert_fie ld stammt aus der Sprachdatei des DirList Modul, das wird so bei dir nicht funktionieren, die Meldung lautet:

Code: [Select]
'<p>Beim Einf&uuml;gen des Feldes "<strong>%s</strong>" ist ein Fehler aufgetreten.</p><p><strong>Fehlermeldung:</strong> %s</p>'
Der erste Platzhalter %s wird durch 'whatis' ersetzt, der zweite enthält die ausführliche MySQL Fehlerbeschreibung. Die Fehlermeldungen sind normalerweise aussagekräftig genug um sofort zu sehen wo der Haken ist...

Mein Code ist meistens umfangreicher, eben weil ich versuche Fehler abzufangen und möglichst sauber abzuhandeln.

Hier habe ich die DirList Konstanten entfernt und die Klarmeldungen eingefügt, ich glaube jetzt wird es klarer:

Code: [Select]
<?php

/*

 WebsiteBaker Project <http://www.WebsiteBaker.org/>
 Copyright (C) 2004-2007, Ryan Djurovich

*/

//require(&#39;../../config.php&#39;);
//require(WB_PATH.&#39;/framework/functions.php&#39;);

$database = new database(DB_URL);

// Adding the new field to the database table mod_code
/**
 * Upgrade from 0.10 to 0.11
 *
 * --> add row "sort" for options sorting DirList
 *
 */
$prompt = &#39;&#39;;
$upgradeError false;

$thisQuery "DESCRIBE ".TABLE_PREFIX."mod_code";
$oldErrorReporting error_reporting(0);
$sql_result $database->query($thisQuery);
error_reporting($oldErrorReporting);
if (
$database->is_error()) {
  
// Fehlermeldung anzeigen
  
$upgradeError true;
  
$prompt .= sprintf(&#39;<p>Die Tabellenbeschreibung konnte nicht ausgelesen werden.</p><p><strong>Fehlermeldung:</strong> %s</p>&#39;,$database->get_error()); }
else {
  
$fields = array();
  
$searchField = &#39;whatis&#39;;
  
while (($data $sql_result->fetchRow())) {
    
$fields[] = $data["Field"];    }
    if (
in_array($searchField$fields)) {
      
// Spalte bereits vorhanden
      
$prompt .= sprintf(&#39;<p>Das Feld "<strong>%s</strong>" existiert bereits.</p>&#39;,&#39;whatis&#39;);    }
    
else {
      
// Tabelle muss ergaenzt werden
     
$thisQuery "ALTER TABLE ".TABLE_PREFIX."mod_code ADD whatis INT NOT NULL DEFAULT 0";
     
$oldErrorReporting error_reporting(0);
     
$sql_result $database->query($thisQuery);
     
error_reporting($oldErrorReporting);
     if (
$database->is_error()) {
       
// Fehler beim Einfuegen des Feldes
       
$upgradeError true;
       
$prompt .= sprintf(&#39;<p>Beim Einf&uuml;gen des Feldes "<strong>%s</strong>" ist ein Fehler aufgetreten.</p><p><strong>Fehlermeldung:</strong> %s</p>&#39;,&#39;whatis&#39;,$database->get_error()); }
     
else {
       
// Feld erfolgreich eingefuegt
       
$prompt .= sprintf(&#39;<p>Das Feld "<strong>%s</strong>" wurde in die Tabelle eingef&uuml;gt.</p>&#39;,&#39;whatis&#39;); }
  
}
}

// Ergebnis des Upgrade melden
if ($upgradeError) {
  
$admin->print_error($prompt); }
else {
  
$admin->print_success($prompt); }

?>

Ich hoffe, ich habe jetzt nicht noch mehr Verwirrung erzeugt...

Gruß
Ralf

chio

  • Guest
Re: Code Modul - Feld hinzufügen, wo?
« Reply #4 on: February 28, 2008, 04:12:56 PM »
Jo, so irgendwie hab ichs verstanden.... glaube ich.

Ich hab die paar Zeilen geändert und angefügt

 

postern-length