Welcome, Guest. Please login or register.
Did you miss your activation email?
May 27, 2012, 04:06:41 AM

Login with username, password and session length
Search:     Advanced search
Wollen Sie dem WebsiteBaker Team beitreten?
Nähere Informationen finden Sie unter hier und auf unserer neuen Webseite.
155555 Posts in 21715 Topics by 7737 Members
Latest Member: gx-world
* Home Help Search Login Register
Pages: [1]   Go Down
Print
Author Topic: Code Modul - Feld hinzufügen, wo?  (Read 705 times)
chio
WebsiteBaker Org e.V.

Offline Offline

Posts: 2264


« 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?

Logged

*weg*
Ralf (Berlin)

Offline Offline

Posts: 1314


« 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:
/**
 * 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:
// 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) » Logged
chio
WebsiteBaker Org e.V.

Offline Offline

Posts: 2264


« 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 wink
Und Geschmackssache..
Anbei Neues Code-Modul
« Last Edit: February 28, 2008, 04:11:57 PM by chio » Logged

*weg*
Ralf (Berlin)

Offline Offline

Posts: 1314


« 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:
$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:
$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:
$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:
'<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:
<?php

/*

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

*/

//require('../../config.php');
//require(WB_PATH.'/framework/functions.php');

$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 '';
$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('<p>Die Tabellenbeschreibung konnte nicht ausgelesen werden.</p><p><strong>Fehlermeldung:</strong> %s</p>',$database->get_error()); }
else {
  
$fields = array();
  
$searchField 'whatis';
  while ((
$data $sql_result->fetchRow())) {
    
$fields[] = $data["Field"];    }
    if (
in_array($searchField$fields)) {
      
// Spalte bereits vorhanden
      
$prompt .= sprintf('<p>Das Feld "<strong>%s</strong>" existiert bereits.</p>','whatis');    }
    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('<p>Beim Einf&uuml;gen des Feldes "<strong>%s</strong>" ist ein Fehler aufgetreten.</p><p><strong>Fehlermeldung:</strong> %s</p>','whatis',$database->get_error()); }
     else {
       
// Feld erfolgreich eingefuegt
       
$prompt .= sprintf('<p>Das Feld "<strong>%s</strong>" wurde in die Tabelle eingef&uuml;gt.</p>','whatis'); }
  }
}

// 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
Logged
chio
WebsiteBaker Org e.V.

Offline Offline

Posts: 2264


« 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
Logged

*weg*
Pages: [1]   Go Up
Print
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2011, Simple Machines Valid XHTML 1.0! Valid CSS!