Externe Datenbankanbindung, Darstellung DB-Daten
Externe Datenbankanbindung, Darstellung DB-Daten
Hallo,
Im Prinzip will ich folgende Aufgabe lösen:
- Eingabe von Daten in ein Contenido Forumular
- diese an ein PHP- Script schicken auswerten und daraus ein sql Statement basteln
- eine EXTERNE Datenbank anfragen (hat jemand schon was von Blender gehört, ich nicht)
- die Ergebnisse unter dem Frageformular presentieren.
Wer mir contenido etwas näher bringen kann, sei herzlich willkommen mich aufzuklären.
Meine Probleme dabei sind: Wie verschicke ich die Formulardaten von einer Instanz zur nächsten? Die eingetragenen Werte sollen auf der Ergebnissseite natürlich noch sichtbar sein.
Wie verbindet man sich zu einer weiteren Datenbank?
Gibt es ein TabellenModul, welches mir bei der Presentation hilft. Zum Beispiel: Sortierung nach einer Kategorie. Spalten aus-/einblenden.
Ach ja und um die Anmeldedaten zum Frontend zu erhalten, ist auch die externen Datenbank abzurufen ...
Ich habe daß Gefühl, ich verfremde hier den Sinn von contenido etwas, gibt es vielleicht geschicktere Lösungen für Datenbankabfragen und Darstellungen?
Bisher fand ich aber das arbeiten mit contenido recht angenehm (Nur, daß der Editor im HTML-Modus immer die Returnzeichen löscht nervt etwas)
Vielen Dank für Deine Antwort
Mit freundlichen Grüßen
Ernst
Im Prinzip will ich folgende Aufgabe lösen:
- Eingabe von Daten in ein Contenido Forumular
- diese an ein PHP- Script schicken auswerten und daraus ein sql Statement basteln
- eine EXTERNE Datenbank anfragen (hat jemand schon was von Blender gehört, ich nicht)
- die Ergebnisse unter dem Frageformular presentieren.
Wer mir contenido etwas näher bringen kann, sei herzlich willkommen mich aufzuklären.
Meine Probleme dabei sind: Wie verschicke ich die Formulardaten von einer Instanz zur nächsten? Die eingetragenen Werte sollen auf der Ergebnissseite natürlich noch sichtbar sein.
Wie verbindet man sich zu einer weiteren Datenbank?
Gibt es ein TabellenModul, welches mir bei der Presentation hilft. Zum Beispiel: Sortierung nach einer Kategorie. Spalten aus-/einblenden.
Ach ja und um die Anmeldedaten zum Frontend zu erhalten, ist auch die externen Datenbank abzurufen ...
Ich habe daß Gefühl, ich verfremde hier den Sinn von contenido etwas, gibt es vielleicht geschicktere Lösungen für Datenbankabfragen und Darstellungen?
Bisher fand ich aber das arbeiten mit contenido recht angenehm (Nur, daß der Editor im HTML-Modus immer die Returnzeichen löscht nervt etwas)
Vielen Dank für Deine Antwort
Mit freundlichen Grüßen
Ernst
Zu einem Teil Deiner Fragen:
Dann stehen nach dem Absenden die Daten im globalen Array $_POST.
Ob Du die Daten dann in der Contenido-DB (in einer extra Tabelle), in eine Datei oder woanders speicherst, ist dann Deinem Modul überlassen.
Gruß
HerrB
Was ist bei Dir eine "Instanz"? Normalerweise erstellst Du ein Modul mit einem HTML-Formular, welches die Daten an sich sendet (action = "front_content.php?idart=". $idart).Meine Probleme dabei sind: Wie verschicke ich die Formulardaten von einer Instanz zur nächsten? Die eingetragenen Werte sollen auf der Ergebnissseite natürlich noch sichtbar sein.
Dann stehen nach dem Absenden die Daten im globalen Array $_POST.
Ob Du die Daten dann in der Contenido-DB (in einer extra Tabelle), in eine Datei oder woanders speicherst, ist dann Deinem Modul überlassen.
Ich würde behaupten, über den normalen Weg, wie ein Zugriff auf eine DB aus PHP heraus erfolgt (ohne Gewähr bzgl. Nebeneffekte).Wie verbindet man sich zu einer weiteren Datenbank?
Was meinst Du damit?Gibt es ein TabellenModul, welches mir bei der Presentation hilft. Zum Beispiel: Sortierung nach einer Kategorie. Spalten aus-/einblenden.
Da würde ich Dir empfehlen, die Daten aus der fremden DB in die con_frontend_users zu synchronisieren, wenn das möglich ist.Ach ja und um die Anmeldedaten zum Frontend zu erhalten, ist auch die externen Datenbank abzurufen ...
Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Hallo,
zu Beginn : Mangels geeigneter Dokumentation bitte unbedingt Beispielmandanten installieren und 'durchstöbern'. Für die Analyse der Formulargeschichte eignet sich z.B. das Newslettermodul gut.
Wenn ich im php erkenne, dass es sich um eine Formularantwort handelt ($_POST[] - Variablen (gg.f hidden field) gesetzt) verzweige ich in den "Antwortmodus" und gebe - an der gleichen Stelle wo vorher das Formular stand - die Antwort aus. Vorher noch beliebiges SQL - Geplänkel.
Dieses Modul bindest du dann ganz normal in das Template ein und hast Eingabemaske und Antwortformular in einer Seite. Ich baue gerade an einem mehrschrittigen Assistenten auf gleicher Basis. Der Vorteil : man benötigt nur EINEN Artikel im Content und hat kaum Verknüpfungen zwischen Code und Content (idcats parametrisieren usw.).
Schau die mal die Klasse db_contenido an. Die kann man mit Anmeldedaten aufrufen / instanzieren, die auf jede beligige DB zeigen (Contenido - DB ist nur der Standard). Sie bietet schon alle Funktionen, die es zum Lesen in der DB braucht. Zum Zurückschreiben in die DB habe ich noch nichts 'einfaches' gefunden und bastle gerade an meiner eigenen Klasse: bitte noch ein paar Tage Geduld. Google bringt aber hierfür auch eine Menge fertiger Klassen die man Problemlos verwenden kann.
Ich habe für den 'Fremd - DB - Zugriff' eine Klasse von db_contenido abgeleitet und initialisiere diese dann immer gleich mit den passenden Anmeldedaten. Der Quellcode in den Modulen ist dann genauso wie der Contenido - DB - zugriff auch :
Wie von HerrnB gesagt : am besten wäre eine Synchronisation der Anmeldedaten. Wenn es nur um eine 'allgemeine' Autorisierung geht - d.h. z.B. 'Kunden' dürfen in den geschützten Bereich wobei der konkrete Benutzer für Contenido unerheblich ist - könnte man auch einen 'Superbenutzer' im Contenido anlegen. Dann im Loginmodul die Authentifizierung gegen die andere Datenbank vornehmen (programmieren) und wenn erfolgreich die Contenido - Anmeldung programmtechnisch simulieren. Damit muss man nicht 2 volle Benutzertabellen pflegen.
Für die DB - Arbeit gibt es sicher passendere Frameworks (da ich ziemlicher php - Anfänger bin, kann ich keine benennen). Trotzdem setze ich auch für solch 'artfremde' Aufgaben gerne Contenido ein, weil da schon mal das ganze 'Gerüst' der Seite steht und ich mich wirklich nur noch um Inhalte kümmern muß.
Viel Spaß und viel Erfolg
Tino
zu Beginn : Mangels geeigneter Dokumentation bitte unbedingt Beispielmandanten installieren und 'durchstöbern'. Für die Analyse der Formulargeschichte eignet sich z.B. das Newslettermodul gut.
Du Programmierst das Formular in Form eines Moduls. Zunächt die Eingabemaske mit den benötigten Feldern und einem <Speichern> Button. Den action - tag lasse ich persönlich immer leer - d.h. ich rufe auch mit dem Absenden der Daten wieder die gleiche Seite wieder auf.Wie verschicke ich die Formulardaten von einer Instanz zur nächsten? Die eingetragenen Werte sollen auf der Ergebnissseite natürlich noch sichtbar sein.
Wenn ich im php erkenne, dass es sich um eine Formularantwort handelt ($_POST[] - Variablen (gg.f hidden field) gesetzt) verzweige ich in den "Antwortmodus" und gebe - an der gleichen Stelle wo vorher das Formular stand - die Antwort aus. Vorher noch beliebiges SQL - Geplänkel.
Dieses Modul bindest du dann ganz normal in das Template ein und hast Eingabemaske und Antwortformular in einer Seite. Ich baue gerade an einem mehrschrittigen Assistenten auf gleicher Basis. Der Vorteil : man benötigt nur EINEN Artikel im Content und hat kaum Verknüpfungen zwischen Code und Content (idcats parametrisieren usw.).
Wie verbindet man sich zu einer weiteren Datenbank?
Schau die mal die Klasse db_contenido an. Die kann man mit Anmeldedaten aufrufen / instanzieren, die auf jede beligige DB zeigen (Contenido - DB ist nur der Standard). Sie bietet schon alle Funktionen, die es zum Lesen in der DB braucht. Zum Zurückschreiben in die DB habe ich noch nichts 'einfaches' gefunden und bastle gerade an meiner eigenen Klasse: bitte noch ein paar Tage Geduld. Google bringt aber hierfür auch eine Menge fertiger Klassen die man Problemlos verwenden kann.
Ich habe für den 'Fremd - DB - Zugriff' eine Klasse von db_contenido abgeleitet und initialisiere diese dann immer gleich mit den passenden Anmeldedaten. Der Quellcode in den Modulen ist dann genauso wie der Contenido - DB - zugriff auch :
Code: Alles auswählen
$myvar=new db_meineklasse();
..
Ich kenne nix fertiges. Sortierung über SQl - Statement, Präsentation über Code ( + Templates)Gibt es ein TabellenModul, welches mir bei der Presentation hilft. Zum Beispiel: Sortierung nach einer Kategorie. Spalten aus-/einblenden.
Code: Alles auswählen
Ach ja und um die Anmeldedaten zum Frontend zu erhalten, ist auch die externen Datenbank abzurufen ...
Code: Alles auswählen
Ich habe daß Gefühl, ich verfremde hier den Sinn von contenido etwas, gibt es vielleicht geschicktere Lösungen für Datenbankabfragen und Darstellungen?
Viel Spaß und viel Erfolg
Tino
Für die Freizeit : www.hobbybrauer.de
das leer-lassen der action ist keine gute idee. das funktioniert nicht mit allen browsern. wenn man die bearbeitung auf der gleichen seite machen möchte, gibt man am besten die aktuelle url als action an.tinof hat geschrieben:Den action - tag lasse ich persönlich immer leer - d.h. ich rufe auch mit dem Absenden der Daten wieder die gleiche Seite wieder auf.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
@kummer:
Danke, werd' ich beherzigen!
@eegroove:
Hab' nochmal nachgeschaut, für den DB - Zugriff habe ich nicht die DB_Contenido sondern DB_SQl abgeleitet (siehe auch /conlib/local.php) :
die $xtc_ variablen sind entsprechend belegt.
Danke, werd' ich beherzigen!
@eegroove:
Hab' nochmal nachgeschaut, für den DB - Zugriff habe ich nicht die DB_Contenido sondern DB_SQl abgeleitet (siehe auch /conlib/local.php) :
Code: Alles auswählen
cInclude("conlib", "db_mysql.inc");
class DB_XTC extends DB_Sql {
var $Host;
var $Database;
var $User;
var $Password;
var $Halt_On_Error = "report";
//Konstruktor
function DB_XTC($Host = "", $Database = "", $User = "", $Password = "")
{
global $xtc_host, $xtc_database, $xtc_user, $xtc_password;
if ($Database)
{
$this->Database = $Database;
} else {
$this->Database = $xtc_database;
}
if ($Host)
{
$this->Host = $Host;
} else {
$this->Host = $xtc_host;
}
if ($User)
{
$this->User = $User;
} else {
$this->User = $xtc_user;
}
if ($Password)
{
$this->Password = $Password;
} else {
$this->Password = $xtc_password;
}
}
}
Für die Freizeit : www.hobbybrauer.de
vielen Dank!
wow, vielen Dank für den freundlichen Support. Ich habe nun wieder viel zu studieren und auszuprobieren.
MfG
Ernst
MfG
Ernst
Es sei noch erwähnt, dass man so für ein DB-Objekt vorgehen kann. Eine Verwendung des Klassenmodels der class.genericdb.php ist mit fremden DBs nur mit Aufwand möglich.
Gruß
HerrB
Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Ok, ich habe mir bestimmt, weil ich in den Contenido - Innereien zu wenig auskenne, zu viel Arbeit gemacht. Aber ich komme so wieder ein wenig auf meinen liebgewonnenen Programmierstil und hoffe, dass das dann die weitere Entwicklung beschleunigt.
Ich will in Zukunft mit der folgenden Klasse arbeiten.
Achtung DAS IST EINE VERSION 0.0.1 und ich programmiere gerade mal 6 Monate in php
Es werden noch einige Anpassungen notwendig sein.
Features :
* Zugriff auf beliebige mysql - DatenbankTABELLEN
* unterstützt zusammengesetzte Schlüssel und autonincs
* Programmier - look & feel wie in vb oder ähnlichen Sprachen
Bitte auch Hinweise posten, wenn man 'sowas' nicht in contenido macht - und warum.
Erstmal etwas quick&dirty Beispielcode, wie man das Objekt verwendet :
Und hier die Klassen:
Ich will in Zukunft mit der folgenden Klasse arbeiten.
Achtung DAS IST EINE VERSION 0.0.1 und ich programmiere gerade mal 6 Monate in php
Es werden noch einige Anpassungen notwendig sein.
Features :
* Zugriff auf beliebige mysql - DatenbankTABELLEN
* unterstützt zusammengesetzte Schlüssel und autonincs
* Programmier - look & feel wie in vb oder ähnlichen Sprachen
Bitte auch Hinweise posten, wenn man 'sowas' nicht in contenido macht - und warum.
Erstmal etwas quick&dirty Beispielcode, wie man das Objekt verwendet :
Code: Alles auswählen
<?php
/**
*
*
* @Test mit Tabelle
* @copyright 2007
*/
include ("class.table.php");
header("Test");
// create db - instance
$db = new db_user("localhost","con_web","contenido","contenido");
//$db->debug=true;
// create table - insance
$table = new db_table($db,'con_kunden');
//$table->debug=true;
// set sort
$table->orderby = 'Name1,Name2';
// get the data
$table->open();
// read all the data
// syntax $table->_fieldname ! das "_" Zeichen identifiziert einen Feldnamen
// und unterscheidet den Bezeichner von übrigen Variablen / Methoden
$table->first();
while (!$table->eof) {
echo $table->_kundennummer . "/" . $table->_name1 . "<br>";
$table->next();
}
// den ersten Satz editieren
$table->first();
if (!$table->eof) {
$table->edit();
$table->_name1 = $table->_name1 . "1";
// und speichern
$table->post();
}
// einen neuen Satz einfügen
$table->append();
$table->_name1= "Name1";
$table->_kundennummer = "23444";
$table->_mandant_id = "2";
$table->post();
// einen Satz suchen
echo "<br>";
echo "<br>";
echo "<br> Locate :";
if ($table->locate(array("kundennummer"=>"12345","mandant_id" => 1))) {
// wenn gefunden, dann ändern :
echo "Gefunden : <br />" ;
echo $table->_kundennummer . "/" . $table->_name1 . "<br>";
$table->edit();
// man beachte die syntax ! PHP 5 !!
$table->_name1 .= "TEST";
$table->post();
} else {
echo "nix gefunden";
}
?>
Code: Alles auswählen
<?php
/**
*
* *** class.table.php ***
* 'Delphi' - like database access for php / mysql
* @version 0.1
* @copyright 2007
* @author Tino Faeustel
*
*/
// some constants
define ("dsclosed",0);
define ("dsbrowse",1);
define ("dsedit",2);
define ("dsinsert",3);
/**
* database - object to encapsulate db-access
* all native db- calls are executed within this object
* (well there should be an abstract class above)
*
* some nice stuff is copied from xt_commerce - shop - software -> thks!
*
**/
Class db_user {
var $host = "";
var $database = "";
var $user = "";
var $password = "";
var $link_id = 0;
var $debug = false;
function db_user($host = "", $database = "", $user = "", $password = ""){
global $contenido_host, $contenido_database, $contenido_user, $contenido_password;
if ($host != "") $this->host = $host; else $this->host = $contenido_host;
if ($database != "") $this->database = $database; else $this->database = $contenido_database;
if ($user != "") $this->user = $user; else $this->user = $contenido_user;
if ($password != "") $this->password = $password; else $this->password = $contenido_password;
}
function connect() {
if (!$this->link_id) {
$this->link_id = mysql_pconnect($this->host,$this->user,$this->password);
if ($this->link_id) {
if (!mysql_select_db($this->database,$this->link_id)) {
$this->error("select db", mysql_errno(), mysql_error());
}
} else {
$this->error("connect server", mysql_errno(), mysql_error());
}
}
return $this->link_id;
}
function close() {
return mysql_close($this->link_id);
}
function error($query, $errno, $error) {
die('<font color="#000000"><b>' . $errno . ' - ' . $error . '<br /><br />' . $query . '<br /><br /><small><font color="#ff0000">[userdb Error]</font></small><br /><br /></b></font>');
}
function dberror($msg){
error($msg,mysql_errno(),mysql_error());
}
function query($query) {
$result = mysql_query($query, $this->link_id) or $this->error($query, mysql_errno(), mysql_error());
return $result;
}
function perform($table, $data, $action = 'insert', $parameters = '') {
reset($data);
if ($action == 'insert') {
$query = 'insert into ' . $table . ' (';
while (list($columns, ) = each($data)) {
$query .= $columns . ', ';
}
$query = substr($query, 0, -2) . ') values (';
reset($data);
while (list(, $value) = each($data)) {
$value = (is_Float($value) & PHP4_3_10) ? sprintf("%.F",$value) : (string)($value);
switch ($value) {
case 'now()':
$query .= 'now(), ';
break;
case 'null':
$query .= 'null, ';
break;
default:
$query .= '\'' . $this->input($value) . '\', ';
break;
}
}
$query = substr($query, 0, -2) . ')';
} elseif ($action == 'update') {
$query = 'update ' . $table . ' set ';
while (list($columns, $value) = each($data)) {
$value = (is_Float($value) & PHP4_3_10) ? sprintf("%.F",$value) : (string)($value);
switch ($value) {
case 'now()':
$query .= $columns . ' = now(), ';
break;
case 'null':
$query .= $columns .= ' = null, ';
break;
default:
$query .= $columns . ' = \'' . $this->input($value) . '\', ';
break;
}
}
$query = substr($query, 0, -2) . ' where ' . $parameters;
}
if ($this->debug) {
echo "<br />*** DB - QUERY ** <br />";
echo $query;
echo "<br />***<br />";
}
return $this->query($query);
}
function data_seek($db_query, $row_number) {
return mysql_data_seek($db_query, $row_number);
}
function fetch_array(&$db_query) {
return mysql_fetch_array($db_query, MYSQL_ASSOC);
}
function num_rows($db_query) {
if (!is_array($db_query)) {
return mysql_num_rows($db_query);
}
}
function fetch_fields($db_query) {
mysql_field_seek($db_query,0);
$result = array();
while ($meta=mysql_fetch_field($db_query)) {
$result[] = $meta;
} // while
return ($result);
}
function getfieldflags($db_query,$field){
return mysql_field_flags($db_query,$field);
}
function free_result($db_query) {
return mysql_free_result($db_query);
}
function insert_id() {
return mysql_insert_id($this->link_id);
}
function input($string) {
if (function_exists('mysql_real_escape_string')) {
return mysql_real_escape_string($string,$this->link_id);
} elseif (function_exists('mysql_escape_string')) {
return mysql_escape_string($string);
}
return addslashes($string);
}
function prepare_input($string) {
if (is_string($string)) {
return trim(stripslashes($string));
} elseif (is_array($string)) {
reset($string);
while (list($key, $value) = each($string)) {
$string[$key] = prepare_input($value);
}
return $string;
} else {
return $string;
}
}
}
/**
* My lovely table - object with the common needed functions
*
* Note : PHP 5 users can use the __get / __set - magics
* that 'feels' like delphi or vb
*
* PHP 4 users should use $this->record[] instead.
**/
class db_table {
var $query_id = 0; // the mysql - query - handle
var $record = array(); // all the data (one record)
var $row; // number of row
var $tablename; // name of the table (user-queries not supportet!)
var $db; // $db- instance - class
var $eof; // if true -> no more records
var $recordcount; // as it sounds
var $fields; // fielddefinitions
var $state; // dsedit,dsbrowse,dsinsert
var $debug=false; // set true to see how it works (or fails ;-))
var $orderby=""; // set the sort order separete with ',' as in SQL - Stmt
private $oldrecord = array();
private $autokey="0";
private $pk = array();
private $where;
function db_table($db, $tablename){
// init
$this->debug = false;
$this->tablename=$tablename;
$this->where = "";
$this->db = $db;
$this->row = 0;
// db - init
$this->db->connect();
// open only for metadata - see open() method for get data
$this->openquery("1=2");
// metadata
$this->fields = $this->db->fetch_fields($this->query_id);
reset($this->fields);
$this->autokey=false;
while(list(,$field) = each($this->fields) ){
if ($field->primary_key == 1) {
$this->pk[$field->name] = null;
if (stripos($this->db->getfieldflags($this->query_id,$field->name), 'auto') > 0) {
$this->autokey = true;
}
}
} // whilelist($this->fields)
$this->db->free_result($this->query_id);
$this->query_id=0;
// let's read the first record
//$this->first();
$this->state = dsclosed;
}
//generally open the table
function openquery($where){
if ($this->query_id) {
$this->db->free_result($this->query_id);
}
$this->where = $where; // save
$query_string = "SELECT * FROM " . $this->db->input($this->tablename);
if ($where != "") {
$query_string .= " WHERE " . $where;
}
if ($this->orderby != "") {
$query_string .= " ORDER BY " . $this->orderby;
}
// open !
$this->query_id = $this->db->query($query_string);
// metadata
$this->recordcount = $this->db->num_rows($this->query_id);
if ($this->debug) {
echo "<br />TABLE OPEN ". $query_string ." Recount " .$this->recordcount . "<br />";
}
}
//get metadata for field $fn
function field($fn){
reset($this->fields);
foreach ($this->$fields as $f) {
if ($f->name == $fn) {
return $f;
}
}
$this->error("unkown field " . $fn);
}
function open(){
$this->openquery("");
$this->state = dsbrowse;
}
// similar error fct
function error ($msg){
$this->db->error("Tabelle " . $this->tablename,-1,$msg);
}
// read a record
function fetch($id){
if ($this->db->data_seek($this->query_id,$id)) {
reset($this->record);
$this->record = $this->db->fetch_array($this->query_id);
$this->row=$id;
return true;
} else {
return false;
}
}
// go to absolutelly first record of table
function first(){
if ($this->state == dsclosed) {
$this->error("$this->tablename: dataset closed $fn");
return;
}
if (!$this->where == "") {
$this->openquery(""); // "refresh"
}
if ($this->recordcount == 0) {
$this->eof = true;
return;
}
if ($this->fetch(0)) {
$this->eof = false;
} else {
$this->error("GetFirst");
}
}
function next(){
if ($this->row == $this->recordcount-1) {
$this->eof = true;
return;
}
$this->row += 1;
if (!$this->fetch($this->row)) {
$this->error('GetNext');
}
}
/** ************************
*
* ! PHP 5 SECTION !
*
* this only works with php versions > 5 !!!
* syntax for accessing data :
* read : $myvar = $mytable -> _fieldname;
* write : $mytable -> _fieldname = $myvar;
* Look at the 'magig' "_" before the fieldname to make a difference
* between regular fieldnames (have to start with "_") and other methods of
* the objects !
** ********************/
function checkfield(&$fn){
if (substr($fn,0,1) != "_") {
$this->error("$this->tablename: wrong field call $fn");
}
$fn=substr($fn,1);
if (!array_key_exists($fn,$this->record)) {
$this->error("$this->tablename: wrong field name $fn");
}
}
function __get($fn){
if ($this->debug) {
echo "<br />GET $this->tablename: " . $fn . "<br />";
}
if ($this->eof) {
$this->error("$this->tablename: no current record $fn");
}
$this->checkfield($fn);
return ($this->record[$fn]);
}
function __set($fn, $val){
if ($this->debug) {
echo "<br />SET $this->tablename: " . $fn . " => " . $val . "<br />";
}
if ($this->state == dsbrowse) {
$this->error("$this->tablename: not in edit mode $fn");
}
$this->checkfield($fn);
$this->record[$fn] = $val;
}
/**
* END OF PHP 5 SECTION
**/
function clearrec(){
// clear data values. uses fields[] array to
// setup ALL fields (look checkfield())
reset($this->fields);
while (list($id) = each($this->fields)) {
$this->record[$this->fields[$id]->name] = null;
}
}
// initiates an UPDATE
function edit(){
if ($this->state == dsclosed) {
$this->error("$this->tablename: dataset closed $fn");
return;
}
$this->oldrecord = $this->record;
$this->state = dsedit;
reset($this->pk);
while(list($key) = each($this->pk) ){
$this->pk[$key] = $this->record[$key];
}
if ($this->debug) {
echo "<br />EDIT $this->tablename <br />";
echo "<pre>";
print_r($this->pk);
echo "</pre>";
}
}
// initiates an INSERT
function append(){
//unset($this->oldrecord);
$this->oldrecord = $this->record;
$this->clearrec();
$this->state = dsinsert;
if ($this->debug) {
echo "<br />APPEND $this->tablename <br />";
}
}
// update only fields where changed (performace)
function buildchangerec(){
$result=array();
reset($this->record);
if ($this->state == dsinsert) {
while (list($key,$value) = each($this->record)){
if ($value != null) {
$result[$key] = $value;
}
}
} else {
while (list($key,$value) = each($this->record)){
if ($this->oldrecord[$key] != $value) {
$result[$key] = $value;
}
}
}
if ($this->debug) {
echo "<br />CHANGEREC $this->tablename: ";
echo "<pre>";
print_r ($result);
echo "</pre>";
}
return $result;
}
// perform the action started by edit() or append()
function post(){
switch ($this->state) {
case dsbrowse:
case dsclosed:
$this->db->error("not in edit mode");
return;
case dsedit:
$rec=$this->buildchangerec();
if (count($rec)==0) {
break;
}
$where="";
reset($this->pk);
while (list($key,$value) = each($this->pk)) {
if ($this->fields[$key]->numeric == 1) {
$where .= $key . "=" . $value . " AND ";
} else {
$where .= $key . "='" . $value . "' AND ";
}
}
$where = substr($where,0,-5);
$this->db->perform($this->tablename, $rec , 'update', $where);
$this->openquery($where);
break;
case dsinsert:
$rec=$this->buildchangerec();
if (count($rec)==0) {
break;
}
$where="";
while (list($key) = each($this->pk)) {
if ($this->field($key)->numeric == '1') {
$where .= $key . "=" . $this->record[$key] . " AND ";
} else {
$where .= $key . "='" . $this->record[$key] . "' AND ";
}
}
$where = substr($where,0,-5);
$this->db->perform($this->tablename, $rec, 'insert');
if ($this->autokey) {
// reread
$last_id = $this->db->insert_id();
$key=array_keys($this->pk);
$where = $key[0] . " = " . $last_id;
}
$this->openquery($where);
break;
}
$this->state = dsbrowse;
}
// suspend the action
function cancel(){
if ($this->state != dsbrowse) {
// only here is oldrecord filled
$this->record = $this->oldrecord;
$this->state = dsbrowse;
}
}
// find a record
// keys = array('fieldname' => 'searchvalue');
function locate($keys){
if ($this->state == dsclosed) {
$this->error("Dataset not open !");
return;
}
if ($this->debug) {
echo "<br />LOCATE $this->tablename: <br />";
echo "<pre>";
print_r($keys);
echo "</pre>";
}
$where="";
reset($keys);
while (list($key,$value) = each($keys)){
//$fld=$this->field($key);
if ($fld->numeric==1) {
$where .= $where . $key . " = " . $value . " AND ";
} else {
$where .= $where . $key . " = '" . $value . "' AND ";
}
}
$where = substr($where,0,-5);
$this->openquery($where);
if ($this->recordcount==0) {
$this->eof=true;
} else {
$this->fetch(0);
$this->eof=false;
}
return (!$this->eof);
}
// free the result
function close(){
if ($this->$query_id) {
$this->db->free_result($query_id);
}
$this->query_id=0;
$this->state = dsclosed;
}
}
?>
Für die Freizeit : www.hobbybrauer.de
Ist auch mal eine Variante. Die class.table.php sollte man dann in das Mandanten-Verzeichnis/includes legen. Dort lässt es sich (aus einem Modul) mit cInclude ("frontend", "includes/class.table.php"); einbinden.
Gruß
HerrB
Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Ist die externe DB eine mysql Datenbank oder ein RDBMS von einem anderen Hersteller? Blender ist doch eine 3d-Renderingsoftware, oder handelt es sich um eine andere DBMS-Software?
Wie dem auch sei:
Wenn du in vielen Modulen auf diese DB zugreifen musst, lohnt es sich eine eigene Klaase anzulegen. Wie das geht? Im Verzeichnis conlib liegen ein paar vorkonfigurierte Scripts mit verschiedenen ("deaktivierten") DB_Sql klassen jeweils für sybase, oracle, und noch ein paar andere. Für Blender müsstest Du dir analog eine eigene Basisklasse DB_SQL_Blender anlegen (DB_Sql wird ja schon als Basisklasse für Mysql-Connektivity benutzt) , und von dieser wiederum ableiten, z.B DB_Blender. In die abgeleitete Klasse kann man dann default usernamen und passwort reinschreiben oder andere Konstruktoren verwenden usw.
Wenn Dir das zu aufwendig ist, könntest du auch in Modulen auf die ominöse Blender DB direkt zugreifen mit einer PHP FUnktion die wahrscheinlich so irgendwie heisst: blender_connect(Username, passwort, dbname), und dann weiter mit blender_query($sql). (Keine ahnung ob es die wirklich gibt!)
Nur hast Du dann eine andere zugriffssyntax als contenido-üblich mit $db->query(), und möglw. überall usernamen und passwort im Modulen verstreut.
-
Tabellensortier-Funktionalität kann man auch in Javascript programmieren. Dies ist nur eine Option wenn die Webseiten nur von Usern mit Modernen Browsern aufgesucht werden , und wenn die zu sortierenden Spalten aus Standard-datentypen bestehen (int, float, string, datetime ... wenn man zB nach Datums-Intervallen sortiert wird es meist zu kompliziert diese Zeitangaben in Javascript zu parsen), die Tabellen nicht zu lang sind usw.
Ich habe das mal gemacht mit der kleinen JQuery Javascript Bibliothek und dessen "Tablesorter Plugin".
Wie gesagt, ist nur eine Option. Geht aber mit Javascript schneller als mit PHP alles serverseitig zu programmieren.
Wie dem auch sei:
Wenn du in vielen Modulen auf diese DB zugreifen musst, lohnt es sich eine eigene Klaase anzulegen. Wie das geht? Im Verzeichnis conlib liegen ein paar vorkonfigurierte Scripts mit verschiedenen ("deaktivierten") DB_Sql klassen jeweils für sybase, oracle, und noch ein paar andere. Für Blender müsstest Du dir analog eine eigene Basisklasse DB_SQL_Blender anlegen (DB_Sql wird ja schon als Basisklasse für Mysql-Connektivity benutzt) , und von dieser wiederum ableiten, z.B DB_Blender. In die abgeleitete Klasse kann man dann default usernamen und passwort reinschreiben oder andere Konstruktoren verwenden usw.
Wenn Dir das zu aufwendig ist, könntest du auch in Modulen auf die ominöse Blender DB direkt zugreifen mit einer PHP FUnktion die wahrscheinlich so irgendwie heisst: blender_connect(Username, passwort, dbname), und dann weiter mit blender_query($sql). (Keine ahnung ob es die wirklich gibt!)
Nur hast Du dann eine andere zugriffssyntax als contenido-üblich mit $db->query(), und möglw. überall usernamen und passwort im Modulen verstreut.
-
Tabellensortier-Funktionalität kann man auch in Javascript programmieren. Dies ist nur eine Option wenn die Webseiten nur von Usern mit Modernen Browsern aufgesucht werden , und wenn die zu sortierenden Spalten aus Standard-datentypen bestehen (int, float, string, datetime ... wenn man zB nach Datums-Intervallen sortiert wird es meist zu kompliziert diese Zeitangaben in Javascript zu parsen), die Tabellen nicht zu lang sind usw.
Ich habe das mal gemacht mit der kleinen JQuery Javascript Bibliothek und dessen "Tablesorter Plugin".
Wie gesagt, ist nur eine Option. Geht aber mit Javascript schneller als mit PHP alles serverseitig zu programmieren.
Gruss,
Knut
Knut
Hallo alle,
wieder viel verstanden! Danke!
die Anbindung an die Datenbank ist einfach via odbc, das mache ich funktional. Die Daten in eine Tablle bringen, habe ich auch gelöst.
Jetzt habe ich inzwischen ein neues Problem. Und zwar werden meine Module inzwischen etwas länger (mehr als 10 Zeilen), das bedeutet, daß ich da öfter die Übersicht verliere, auch weil der Texteditor kein Syntaxhighlightning hat.
(Ich will gar nicht erzählen, wie oft bei mir irgendwelche Anführungszeichen fehlen oder zuviel sind ...)
Gibt es eine Möglichkeit, die Module mit extern Tools zB. mit Eclipses Aptana oder sowas zu bearbeiten? Und zwar so, daß man beim speichern bei Eclipse die neue Version gleich zu Contenido schickt?
Ich ahne, daß Problem kann sehr aufwenig werden, aber ich brauche im Moment kein Debugging und keine Vorschaufunctionen in Eclipse. Aber eine eierlegende Wollmilchsau neheme ich auch, falls es sowas gibt.
Danke.
Mit freundlichen Grüßen
Ernst
PS: Danke für den Tip, wo selbstgeschriebene php-Dateien abgelegt werden sollten, hab mir fast gedacht, daß /cms nicht der richtige Ordner ist...
wieder viel verstanden! Danke!
die Anbindung an die Datenbank ist einfach via odbc, das mache ich funktional. Die Daten in eine Tablle bringen, habe ich auch gelöst.
Jetzt habe ich inzwischen ein neues Problem. Und zwar werden meine Module inzwischen etwas länger (mehr als 10 Zeilen), das bedeutet, daß ich da öfter die Übersicht verliere, auch weil der Texteditor kein Syntaxhighlightning hat.
(Ich will gar nicht erzählen, wie oft bei mir irgendwelche Anführungszeichen fehlen oder zuviel sind ...)
Gibt es eine Möglichkeit, die Module mit extern Tools zB. mit Eclipses Aptana oder sowas zu bearbeiten? Und zwar so, daß man beim speichern bei Eclipse die neue Version gleich zu Contenido schickt?
Ich ahne, daß Problem kann sehr aufwenig werden, aber ich brauche im Moment kein Debugging und keine Vorschaufunctionen in Eclipse. Aber eine eierlegende Wollmilchsau neheme ich auch, falls es sowas gibt.
Danke.
Mit freundlichen Grüßen
Ernst
PS: Danke für den Tip, wo selbstgeschriebene php-Dateien abgelegt werden sollten, hab mir fast gedacht, daß /cms nicht der richtige Ordner ist...
du kannst verwenden, was immer du willst. du musst dann einfach den code wieder in contenido hinein kopieren.
ich löse das jeweils über klassen. das modul selber macht lediglich den klassenaufruf. die klasse selber liegt in einer datei, die ich per include hinein nehme. dann brauchst du lediglich die klasse zu publizieren. das sollte mit eclipse gehen.
ich löse das jeweils über klassen. das modul selber macht lediglich den klassenaufruf. die klasse selber liegt in einer datei, die ich per include hinein nehme. dann brauchst du lediglich die klasse zu publizieren. das sollte mit eclipse gehen.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)