Import von Artikeln per CSV

Gesperrt
ch.schulze
Beiträge: 44
Registriert: Mo 25. Aug 2003, 22:41
Kontaktdaten:

Import von Artikeln per CSV

Beitrag von ch.schulze »

Hallo!

kann man Artikel, die an einer bestimmten Liste hängen sollen, per CSV in die DB importieren?
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

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...
*** make your own tools (wishlist :: thx)
knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb »

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"?
Gruss,
Knut
ch.schulze
Beiträge: 44
Registriert: Mo 25. Aug 2003, 22:41
Kontaktdaten:

Beitrag von ch.schulze »

welche Tabellen sind denn betroffen?
das heisst, in welchen Tabellen wird etwas hinzugefügt / geändert bei der Neuanlage eines Artikels?
schlaucher
Beiträge: 444
Registriert: Mi 14. Sep 2005, 10:38
Wohnort: Karlsruhe
Kontaktdaten:

Beitrag von schlaucher »

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?
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.
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
ch.schulze
Beiträge: 44
Registriert: Mo 25. Aug 2003, 22:41
Kontaktdaten:

Beitrag von ch.schulze »

so wie ich es gerade gesehen hab, sind "nur" die tabellen con_art und con_art_lang und con_content davon betroffen.

hat dem jemend was entgegen zu setzen?
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

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.

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();

?>
ch.schulze
Beiträge: 44
Registriert: Mo 25. Aug 2003, 22:41
Kontaktdaten:

Beitrag von ch.schulze »

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?!
knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb »

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; 
...

Code: Alles auswählen

conEditFirstTime ( ... , $import_idtpl    , ...);
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 .
Gruss,
Knut
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

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; 
...

Code: Alles auswählen

conEditFirstTime ( ... , $import_idtpl    , ...);
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 .
Danke :)

Einem Artikel muss man kein Template zuweisen. Wenn dies der Fall ist, dann "nimmt" der Artikel das Template der Kategorie und dessen Konfiguration.
tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof »

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).
Für die Freizeit : www.hobbybrauer.de
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

ch.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?!
Du musst quasi deine CSV Datei oeffnen, durch jede Zeile iterieren (siehe Block

Code: Alles auswählen

# alle Ordner + Dateien im energielex_root einlesen
foreach ($dirs2search as $aSubDir) "
und die Konstanten vorher und die Variablen in der Schleife mit den entsprechenden Werten aus der CSV Datei Zeile befüllen
Gesperrt