Plugin Installer, Fehler bei mehr als einem Plugin

Gesperrt
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Plugin Installer, Fehler bei mehr als einem Plugin

Beitrag von Oldperl »

Servus,

Ich habe gerade in meiner 4.5.3er Beta CVS versucht, mehr als 1 Plugin zu installieren, was so aber nicht funktionierte.
Verwendeter Installer:

Code: Alles auswählen

/* PLUGIN INSTALLER
 * Version 0.5
 * Für Contenido 4.4.4 and up 4.5.x
 * Autor: Martin Horwath (horwath@dayside.net)
 * Datum: 26.09.2004
 * Modifiziert: 30.03.2005
 */
Gründe gab es 2.
1. Der Installer löschte immer die con_plugin table beim installieren, da in der install.php in der Klasse DB_Upgrade die Variable $checktablestatus auf true stand.
Auszug:

Code: Alles auswählen

class DB_Upgrade extends DB_Contenido {
}

$cfg["debug"]["installer"] = true;
$checktablestatus = true;

/* Instanzen der DB_Contenido */
$db = new DB_Contenido;
$db2 = new DB_Contenido;
$db_str = new DB_Contenido;

$cfg["debug"]["backend_exectime"]["start"]  = getmicrotime();

/* con_sequence update */
updateSequence();

if ($checktablestatus) {

   $required_fields = Array( "idplugin",
                             "name",
                             "version",
                             "author",
                             "idinternal",
                             "url",
                             "status",
                             "description",
                             "install",
                             "uninstall",
                             "date");
   $required_table = "DROP TABLE ".$cfg['tab']['plugins'].";
                      CREATE TABLE ".$cfg['tab']['plugins']." (
                          idplugin INT(10) NOT NULL default '0',
                          name VARCHAR(60) default NULL,
                          version VARCHAR(10) NOT NULL default '0',
                          author VARCHAR(60) default NULL,
                          idinternal VARCHAR(32) NOT NULL default '0',
                          url TEXT,
                          status INT(10) NOT NULL default '0',
                          description TEXT,
                          install TEXT,
                          uninstall TEXT,
                          date DATETIME NOT NULL default '0000-00-00 00:00:00',
                          PRIMARY KEY (idplugin)
                      ) TYPE=MyISAM;";

   // now we check if the plugin table has the right format...
   msg( "Checking status ". $cfg['tab']['plugins']);
   $ptable = $db->metadata($cfg['tab']['plugins']);

   foreach ($ptable as $key) {
      if (!in_array($key['name'], $required_fields)) {
         msg( $key['name']." (this key can be deleted)", "unused key");
      } else {
         $availableKeys[] = $key['name'];
      }
      $foundkeys[] = $key['name'];
   }
   foreach ($required_fields as $key) {
      if (!in_array($key, $foundkeys)) {
         msg( $key." (this key must be added)", "missing key");
         $missingKeys[] = $key;
      }
   }
   unset ($foundkeys, $key);

   // available elements in table are stored in array -> $availableKeys;
   // missing elements in table are stored in array -> $missingKeys;
   // this is a possible way to handle new versions of plugin installer
   // since this is initial release the table will be dropped and recreated
   // when a missing element is found.

   if (count($missingKeys) > 0) {

      $sql_data = remove_remarks($required_table);
      $sql_pieces = split_sql_file($sql_data, ';');
      msg(count($sql_pieces)." queries", "Executing:");
      foreach ($sql_pieces as $sqlinit) {
         $db->query($sqlinit);
         msg($sqlinit);
      }

   } else {
      msg("ok");
   }

}
In der If-Abfrage wird dann die Tabelle gedropt und neu angelegt, ohne dabei Rücksicht auf den Status zu nehmen, wie die Variable eigentlich aussagt, oder die in der alten Tabelle vorhandenen Felder wieder einzufügen. :?

2. Der Installer vergibt immer die gleiche idplugin in der con_plugin, dadurch stimmt auch der automatisch berechnete Wert der !PID! nicht.
Somit können alle Einträge in der Datenbank für Files, Menüs etc. nicht geschrieben werden, wenn sie schon existent sind, was ja nach dem 1. Plugin der Fall ist. Es funktioniert also immer nur das 1. Plugin :(

Diese ID wird ab Zeile 195 im script generiert

Code: Alles auswählen

} else {
        $mode = "install";
        $message .= "No plugin with this internal id exists in table.<br>\n";
        $pluginid = getSequenceId($cfg["tab"]["plugins"]);

    }
Nun meine Frage, was macht diese Contenido-Funktion getSequenceID und wo finde ich sie. Oder gibt es eine Funktion in der Art getNextTableID?

Dann wäre es auch möglich mehr als 1 Plugin einzubinden:

@emergence
ich habe in einem anderen Posting in plugin-interface für 4.5.2 von dir gefunden. Meine Frage, brauch ich das noch 4.5.3 und was genau macht es. Zum installieren von Plugins ist es ja anscheinend nicht gedacht.

@timo
In der Tabelle con_plugin gibt es noch Felder url, status, description, idclient, path, installed und active.
Werden diese Felder schon verwendet, bzw. von Contenido irgendwo abgefragt?
Welche Verwendung ist/war für die Felder angedacht?
Wird zum Beispiel wenn bei idclient eine Mandantennummer eingetragen wird, das Plugin nur bei diesem Mandanten angezeigt?

Huch, is ja doch mehr geworden als ich tippen wollt :oops:

Dann mal lieber schluß für jetzt :wink:

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: Plugin Installer, Fehler bei mehr als einem Plugin

Beitrag von emergence »

Oldperl hat geschrieben:@emergence
ich habe in einem anderen Posting in plugin-interface für 4.5.2 von dir gefunden. Meine Frage, brauch ich das noch 4.5.3 und was genau macht es. Zum installieren von Plugins ist es ja anscheinend nicht gedacht.
in der 4.5.3 version gibt es kein eigenes interface mehr, da es bereits integriert ist...

den anderen fehler muss ich mir bei einer 4.5.3 ansehen...

poste doch bitte mal die komplette 0.0.5 version des installers

ebenso für mich intressant die debug meldungen bis zu dem zeitpunkt wo die tabelle neu angelegt wird...
*** make your own tools (wishlist :: thx)
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

Soderle, also dann erst mal der Installer

Code: Alles auswählen

<?php
/* PLUGIN INSTALLER
 * Version 0.5
 * Für Contenido 4.4.4 and up 4.5.x
 * Autor: Martin Horwath (horwath@dayside.net)
 * Datum: 26.09.2004
 * Modifiziert: 30.03.2005
 */

$contenido_path = '../../';
if (file_exists( $contenido_path . 'includes/startup.php'))
{
	include_once ($contenido_path . 'includes/startup.php');
} else {
    include_once ($contenido_path . 'includes/config.php');
}

cInclude ("includes", 'functions.general.php');

$cfg["debug"]["backend_exectime"]["fullstart"]  = getmicrotime();

cInclude ("includes", 'functions.i18n.php');
cInclude ("includes", 'functions.api.php');
cInclude ("includes", 'functions.general.php');

cInclude ("includes", 'functions.database.php');

cInclude ("classes", 'class.xml.php');
cInclude ("classes", 'class.navigation.php');
cInclude ("classes", 'class.template.php');
cInclude ("classes", 'class.backend.php');
cInclude ("classes", 'class.notification.php');
cInclude ("classes", 'class.area.php');
cInclude ("classes", 'class.action.php');

cInclude ("classes", 'class.layout.php');
cInclude ("classes", 'class.treeitem.php');
cInclude ("classes", 'class.user.php');
cInclude ("classes", 'class.group.php');
cInclude ("classes", 'class.cat.php');
cInclude ("classes", 'class.client.php');
cInclude ("classes", 'class.inuse.php');
cInclude ("classes", 'class.table.php');

cInclude ("includes", 'functions.str.php');

page_open(array('sess' => 'Contenido_Session',
                'auth' => 'Contenido_Challenge_Crypt_Auth',
                'perm' => 'Contenido_Perm'));

i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang);
cInclude ("includes", 'cfg_language_de.inc.php');

class DB_Upgrade extends DB_Contenido {
}

$cfg["debug"]["installer"] = true;
$checktablestatus = true;

/* Instanzen der DB_Contenido */
$db = new DB_Contenido;
$db2 = new DB_Contenido;
$db_str = new DB_Contenido;

$cfg["debug"]["backend_exectime"]["start"]  = getmicrotime();

/* con_sequence update */
updateSequence();

if ($checktablestatus) {

   $required_fields = Array( "idplugin",
                             "name",
                             "version",
                             "author",
                             "idinternal",
                             "url",
                             "status",
                             "description",
                             "install",
                             "uninstall",
                             "date");
   $required_table = "DROP TABLE ".$cfg['tab']['plugins'].";
                      CREATE TABLE ".$cfg['tab']['plugins']." (
                          idplugin INT(10) NOT NULL default '0',
                          name VARCHAR(60) default NULL,
                          version VARCHAR(10) NOT NULL default '0',
                          author VARCHAR(60) default NULL,
                          idinternal VARCHAR(32) NOT NULL default '0',
                          url TEXT,
                          status INT(10) NOT NULL default '0',
                          description TEXT,
                          install TEXT,
                          uninstall TEXT,
                          date DATETIME NOT NULL default '0000-00-00 00:00:00',
                          PRIMARY KEY (idplugin)
                      ) TYPE=MyISAM;";

   // now we check if the plugin table has the right format...
   msg( "Checking status ". $cfg['tab']['plugins']);
   $ptable = $db->metadata($cfg['tab']['plugins']);

   foreach ($ptable as $key) {
      if (!in_array($key['name'], $required_fields)) {
         msg( $key['name']." (this key can be deleted)", "unused key");
      } else {
         $availableKeys[] = $key['name'];
      }
      $foundkeys[] = $key['name'];
   }
   foreach ($required_fields as $key) {
      if (!in_array($key, $foundkeys)) {
         msg( $key." (this key must be added)", "missing key");
         $missingKeys[] = $key;
      }
   }
   unset ($foundkeys, $key);

   // available elements in table are stored in array -> $availableKeys;
   // missing elements in table are stored in array -> $missingKeys;
   // this is a possible way to handle new versions of plugin installer
   // since this is initial release the table will be dropped and recreated
   // when a missing element is found.

   if (count($missingKeys) > 0) {

      $sql_data = remove_remarks($required_table);
      $sql_pieces = split_sql_file($sql_data, ';');
      msg(count($sql_pieces)." queries", "Executing:");
      foreach ($sql_pieces as $sqlinit) {
         $db->query($sqlinit);
         msg($sqlinit);
      }

   } else {
      msg("ok");
   }

}

echo '<html><body style="font-family: Verdana; font-size:11px;">';
// installer starts here
echo "<b>PLUGIN INSTALLER</b><br><br>\n";

$clink = "<br><a href=\"../../index.php?contenido=$contenido\">Switch to backend</a>\r\n";

if ($installsql = file_get_contents('install.sql')) {

    // get info from sql file
    if (preg_match ("/####(.*)####/i", $installsql, $pinfo)) {

       $pinfo = explode (";",$pinfo[1]);

       // take some nice names easier to work with...
       $pname = $pinfo[0];
       $pversion = $pinfo[1];
       $pauthor = $pinfo[2];
       $pinternalid = $pinfo[3];

       unset($pinfo);

       // first show info
       echo "Plugin Name: ".$pname."<br>\n";
       echo "Plugin Version: ".$pversion."<br>\n";
       echo "Author: ".$pauthor."<br>\n";
       echo "Internal ID: ".$pinternalid."<br>\n";

       // the user don't need this info...
       $installsql = preg_replace ("/####(.*)####/i", "", $installsql);

       $pstatus = true;

    } else {
       echo "Info missing. First line of install.sql should include following line:<br>";
       echo "<b>####NAME;VERSION;AUTHOR;INTERNAL_ID####</b><br>";
       echo "No further action takes place<br>";

       $pstatus = false;
    }

    // check if idinternal is allready available in table
    $sql = "SELECT * FROM ".$cfg["tab"]["plugins"]." WHERE idinternal='".$pinternalid."';";
    $db->query($sql);
    if ($db->next_record()) {
        $mode = "update";
        $message .= "Plugin with this internal id allready exists in table.<br>\n";
        if ($pversion == $db->f('version')) {
            $message .= "This version is allready installed.<br>\n";
            $mode = "uninstall";
        } else {
            $message .= "Switching to upgrade mode.<br>\n";
        }
        $pluginid = $db->f('idplugin');

    } else {
        $mode = "install";
        $message .= "No plugin with this internal id exists in table.<br>\n";
        $pluginid = getSequenceId($cfg["tab"]["plugins"]);

    }

    if (!$install && !$uninstall) {
        echo "<br>".$message;
    }

    if (!$install && $mode!="uninstall") {
       echo "<br><a href=$PHP_SELF?install=1&contenido=$contenido>Install $pname $pversion</a></br>";
    }

    if (!$uninstall && $mode=="uninstall") {
       echo "<br><a href=$PHP_SELF?uninstall=1&contenido=$contenido>UnInstall $pname $pversion</a></br>";
    }

    if ($uninstall) {
       $sql = "SELECT uninstall FROM ".$cfg["tab"]["plugins"]." WHERE idplugin='".$pluginid."'";
       msg($sql);
       $db->query($sql);
       $db->next_record();

       $uninstallsql = $db->f('uninstall');
       $sql_data = remove_remarks($uninstallsql);
       $sql_pieces = split_sql_file($sql_data, ';');

       msg(count($sql_pieces)." queries", "Executing:");
       foreach ($sql_pieces as $sqlinit) {
          $db->query($sqlinit);
          msg($sqlinit);
       }
       echo "<br><b>Uninstall complete.</b><br>\r\n";

    }

    if ($pstatus && $install) {

       $PID = 100 + $pluginid; // generate !PID! replacement
       $replace = array('!PREFIX!' => $cfg['sql']['sqlprefix'],
                        '!PID!' => $PID);

       $installsql = strtr($installsql, $replace);

       if($mode == "install") { // insert all data from install.sql
           $sql = "INSERT INTO ".$cfg["tab"]["plugins"]." (idplugin,name,`version`,author,idinternal,`status`,`date`) VALUES ('".$pluginid."','".$pname."','".$pversion."','".$pauthor."','".$pinternalid."','0','".date("Y-m-d H:i:s")."');";
           $uninstallsql = "DELETE FROM ".$cfg["tab"]["plugins"]." WHERE idplugin='".$pluginid."';\r\n";
           msg($sql);
           $db->query($sql);

           msg ($installsql, "Install query:");

           $sql_data = remove_remarks($installsql);
           $sql_pieces = split_sql_file($sql_data, ';');
           msg(count($sql_pieces)." queries", "Executing:");
           foreach ($sql_pieces as $sqlinit) {
               //$sqlinit = strtr($sqlinit, $replace);

               // create uninstall.sql for each insert entry
               if (preg_match("/INSERT\s+INTO\s+(.*)\s+VALUES\s*\([´\"'\s]*(\d+)/i", $sqlinit, $tmpsql) ) {

                    $tmpidname = $db->metadata(trim(str_replace("`", "", $tmpsql[1])));

                    $tmpidname = $tmpidname[0]['name'];
                    $uninstallsql = "DELETE FROM ".trim($tmpsql[1])." WHERE ".$tmpidname."='".trim($tmpsql[2])."';\r\n".$uninstallsql;
               }

               $db->query($sqlinit);
               msg($sqlinit);
           }

           if ($uninstallsqlfile = file_get_contents('uninstall.sql')) {
               $uninstallsqlfile = remove_remarks($uninstallsqlfile); // remove all comments

               $uninstallsql .= strtr($uninstallsqlfile, $replace); // add to generated sql
               echo "I found uninstall.sql in ".dirname(__FILE__)."<br>Statements added to uninstall query.<br>\n";

           }

           msg ($uninstallsql, "Uninstall query:");

           $sql = "UPDATE ".$cfg["tab"]["plugins"]." SET install=0x".bin2hex($installsql).", uninstall=0x".bin2hex($uninstallsql)." WHERE (idplugin='".$pluginid."');";
           msg($sql,"un/install statements stored");
           $db->query($sql);

           echo "<br><b>Install complete.</b><br>\r\n";

       }

       if($mode == "update") {
           echo "yes here is something to do for you...<br>\n";
       }


    /* con_sequence update */
    updateSequence();

    }

} else {
    echo "Sorry i found no install.sql in ".dirname(__FILE__)."<br>\n";
}

//echo $clink;

showmsg();

echo '</body></html>';


    // some functions to work with...

    /**
     * removes '# blabla...' from the mysql_dump.
     * This function was originally developed for phpbb 2.01
     * (C) 2001 The phpBB Group http://www.phpbb.com
     *
     * @return string input_without_#
     */
    function remove_remarks($sql)
    {
        $lines = explode("\n", $sql);

        // try to keep mem. use down
        $sql = "";

        $linecount = count($lines);
        $output = "";

        for ($i = 0; $i < $linecount; $i++)
        {
            if (($i != ($linecount - 1)) || (strlen($lines[$i]) > 0))
            {
                    if ($lines[$i][0] != "#")
                    {
                        $output .= $lines[$i] . "\n";
                    }
                    else
                    {
                        $output .= "\n";
                    }
                // Trading a bit of speed for lower mem. use here.
                $lines[$i] = "";
            }
        }
        return $output;
    }

    /**
     * Splits sql- statements into handy pieces.
     * This function was original developed for the phpbb 2.01
     * (C) 2001 The phpBB Group http://www.phpbb.com
     *
     * @return array sql_pieces
     */
    function split_sql_file($sql, $delimiter)
    {
        // Split up our string into "possible" SQL statements.
        $tokens = explode($delimiter, $sql);

        // try to save mem.
        $sql = "";
        $output = array();

        // we don't actually care about the matches preg gives us.
        $matches = array();

        // this is faster than calling count($oktens) every time thru the loop.
        $token_count = count($tokens);
        for ($i = 0; $i < $token_count; $i++)
        {
            // Dont wanna add an empty string as the last thing in the array.
            if (($i != ($token_count - 1)) || (strlen($tokens[$i] > 0)))
            {
                // This is the total number of single quotes in the token.
                $total_quotes = preg_match_all("/'/", $tokens[$i], $matches);
                // Counts single quotes that are preceded by an odd number of backslashes,
                // which means they're escaped quotes.
                $escaped_quotes = preg_match_all("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$i], $matches);

                $unescaped_quotes = $total_quotes - $escaped_quotes;

                // If the number of unescaped quotes is even, then the delimiter did NOT occur inside a string literal.
                if (($unescaped_quotes % 2) == 0)
                {
                    // It's a complete sql statement.
                    $output[] = $tokens[$i];
                    // save memory.
                    $tokens[$i] = "";
                }
                else
                {
                    // incomplete sql statement. keep adding tokens until we have a complete one.
                    // $temp will hold what we have so far.
                    $temp = $tokens[$i] . $delimiter;
                    // save memory..
                    $tokens[$i] = "";

                    // Do we have a complete statement yet?
                    $complete_stmt = false;

                    for ($j = $i + 1; (!$complete_stmt && ($j < $token_count)); $j++)
                    {
                        // This is the total number of single quotes in the token.
                        $total_quotes = preg_match_all("/'/", $tokens[$j], $matches);
                        // Counts single quotes that are preceded by an odd number of backslashes,
                        // which means theyre escaped quotes.
                        $escaped_quotes = preg_match_all("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$j], $matches);

                        $unescaped_quotes = $total_quotes - $escaped_quotes;

                        if (($unescaped_quotes % 2) == 1)
                        {
                            // odd number of unescaped quotes. In combination with the previous incomplete
                            // statement(s), we now have a complete statement. (2 odds always make an even)
                            $output[] = $temp . $tokens[$j];

                            // save memory.
                            $tokens[$j] = "";
                            $temp = "";

                            // exit the loop.
                            $complete_stmt = true;
                            // make sure the outer loop continues at the right point.
                            $i = $j;
                        }
                        else
                        {
                            // even number of unescaped quotes. We still dont have a complete statement.
                            // (1 odd and 1 even always make an odd)
                            $temp .= $tokens[$j] . $delimiter;
                            // save memory.
                            $tokens[$j] = "";
                        }

                    } // for..
                } // else
            }
        }
        return $output;
    }


    // simple function to update con_sequence
    function updateSequence($table=false) {

        global $db, $cfg;
        if (!$table) {
            $sql = "SHOW TABLES";
            $db->query($sql);
            while ($db->next_record())
            {
                dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0));
            }
        } else {
            dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $table);
        }
    }

    // read out next free id
    function getSequenceId($table) {

        global $db2, $cfg;

        $sql= "SELECT nextid FROM ".$cfg['sql']['sqlprefix']."_sequence"." where seq_name = '$table'";
        $db2->query($sql);
        if ($db2->next_record()) {
            return ($db2->f("nextid")+1);
        } else {
            msg($table,"missing in ".$cfg['sql']['sqlprefix']."_sequence");
            return 0;
        }
    }

    // debug functions
    function msg($value, $info=false) {

        global $cfg;
        if (trim($cfg["debug"]["messages"]) == "") $cfg["debug"]["messages"] = "<br><b>DEBUG:</b>";
        if ($cfg["debug"]["installer"]) {

            if ($info) { $cfg["debug"]["messages"] .= "<b>$info</b> -> "; }
            if (is_array($value)) {
                ob_start();
                print_r($value);
                $output = ob_get_contents();
                ob_end_clean();
                $cfg["debug"]["messages"] .= "<pre>".htmlspecialchars($output)."</pre>";
            } else {
                $cfg["debug"]["messages"] .= htmlspecialchars($value)."<br>";
            }

        }
    }

    function showmsg() {

        global $cfg;
        if ($cfg["debug"]["installer"]) {
            echo "<div style=\"font-family: Verdana, Arial, Helvetica, Sans-Serif; font-size: 11px; color: #000000\">";
            echo $cfg["debug"]["messages"];
            echo "</div>";
        }
    }

$cfg["debug"]["backend_exectime"]["end"] = getmicrotime();

if ($cfg["debug"]["rendering"] == true)
{
    echo "Rendering this page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["start"])." seconds<br>";
    echo "Building the complete page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["fullstart"])." seconds<br>";

    if (function_exists("memory_get_usage"))
    {
        echo "Include memory usage: ".human_readable_size(memory_get_usage()-$cfg["debug"]["oldmemusage"])."<br>";
        echo "Complete memory usage: ".human_readable_size(memory_get_usage())."<br>";

    }

}
page_close();
?>
Achja, und was meinst du mit der Debugmeldung? Das was beim Ausführen der Install angezeigt wird?

Hmm, ja, und was mir da grad noch einfällt, ist eigentlich für ne zukünftige 6er Version angedacht, den Install eines Plugins auch aus dem Backend zu starten und dort installierte Plugins zu verwalten?
Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

Da hab ich grad nen anderen Thread von uns gefunden, da ging es schon mal um id updates.
:arrow: http://contenido.org/forum/viewtopic.php?t=8971

Ich glaub damit erklärt sich mein Problem schon fast von selbst, werd mal den Installer auf db->nextid() umbauen und schaun ob es dann funzt.

@emergence
weißt du ob db->nextid() dann in allen Contenido Versionen funzt?

ad: Noch was gesehn, da sind ja die Funktionen eingebaut in der install.php, aber ist es nicht so, das Funktionen vor dem ersten Aufruf stehen müssen, oder sind sie schon initialisiert wenn das Script einmal durchlaufen wurde.
Hmm, ich finde es wäre cleverer gewesen, diesen Funktionen nicht die gleichen Namen zu geben, evtl hätte man ein plugin_ oder sowas davor setzen sollen, so kann man dann auch genau sagen welche Funktion grad die aktive ist. Den eingebunden werden die Contenido eigenen wohl auch

Code: Alles auswählen

cInclude ("includes", 'functions.database.php');
Also welche spreche ich dann beim Aufruf an? Es sind nämlich auch die übergebenen Variablen an die Funktionen unterschiedlich, die von Contenido hat 2 und die in install.php nur 1.

Ok, dann is ma wieder ne Nachtschicht angesagt 8)
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

Soderle, den Fehler warum bei mir die PluginID nicht hochgezählt wird hab ich gefunden.
Grund war das die idplugin nicht als Primärschlüssel in der DB definiert war.
Warum und wieso ist mir aber noch nicht so ganz klar :?
Wird auch schwierig sein das nach zu vollziehen. Vielleicht kann ja mal bitte jemand bei einer Neuinstallation einer 4.5.3er Version nachschaun ob dort die pluginid in con_plugins als Primärschlüssel eingetragen ist.

Gruß aus dem nächtlich stillen Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

Achja, und was meinst du mit der Debugmeldung? Das was beim Ausführen der Install angezeigt wird?
ja
Hmm, ja, und was mir da grad noch einfällt, ist eigentlich für ne zukünftige 6er Version angedacht, den Install eines Plugins auch aus dem Backend zu starten und dort installierte Plugins zu verwalten?
na ja, so einfach ist das leider nicht...
ich hab es zwar vor etwas derartiges als plugin fertigzustellen, aber hab momentan einfach zuviele andere sachen zu tun...
da kommt dann noch dazu das es ebenso eine andere version des plugin installers existiert der nur auf xml basis aufgebaut ist.. (von ubo entwickelt)
und diese beiden versionen sollen an sich verschmolzen werden...
eine verwaltung aus dem backend ist dann an sich möglich...
weißt du ob db->nextid() dann in allen Contenido Versionen funzt?
grundsätzlich ja, siehe anmerkungen des anderen threads
Noch was gesehn, da sind ja die Funktionen eingebaut in der install.php, aber ist es nicht so, das Funktionen vor dem ersten Aufruf stehen müssen, oder sind sie schon initialisiert wenn das Script einmal durchlaufen wurde.
funktionen können sehr wohl am ende des scripts stehen... das macht keinen unterschied... eine ausnahme gibt es da natürlich
wenn eine funktion zb in einer if schleife steckt die überprüft ob die funktion bereits existiert...
ad: Noch was gesehn, da sind ja die Funktionen eingebaut in der install.php, aber ist es nicht so, das Funktionen vor dem ersten Aufruf stehen müssen, oder sind sie schon initialisiert wenn das Script einmal durchlaufen wurde.
Hmm, ich finde es wäre cleverer gewesen, diesen Funktionen nicht die gleichen Namen zu geben, evtl hätte man ein plugin_ oder sowas davor setzen sollen, so kann man dann auch genau sagen welche Funktion grad die aktive ist. Den eingebunden werden die Contenido eigenen wohl auch
Code:
cInclude ("includes", 'functions.database.php');

Also welche spreche ich dann beim Aufruf an? Es sind nämlich auch die übergebenen Variablen an die Funktionen unterschiedlich, die von Contenido hat 2 und die in install.php nur 1.
ähm functions.database.php verwendet für die in ihr definierten funktionen die DB_Upgrade welche an sich auf der DB_Contenido beruht...

im installer wird eine leere klasse initialisiert

Code: Alles auswählen

class DB_Upgrade extends DB_Contenido { 
}
sonst sind die funktionen der functions.database.php nicht verwendbar...

function updateSequence in install.php hat nur den sinn und zweck entweder alle einträge in der con_sequence upzudaten oder nur einen bestimmten...
function dbUpdateSequence updatet immer nur einen einzigen !
Soderle, den Fehler warum bei mir die PluginID nicht hochgezählt wird hab ich gefunden.
Grund war das die idplugin nicht als Primärschlüssel in der DB definiert war.
Warum und wieso ist mir aber noch nicht so ganz klar
ähm ist mir nicht ganz klar wie das zustande kommen soll...
du hast geschrieben das jedesmal die con_plugins neu angelegt wird...
wenn dem so wäre muss idplugin als primärschlüssel definiert sein...

noch ne info
wenn $checktablestatus auf true steht heisst das nicht das automatisch die con_plugins neu angelegt wird...
es gibt den array $required_fields -> darin sind die einzelnen spalten namen definiert die vorhanden sein müssen...

Code: Alles auswählen

$ptable = $db->metadata($cfg['tab']['plugins']); 
ließt die vorhanden spalten aus... diese werden dann mit dem im array angegeben spalten verglichen...

Code: Alles auswählen

   foreach ($required_fields as $key) { 
      if (!in_array($key, $foundkeys)) { 
         msg( $key." (this key must be added)", "missing key"); 
         $missingKeys[] = $key; 
      } 
   }
sollte nun eine spalte fehlen (wird hier überprüft)

Code: Alles auswählen

if (count($missingKeys) > 0) { .. }
wird einfach die con_plugin gelöscht und neu angelegt....

na wie auch immer
was hast du denn nun am script geändert das es funktiniert hat ?
welche mysql version hast du im einsatz ?
gab es einträge im errorlog.txt ?
*** make your own tools (wishlist :: thx)
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

emergence hat geschrieben:sollte nun eine spalte fehlen (wird hier überprüft)

Code: Alles auswählen

if (count($missingKeys) > 0) { .. }
wird einfach die con_plugin gelöscht und neu angelegt....
Nun das ist leider 1 Problem, vielleicht sollte man da besser mit ALTER TABLE arbeiten und nur die Spalten ergänzen die man braucht.
Auch ist es nicht so nett, wenn man schon ein anderes Plugin installiert hatte, das dieses in dem Fall wortlos gelöscht wird aus con_plugins.
Schöner wäre wenn die Inhalte erst mal gesichert werden und, bevor sich das zu installierende Plugin einträgt, zurück geschrieben werden.
was hast du denn nun am script geändert das es funktiniert hat ?
Nun eigentlich dann nichts, auser das ich die Überprüfung der con_plugins abgeschaltet habe. Hab für mich hier offline die Passwortabfrage abgeschaltet, so oft wie ich meine Baustelle :roll: installiere und wieder deinstalliere ist mir das ewige User/PW eintippen zu blöd :wink:
welche mysql version hast du im einsatz ?
Hier offline hab ich ne XAMP laufen, online nen Linuxserver.
MySQL offline ist MySQL 4.0.15-nt, damit produziere ich eigentlich die ganze Zeit.
gab es einträge im errorlog.txt ?
Nein, definitiv nicht, er hat noch nicht mal gemault das die idplugin kein Primärschlüssel war, nur die oben erwähnten Fehler gemacht.

Naja, es geht jetzt soweit, hab bestimmt schon 50mal mein Plugin installiert und deinstalliert. Wird noch ein paar Tage dauern bis ich das Teil fertig hab, dann schau ich mir das mit der Plugin-Installation mal etwas genauer an, vielleicht fällt mir da ja was ein.

Weißt du zufällig den Thread mit dem anderen Installer den du erwähnt hast.
Achja, und hast du ne Ahnung welche von den Feldern in con_plugin schon von Contenido abgefragt werden und welche nicht?

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Gesperrt