Import von Artikeln per CSV
-
- Beiträge: 44
- Registriert: Mo 25. Aug 2003, 22:41
- Kontaktdaten:
Import von Artikeln per CSV
Hallo!
kann man Artikel, die an einer bestimmten Liste hängen sollen, per CSV in die DB importieren?
kann man Artikel, die an einer bestimmten Liste hängen sollen, per CSV in die DB importieren?
wenn man es entsprechend ausprogrammiert -> klar, warum nicht ?
wenn sich die frage darauf bezieht, ob es das hier im forum schon gibt -> ich habs noch nicht gesehen...
wenn sich die frage darauf bezieht, ob es das hier im forum schon gibt -> ich habs noch nicht gesehen...
*** make your own tools (wishlist :: thx)
Aus dem Bauch:
Nicht dass ich wüsste ... da es keine createArticle() Funktion gibt und auch API-Aufrufe wie $a = new Article; $a->setContent($html); $a->store() nicht unterstützt werden.
Vielleicht geht ein Hack mit der conCopyArticle() Funktion, wenn Deine zu importierenden Artikel z.T. redundant sind und aus einer Vorlage erzeugt werden könnten. Tabelle con_content könntest Du notfalls per SQL updaten
Darf ... nicht ... weiter ...drüber ... nachdenken ...
Oder:
Du könntest ein Plugin schreiben welches Deine Inhalte in der contenido mysql Datenbank speichert ... in eigenen, selbst anzulegenden und selbst zu füllenden Tabellen.
(So wie Du deine Frage gestellt hast glaube ich nicht dass dies eine Option für Dich ist.)
Vielleicht antwortet noch mal einer der Support-Veteranen hier aus dem Forum auf Deine Frage. Wenn er/sie die Frage denn versteht . Was meinst Du mit "an bestimmte[n] Liste hängen"?
Nicht dass ich wüsste ... da es keine createArticle() Funktion gibt und auch API-Aufrufe wie $a = new Article; $a->setContent($html); $a->store() nicht unterstützt werden.
Vielleicht geht ein Hack mit der conCopyArticle() Funktion, wenn Deine zu importierenden Artikel z.T. redundant sind und aus einer Vorlage erzeugt werden könnten. Tabelle con_content könntest Du notfalls per SQL updaten

Oder:
Du könntest ein Plugin schreiben welches Deine Inhalte in der contenido mysql Datenbank speichert ... in eigenen, selbst anzulegenden und selbst zu füllenden Tabellen.
(So wie Du deine Frage gestellt hast glaube ich nicht dass dies eine Option für Dich ist.)
Vielleicht antwortet noch mal einer der Support-Veteranen hier aus dem Forum auf Deine Frage. Wenn er/sie die Frage denn versteht . Was meinst Du mit "an bestimmte[n] Liste hängen"?
Gruss,
Knut
Knut
-
- Beiträge: 44
- Registriert: Mo 25. Aug 2003, 22:41
- Kontaktdaten:
-
- Beiträge: 444
- Registriert: Mi 14. Sep 2005, 10:38
- Wohnort: Karlsruhe
- Kontaktdaten:
Es gibt in der functions.con.php die Funktionen conEditFirstTime(), bzw conEditArt() mit der Contenido neue Artikel erstellt uns ändert. Damit könnte man beginnen.ch.schulze hat geschrieben:welche Tabellen sind denn betroffen?
das heisst, in welchen Tabellen wird etwas hinzugefügt / geändert bei der Neuanlage eines Artikels?
Anschließend müsste man dann die Tabelle con_content für den Artikel füllen.
Das ist natürlich ganz grob im Ansatz, aber vielleicht hilft es Dir weiter.
Gruß
schlaucher
-
- Beiträge: 44
- Registriert: Mo 25. Aug 2003, 22:41
- Kontaktdaten:
-
- Beiträge: 103
- Registriert: Fr 28. Jan 2005, 15:15
- Wohnort: Unna
- Kontaktdaten:
ich habe mal eine Datenübernahme programmiert, die aus statischen Seiten, die mit Dreamweaver Templates erstellt worden sind, die Inhalte in einzelne Artikel importiert.
Dazu habe ich mich durch den Contenido Sourcecode gegraben und über Copy&Paste nachher mir einen Datei datenuebernahme.php im contenido/ Verzeichniss erstellt. Nach einem Login in contenido, habe ich diese Datei manuell aufgerufen (inkl. dem dann sichtbaren sess Parameter in der URL)
Dazu muss man aber wissen, in welchen CMS_xx[nr] Feldern was in dem jeweiligen Template in einer Kategorie gespiechert wird und wie die Werte für $client, $lang und $idcat sind.
Dazu habe ich mich durch den Contenido Sourcecode gegraben und über Copy&Paste nachher mir einen Datei datenuebernahme.php im contenido/ Verzeichniss erstellt. Nach einem Login in contenido, habe ich diese Datei manuell aufgerufen (inkl. dem dann sichtbaren sess Parameter in der URL)
Dazu muss man aber wissen, in welchen CMS_xx[nr] Feldern was in dem jeweiligen Template in einer Kategorie gespiechert wird und wie die Werte für $client, $lang und $idcat sind.
Code: Alles auswählen
<?php
include_once ('./includes/startup.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.forms.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');
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');
if ($cfg["use_pseudocron"] == true)
{
/* Include cronjob-Emulator, but only for frame 1 */
if ($frame == 1)
{
$sess->freeze();
$oldpwd = getcwd();
chdir($cfg["path"]["contenido"].$cfg["path"]["cronjobs"]);
cInclude("includes", "pseudo-cron.inc.php");
chdir($oldpwd);
if ($bJobRunned == true)
{
/* Some cronjobs might overwrite important system variables.
* We are thaw'ing the session again to re-register these variables.
*/
$sess->thaw();
}
}
}
/* Remove all own marks, only for frame 1 and 4 */
if ($frame == 1 || $frame == 4)
{
$col = new InUseCollection;
$col->removeSessionMarks($sess->id);
}
/* If the override flag is set, override a specific InUseItem */
if (isset($overrideid) && isset($overridetype))
{
$col = new InUseCollection;
$col->removeItemMarks($overridetype, $overrideid);
}
# Create Contenido classes
$db = new DB_Contenido;
$notification = new Contenido_Notification;
$classarea = new Area();
$classlayout = new Layout();
$classclient = new Client();
$classuser = new User();
$currentuser = new User();
$currentuser->loadUserByUserID($auth->auth["uid"]);
# change Client
if (isset($changeclient) && is_numeric($changeclient) ) {
$client = $changeclient;
unset($lang);
}
# Sprache wechseln
if (isset($changelang) && is_numeric($changelang) ) {
unset($area_rights);
unset($item_rights);
$lang = $changelang;
}
if (!is_numeric($client) ||
(!$perm->have_perm_client("client[".$client."]") &&
!$perm->have_perm_client("admin[".$client."]")))
{
// use first client which is accessible
$sess->register("client");
$sql = "SELECT idclient FROM ".$cfg["tab"]["clients"]." ORDER BY idclient ASC";
$db->query($sql);
while ($db->next_record())
{
$mclient = $db->f("idclient");
if ($perm->have_perm_client("client[".$mclient."]") ||
$perm->have_perm_client("admin[".$mclient."]") )
{
unset($lang);
$client = $mclient;
break;
}
}
} else {
$sess->register("client");
}
if (!is_numeric($lang) || $lang == "") {
$sess->register("lang");
# search for the first language of this client
$sql = "SELECT * FROM ".$cfg["tab"]["lang"]." AS A, ".$cfg["tab"]["clients_lang"]." AS B WHERE A.idlang=B.idlang AND idclient='$client' ORDER BY A.idlang ASC";
$db->query($sql);
$db->next_record();
$lang = $db->f("idlang");
} else {
$sess->register("lang");
}
if (array_key_exists("use_encoding", $_GET))
{
$use_encoding = $_GET["use_encoding"];
}
if (array_key_exists("use_encoding", $_POST))
{
$use_encoding = $_POST["use_encoding"];
}
if (!isset($use_encoding))
{
$use_encoding = true;
}
if (is_string($use_encoding))
{
if ($use_encoding == "false")
{
$use_encoding = false;
} else {
$use_encoding = true;
}
}
if ($use_encoding != false)
{
$sql = "SELECT idlang, encoding FROM ".$cfg["tab"]["lang"];
$db->query($sql);
$aLanguageEncodings = array();
while ($db->next_record())
{
$aLanguageEncodings[$db->f("idlang")] = $db->f("encoding");
}
if (array_key_exists($lang, $aLanguageEncodings))
{
if (!in_array($aLanguageEncodings[$lang], $cfg['AvailableCharsets']))
{
header("Content-Type: text/html; charset=ISO-8859-1");
} else {
header("Content-Type: text/html; charset={$aLanguageEncodings[$lang]}");
}
} else {
header("Content-Type: text/html; charset=ISO-8859-1");
}
}
$perm->load_permissions();
# Create Contenido classes
$xml = new XML_doc;
$tpl = new Template;
$backend = new Contenido_Backend;
# Register session variables
$sess->register("sess_area");
if (isset($area)) {
$sess_area = $area;
} else {
$area = ( isset($sess_area) && $sess_area != "" ) ? $sess_area : 'login';
}
$sess->register("cfgClient");
$sess->register("errsite_idcat");
$sess->register("errsite_idart");
if ($cfgClient["set"] != "set")
{
rereadClients ();
}
# Initialize Contenido_Backend.
# Load all actions from the DB
# and check if permission is
# granted.
if ($cfg["debug"]["rendering"] == true)
{
if (function_exists("memory_get_usage"))
{
$oldmemusage = memory_get_usage();
}
}
# Select frameset
$backend->setFrame($frame);
# Select area
$backend->select($area);
$cfg["debug"]["backend_exectime"]["start"] = getmicrotime();
# Include all required 'include' files.
# Can be an array of files, if more than
# one file is required.
if (is_array($backend->getFile('inc'))) {
foreach ($backend->getFile('inc') as $filename) {
include_once($cfg['path']['contenido'].$filename);
}
}
# If $action is set -> User klicked some button/link
# get the appopriate code for this action and evaluate it.
if (isset($action) && $action != "")
{
if (!isset($idart))
{
$idart = 0;
}
$backend->log($idcat, $idart, $client, $lang, $action);
}
if (isset($action)) {
if ($backend->getCode($action) != '') {
if ($backend->debug == 1) {
echo '<pre style="font-family: verdana; font-size: 10px"><b>Executing:</b>'."\n";
echo $backend->getCode($action)."\n";
echo '</pre>';
}
eval($backend->getCode($action));
} else {
if ($backend->debug == 1) {
echo '<pre style="font-family: verdana; font-size: 10px"><b>Executing:</b>'."\n";
echo "no code available in action\n";
echo '</pre>';
}
}
}
include_once($cfg['path']['contenido'].$cfg['path']['includes'].'functions.con.php');
function GetSubDirs($rootDir, &$ar_result, $parentDirStr)
{
$dir_handle = "dir".str_replace("/", "_", $parentDirStr);
$$dir_handle = @opendir($rootDir);
if ($$dir_handle !== false)
{
while (false !== ($file = readdir($$dir_handle)))
{
if (($file != ".")
&& ($file != "..")
&& ($file != "CVS")
&& ($file != "classes")
&& ($file != "imgs")
&& ($file != str_replace(PROJEKT_ROOT, "", FILE_DEPOSIT_RELATIV))
&& ($file != "pear")
&& (strpos($file, ".") === FALSE))
{
array_push($ar_result, $parentDirStr."/".$file);
GetSubDirs($rootDir.$file."/", $ar_result, $parentDirStr."/".$file);
}
}
closedir($$dir_handle);
}
}
function GetFilesInDir($dir)
{
$dir_handle = opendir($dir);
$ar_files = array();
while (false !== ($file = readdir($dir_handle)))
{
if (($file != '.') && ($file != '..') && (!is_dir($file)))
{
array_push($ar_files, $file);
}
}
closedir($dir_handle);
sort($ar_files);
return $ar_files;
} // function GetFilesInDir($dir)
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
function DecodeStringHTML($string)
{
global $trans_tbl;
return strtr($string, $trans_tbl);
}
ini_set('max_execution_time', 300);
# Konstanten für das SWU Energielexikon
$import_client = 6;
$import_lang = 6;
$import_idcat = 507;
$import_idcatnew = array($import_idcat);
$import_idart = null;
$import_is_start = 0;
$import_idtpl = null;
$import_idartlang = null;
$import_summary = null;
$import_artspec = null;
$import_created = date('Y-m-d H:i:s');
$import_lastmodified = date('Y-m-d H:i:s');
$import_author = 'swu_admin';
$import_online = 1;
$import_datestart = '0000-00-00 00:00:00';
$import_dateend = '0000-00-00 00:00:00';
$import_artsort = 0;
# Pfad zum Energielexikon
$energielex_root = '__-Energielexikon';
$dirs2search = array();
GetSubDirs($energielex_root, $dirs2search, '');
# alle Ordner + Dateien im energielex_root einlesen
foreach ($dirs2search as $aSubDir)
{
$files2import = GetFilesInDir($energielex_root.$aSubDir);
foreach ($files2import as $aFile2Import)
{
echo "<h3>".$aFile2Import."</h3>\r\n";
# Datei einlesen
$fileContent = str_replace(" ", " ", str_replace("\r", " ", str_replace("\n", " ", file_get_contents($energielex_root.$aSubDir.'/'.$aFile2Import))));
...
$import_title = $Ueberschrift;
$CMS_HTML = '';
$CMS_HTML .= (strlen($Unterschrift) > 0 ? '<h2>'.$Unterschrift.'</h2>' : '');
$CMS_HTML .= (strlen($ColorText) > 0 ? '<h3>'.$ColorText.'</h3>' : '');
$CMS_HTML .= (strlen($Mengentext) > 0 ? $Mengentext : '');
# Artikel anlegen -BEGIN-
$import_idart = conEditFirstTime($import_idcat, $import_idcatnew, $import_idart, $import_is_start, $import_idtpl, $import_idartlang, $import_lang, $import_title, $import_summary, $import_artspec, $import_created, $import_lastmodified, $import_author, $import_online, $import_datestart, $import_dateend, $import_artsort);
# idcatart ermitteln
$sql = "SELECT idcatart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".$import_idcat."' AND idart = '".$import_idart."'";
$db->query($sql);
$db->next_record();
$import_idcatart = $db->f("idcatart");
# idartlang ermitteln
$sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE idart = $import_idart AND idlang = $import_lang";
$db->query($sql);
$db->next_record();
$import_idartlang = $db->f("idartlang");
# nicht als startartikel setzen
conMakeStart($import_idcatart, 0);
# "Titel der Seite" füllen
$typenr = 3;
#$CMS_TEXT = 'la le lu';
consaveContentEntry($import_idartlang, "CMS_TEXT", $typenr, $import_title);
# "Inhalt" füllen
$typenr = 1;
#$CMS_HTML = '<h2>la </h2>le lu';
consaveContentEntry($import_idartlang, "CMS_HTML", $typenr, $CMS_HTML);
# Artikel anlegen -ENDE-
flush();
}
}
page_close();
?>
-
- Beiträge: 44
- Registriert: Mo 25. Aug 2003, 22:41
- Kontaktdaten:
ich versuche gerade mit conEditFirstTime selbst gerade neue Artikel zu erzeugen und bin dabei auf diesen Code gestossen. Enthält wirklich clevere Ideen, der Energielexikon-Kram entspricht aber natürlich nicht dem was ich brauche.
Kann mir jemand sagen ob die Template-ID null sein kann, wenn man einen Artikel anlegt? In obigen Code ist dass so:
...
Ein neuer Artikel muss doch einem Template zugewiesen werden oder? Kennt man doch aus der Arbeit im backend. Sonst ist der Artikel zwar vorhanden, aber irgendwie unfertig.
Vielleicht beantworte ich mir die Frage nachher auch selbst .
Kann mir jemand sagen ob die Template-ID null sein kann, wenn man einen Artikel anlegt? In obigen Code ist dass so:
Code: Alles auswählen
$import_idtpl = null;
Code: Alles auswählen
conEditFirstTime ( ... , $import_idtpl , ...);
Vielleicht beantworte ich mir die Frage nachher auch selbst .
Gruss,
Knut
Knut
-
- Beiträge: 103
- Registriert: Fr 28. Jan 2005, 15:15
- Wohnort: Unna
- Kontaktdaten:
Danke :)knb hat geschrieben:ich versuche gerade mit conEditFirstTime selbst gerade neue Artikel zu erzeugen und bin dabei auf diesen Code gestossen. Enthält wirklich clevere Ideen, der Energielexikon-Kram entspricht aber natürlich nicht dem was ich brauche.
Kann mir jemand sagen ob die Template-ID null sein kann, wenn man einen Artikel anlegt? In obigen Code ist dass so:
...Code: Alles auswählen
$import_idtpl = null;
Ein neuer Artikel muss doch einem Template zugewiesen werden oder? Kennt man doch aus der Arbeit im backend. Sonst ist der Artikel zwar vorhanden, aber irgendwie unfertig.Code: Alles auswählen
conEditFirstTime ( ... , $import_idtpl , ...);
Vielleicht beantworte ich mir die Frage nachher auch selbst .
Einem Artikel muss man kein Template zuweisen. Wenn dies der Fall ist, dann "nimmt" der Artikel das Template der Kategorie und dessen Konfiguration.
Ich glaube, wenn der Kategorie ein Template zugewiesen ist, dann reicht das. Alle Artikel ohne ausdrückliches Template verwenden dann das laut Kategorie.
Zumindest in der 4.6.15 er Version (ich glaub' früher war das anders).
Zumindest in der 4.6.15 er Version (ich glaub' früher war das anders).
Für die Freizeit : www.hobbybrauer.de
-
- Beiträge: 103
- Registriert: Fr 28. Jan 2005, 15:15
- Wohnort: Unna
- Kontaktdaten:
Du musst quasi deine CSV Datei oeffnen, durch jede Zeile iterieren (siehe Blockch.schulze hat geschrieben:Hallo!
Danke für Deinen Post, doch kann ich damit irgendwie noch nix anfangen :-/
Was muss ich genau tun, ausser mir Deinen Code in einen PHP Datei zu kopieren und die dann wie beschrieben aufrufen?!
Code: Alles auswählen
# alle Ordner + Dateien im energielex_root einlesen
foreach ($dirs2search as $aSubDir) "