Produktdaten importieren und als Artikel anlegen?

Gesperrt
roterMilan
Beiträge: 16
Registriert: Di 11. Dez 2007, 14:52
Kontaktdaten:

Produktdaten importieren und als Artikel anlegen?

Beitrag von roterMilan » Di 11. Dez 2007, 14:59

Hallo,

Habe schon etwas hier in Forum gesucht, aber keine konkrete Antwort gefunden.

Ich möchte Produktdaten aus einem Shopsystem in Contenido importieren. Dabei soll jeweils ein Produktdatensatz zu einem Artikel in Contenido werden.

Ich möchte möglichst nicht direkt in die Datenbank schreiben. Gibt es irgendeine Schnittstelle für Contenido, über die man automatisch Artikel anlegen kann?

Beim Ausgansformat der zu importierenden Daten wäre ich flexibel. Das könnte CSV, XML, Excel o.ä. sein.

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Di 11. Dez 2007, 17:51

Die meiste Arbeit macht eher die Ziel-Plattform (Contenido) nicht die Datenquelle.

Ich kann hier den Weg nur skizzieren:
Du willst wahrscheinlich alle drei Features:
  • Create Overview (List of Importable/Imported HTML Files)" ),
    ...and create a new Contenido Article per Imported File. Empty Article inherits Template from Category"
    ......and attempt to fill new Articles with HTML Code, using Template assignment below"
Das kann man mit einem Loop machen, der dann einige contenido API funktionen aufruft.
In diesem Beispiel importiere ich HTML files :

Code: Alles auswählen

//always generate linklist, no matter what the "action" is  
		foreach ($files as $file => $cnt) {
			if (isWanted(deletePrevious){
				$delArt += deleteArticles($elems, $opt, $txt);
			} 

			// if user wants this, create new empty article 
			// in overview article, make link to new article 
			if ( isWanted( ...)
				)) {
				//create new article, title = $title or filename; and assign specific template.						
				$new_idart = createArticle($elems, $opt, $txt);
				if (! $new_idart == 0){
				  //use idart to make a link in overview page
				}
			} 
			
			if (isWanted(..new article with text.){
				//grab newly created article	
				$newart = new Article($new_idart, $opt['client'], $opt['lang']);
				$ial = $newart->getField('idartlang');
				if ( ...) {
					//create new article based on template "default"
					$def["idtpl"] = '73';			
				} elseif ...
					//createnew article based on template "sometemplate"
					$def["idtpl"] = '168';
					
				} elseif (...) {
					//createnew article based on template "someothertpl"
					$def["idtpl"] = '169'; //might be changed in future versions of this module
				} else {
					echo "<pre>?? can't create new Article using this template assginment {$def["idtpl"]}</pre>\n";
				}
								
		        $al = new cApiArticleLanguage($ial);
		        $al->assignTemplate($def['idtpl']);
		        $al->set("pagetitle", $elems['title']);
		        $al->store();
			}
												


- assignTemplate musste ich selber implementieren

Folgendes ist zu includieren

Code: Alles auswählen

cInclude('classes', 'class.article.php');
cInclude('classes', 'class.cat.php');
cInclude('classes', 'class.template.php');
cInclude('includes', 'functions.con.php');
cInclude('frontend', 'includes/functions.icdp.php'); //contains dirlist function print2log
cInclude('classes', 'contenido/class.articlelanguage.php');
die Methode createArticle ist ebenfalls eine selbsgeschriebene Fkt die nur ein simpler Wrapper für die API funktion conEditFirstTime (nur dass sie noch default werte setzt und keine 18 Params mehr verlangt):

Code: Alles auswählen

function createArticle($elems, $opt, $txt) {
		//parse "product" options
	//that means: create new article(s) if desired
	//conEditFirstTime  	(  	
	//$idcat,$idcatnew,$idart,$is_start,$idtpl,
	//$idartlang,$idlang,$title,$summary,$artspec,
	//$created,$lastmodified,$author,$online,
	//$datestart,$dateend,$artsort,$keyart = 0
	//) 
	$new_art_id = 0;
	$def = array ();
	//always the same values
	getsetNewarticleDefaults($def); 
	
	/* 
	 * template ids, contenido-dev
	 * 73-default  
	 * 162 -
	 * 167/168- ...
	 * 
	 * nongeneric, dynamic defaults:
	 */
	 $withsource = 1;
	 $def["title"] = getArticleTitle($elems, $opt, $txt, $withsource);
	 $def["summary"] = $def["title"] . ", imported " . date("r", time());
	 $def["lang"] = $opt["lang"];
	 $def["client"] = $opt["client"];
  	 $def["idcat"] = $opt['selcat'];
	 $def["idcatnew"] =  array($def["idcat"]); //for unknown reasons, this param must be an array 
	 
	 //echo "<pre>def[] is now: " . print_r($def) . "</pre>";
	 $def["idtpl"] = null; //create empty article, template gets inherited from category
	 $new_art_id = conEditFirstTime($def["idcat"], $def["idcatnew"], $def["idart"], $def["is_start"], $def["idtpl"], $def["idartlang"], $def["lang"], $def["title"], $def["summary"], $def["artspec"], $def["created"], $def["lastmodified"], $def["author"], $def["online"], $def["keyart"], $def["datestart"], $def["dateend"]);
		/* 
		 echo "<pre>" . 
		 sprintf("conEditFirstTime(def['idcat']='%s', def['idcatnew']='%s', def['idart']='%s'\n, def['is_start']='%s', def['idtpl']='%s', def['idartlang']='%s', def['lang']='%s'\n, def['title']='%s'\n, def['summary']='%s', def['artspec']='%s', def['created']='%s', def['lastmodified']='%s', def['author']='%s', def['online']='%s', def['keyart']='%s'\n, def['datestart']='%s', def['dateend']='%s')", 
		$def["idcat"], $def["idcatnew"], $def["idart"], $def["is_start"], $def["idtpl"], $def["idartlang"], $def["lang"], $def["title"], $def["summary"], $def["artspec"], $def["created"], $def["lastmodified"], $def["author"], $def["online"], $def["keyart"], $def["datestart"], $def["dateend"])		 
		. "</pre>";
		*/
	 return $new_art_id;	
}

function getsetNewarticleDefaults(& $def) {
	//the Contenido API function conEditFirstTime wants 18 Parameters  
	//some generic defaults to  are set here, to keep the code of the main module more readable
	//some specific defaults are set in the struc2htmltpl fct
	global $client, $lang;
	$def["client"] = $client;
	$def["lang"] = $lang;
	$def["idcat"] = null;
	// using this function conEditFirstTime, 
    // article can be copied to several locations within a single call. 
    // therefore, idcatnew is an array
	$def["idcatnew"] =  array($def["idcat"]); 
	//$def["idart"] = null;
	$def["is_start"] = 0;
	$def["idtpl"] = null; //if null , article inherits template from category
	$def["idartlang"] = null;
	$def["title"] = "Imported from Filesystem on " . date('Y-m-d H:i:s');
	$def["summary"] = null; //title
	$def["artspec"] = null;
	$def["created"] = date('Y-m-d H:i:s');
	$def["lastmodified"] = date('Y-m-d H:i:s');
	$def["author"] = 'knb_script';
	$def["online"] = 0; //should be 1 on development, 0 on production system
	$def["datestart"] = '0000-00-00 00:00:00';
	$def["dateend"] = '0000-00-00 00:00:00';
	$def["artsort"] = 0;
	//echo "<pre>generic defaults in def[] are " . print_r($def) . "</pre>";
}
Schade, kann nicht genauer drauf eingehen, muss jetzt los. Ciao
Gruss,
Knut

roterMilan
Beiträge: 16
Registriert: Di 11. Dez 2007, 14:52
Kontaktdaten:

Beitrag von roterMilan » Mi 12. Dez 2007, 09:49

Danke für die Antwort. Das bringt mich schonmal etwas weiter. Sieht für mich momentan allerdings alles noch etwas unübersichtlich aus.

Reicht es denn prinzipiell, CreateArticle() aufzurufen? Wird der Artikel dann vollständig angelegt, d.h. auch in die Datenbank geschrieben?

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Mi 12. Dez 2007, 10:10

Ja, der Artikel wird dann in die DB geschrieben, aber zur Frage mit der Vollständigkeit: das hängt davon ab, was du genau machen willst.

-sollen die Artikel dann unmittelbar nach dem Import schon online gesetzt werden oder noch manuell weiterbearbeitet werden? Sollen den Artikelimport andere Leute vornehmen oder geschieht das nur einmal und wird von Entwicklern durchgeführt?

Willst du
-nur leere Artikel anlegen (um sie dann selbst mit Inhalt zu füllen)?
-oder auch den Inhalt des Artikels setzen (zB CMS_HTML[1] soll den text mit der Produktbeschreibung enthalten, CMS_HEAD soll den Artikelnamen + Artikelnr enthalten, etc.... )
-oder auch noch eine Überscihtsseite mit lauter Links zu den neuen Artikeln anlegen (dies könnte der Startartikel werden )


Templates für den neuen Artikel zuweisen ist auch nicht so einfach. Mit conEditFirstTime(Param1, Param2..., Param18) kannst Du nur neue Artikel anlegen, die das Template von der Kategorie erben (obwohl als 5. Parameter idtpl zu übergeben ist... dieser wird aber von der Funktion ignoriert.)

Aus dem obigen Code habe ich vieles rausgeschmissen was proprietär oder vertraulich ist. Es handelt sich jetzt nur noch um "Pseudocode".

So. Das alles nur zur Orientierung, womit ich zu kämpfen hatte. Fertige Lösungen für dein Problem gibt es wahrscheinlich leider nicht.
Gruss,
Knut

roterMilan
Beiträge: 16
Registriert: Di 11. Dez 2007, 14:52
Kontaktdaten:

Beitrag von roterMilan » Mi 12. Dez 2007, 10:37

Das dürfte dann alles wohl ziemlich kompliziert werden. Ich bin momentan dabei, mehrere CMS für einen zukünfitgen Einsatz zu vergleichen. Contenido zu verwenden ist also nur eine Möglichkeit unter vielen.

Kennt hier jemand ein alternatives CMS, das auch den Funktionsumfang von Contenido mitbringt, bei dem man für den automatischen Import von Artikeln möglichst wenig selbst entwickeln muss?

Nochmal kurz erläutert, was ich vor habe:
- Import von Artikeldaten aus einem Shopsystem. (Artikelnummer, -bezeichnung, -beschreibung)
- Daten könnten mittels eines Scripts entsprechend aufbereitet werden (XML, CSV, ...)
- Für jeden importieren Datensatz soll ein eigener Artikel im CMS angelegt werden (mit der Artikelbeschreibung als Inhalt)
- Die Artikelbeschreibungen sollen als normale Artikel im CMS bearbeitet werden können

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Do 13. Dez 2007, 12:22

Es gibt sicher einfachere CMS.
Aber ich glaube nicht, dass da der Import wesentlich einfacher ist (jedenfalls was die schlussendliche Anzahl von Zeilen Code angeht)

Kommt auch drauf an ob und wieviel eine manuelle Nachbearbeitung der importierten Inhalte erfolgen soll (und durch wen - Redakteure oder Entwickler?).

Und naja, in Contenido man muss/soll mal halt viele von den Artikeleigenschaften setzen (mit dem Importscript) - und zwar möglichst früh - schon beim Anlegen des Artikels. Deshalb die erwähnte API Funktion mit den 18 Params. (Diese Funktion hat m.E. offensichtlich ein sonderbares Design und ist nicht ganz ausgearbeitet).
Gruss,
Knut

roterMilan
Beiträge: 16
Registriert: Di 11. Dez 2007, 14:52
Kontaktdaten:

Beitrag von roterMilan » Do 13. Dez 2007, 12:35

So schwierig, wie es auf den ersten Blick aussieht, ist es wohl doch nicht. Ich habs mittlerweile hinbekommen, über die API-Funktion Artikel anzulegen. Mir ist bis jetzt noch nicht ganz klar, wie ich den eigentlichen Inhaltstext eines Artikels setze. Muss ich mir alles nochmal etwas genauer ansehen.

Vielen Dank für die Hilfe.

Seili
Beiträge: 21
Registriert: Di 15. Mär 2005, 16:47
Wohnort: Osnabrück
Kontaktdaten:

Beitrag von Seili » Mi 9. Jan 2008, 16:51

Moin, gibts hier schon neue erkenntnisse?

Ich suche auch nach einer Funktion die mir Artikel einliest...

roterMilan
Beiträge: 16
Registriert: Di 11. Dez 2007, 14:52
Kontaktdaten:

Beitrag von roterMilan » Do 10. Jan 2008, 12:00

Ich habe mir den oben geposteten Code näher angesehen und einen Artikelimport entwickelt. Sieh dir mal besonders conEditFirstTime an. Habe gerade leider keine Zeit, das näher zu erläutern.

Seili
Beiträge: 21
Registriert: Di 15. Mär 2005, 16:47
Wohnort: Osnabrück
Kontaktdaten:

Beitrag von Seili » Do 10. Jan 2008, 13:03

moin,

ich bin leider absolut nicht im Bilde was die internen Abläufe angeht, zumindest wenn ich selber entwickeln soll.

Kannst Du deinen Code zur Verfügung stellen mit grober "Einbau"-Anleitung? Dann hätte man zumindest schonmal eine gute Basis zum wurschteln

Gruß
Markus

roterMilan
Beiträge: 16
Registriert: Di 11. Dez 2007, 14:52
Kontaktdaten:

Beitrag von roterMilan » Do 10. Jan 2008, 15:46

Hier mal mein Code. Ist noch ziemlich chaotisch und unübersichtlich.

Code: Alles auswählen

<?php
//include("soap.php");
include('main.php');
//include('startup.php');

cInclude('classes', 'class.treeitem.php');
cInclude('classes', 'class.article.php'); 
cInclude('classes', 'class.cat.php'); 
cInclude('classes', 'class.template.php'); 
cInclude('includes', 'functions.con.php'); 
//cInclude('frontend', 'includes/functions.icdp.php'); //contains dirlist function print2log 
cInclude('classes', 'contenido/class.articlelanguage.php');

 
function createArticle($elems, $opt, $title, $content) { 
      //parse "product" options 
   //that means: create new article(s) if desired 
   //conEditFirstTime     (      
   //$idcat,$idcatnew,$idart,$is_start,$idtpl, 
   //$idartlang,$idlang,$title,$summary,$artspec, 
   //$created,$lastmodified,$author,$online, 
   //$datestart,$dateend,$artsort,$keyart = 0 
   //) 
   $new_art_id = 0; 
   $def = array (); 
   //always the same values 
   getsetNewarticleDefaults($def); 
    
   /* 
    * template ids, contenido-dev 
    * 73-default  
    * 162 - 
    * 167/168- ... 
    * 
    * nongeneric, dynamic defaults: 
    */ 
    $withsource = 1; 
    //$def["title"] = getArticleTitle($elems, $opt, $txt, $withsource); 
    $def["title"] = $title;
    $def["summary"] = $def["title"] . ", imported " . date("r", time()); 
    //$def["lang"] = $opt["lang"];
    $def["lang"] = 1; 
    //$def["client"] = $opt["client"];
    $def["client"] = 1; 
      //$def["idcat"] = $opt['selcat'];
      $def["idcat"] = 2; 
    $def["idcatnew"] =  array($def["idcat"]); //for unknown reasons, this param must be an array 
    
    //echo "<pre>def[] is now: " . print_r($def) . "</pre>"; 
    $def["idtpl"] = null; //create empty article, template gets inherited from category 
    $new_art_id = conEditFirstTime($def["idcat"], $def["idcatnew"], $def["idart"], $def["is_start"], $def["idtpl"], $def["idartlang"], $def["lang"], $def["title"], $def["summary"], $def["artspec"], $def["created"], $def["lastmodified"], $def["author"], $def["online"], $def["keyart"], $def["datestart"], $def["dateend"]); 
      /* 
       echo "<pre>" . 
       sprintf("conEditFirstTime(def['idcat']='%s', def['idcatnew']='%s', def['idart']='%s'\n, def['is_start']='%s', def['idtpl']='%s', def['idartlang']='%s', def['lang']='%s'\n, def['title']='%s'\n, def['summary']='%s', def['artspec']='%s', def['created']='%s', def['lastmodified']='%s', def['author']='%s', def['online']='%s', def['keyart']='%s'\n, def['datestart']='%s', def['dateend']='%s')", 
      $def["idcat"], $def["idcatnew"], $def["idart"], $def["is_start"], $def["idtpl"], $def["idartlang"], $def["lang"], $def["title"], $def["summary"], $def["artspec"], $def["created"], $def["lastmodified"], $def["author"], $def["online"], $def["keyart"], $def["datestart"], $def["dateend"])       
      . "</pre>"; 
      */ 
      echo("conSaveContentEntry");
      $artlang = getArtLang($new_art_id,$def["lang"]);
      echo("<br>");
      echo($artlang);
      conSaveContentEntry($artlang, "CMS_HTML", 1, $content);
    return $new_art_id;    
} 

function getsetNewarticleDefaults(& $def) { 
   //the Contenido API function conEditFirstTime wants 18 Parameters  
   //some generic defaults to  are set here, to keep the code of the main module more readable 
   //some specific defaults are set in the struc2htmltpl fct 
   global $client, $lang; 
   $def["client"] = $client; 
   $def["lang"] = $lang; 
   $def["idcat"] = null; 
   // using this function conEditFirstTime, 
    // article can be copied to several locations within a single call. 
    // therefore, idcatnew is an array 
   $def["idcatnew"] =  array($def["idcat"]); 
   //$def["idart"] = null; 
   $def["is_start"] = 0; 
   $def["idtpl"] = null; //if null , article inherits template from category 
   $def["idartlang"] = null; 
   $def["title"] = "Imported from Filesystem on " . date('Y-m-d H:i:s'); 
   $def["summary"] = null; //title 
   $def["artspec"] = null; 
   $def["created"] = date('Y-m-d H:i:s'); 
   $def["lastmodified"] = date('Y-m-d H:i:s'); 
   $def["author"] = 'knb_script'; 
   $def["online"] = 0; //should be 1 on development, 0 on production system 
   $def["datestart"] = '0000-00-00 00:00:00'; 
   $def["dateend"] = '0000-00-00 00:00:00'; 
   $def["artsort"] = 0; 
   //echo "<pre>generic defaults in def[] are " . print_r($def) . "</pre>"; 
} 
global $elems;
global $opt;
$soap_client = new SoapClient(
"http://soap.amazon.com/schemas2/AmazonWebServices.wsdl");
//var_dump($client->__getFunctions());
//var_dump($client->__getTypes());

$soap_params = array(
    'keyword'    => 'harry potter',  
    'page'        => 1,
    'mode'        => 'books',
    'tag'         => 'preinheimerco-20',
    'type'        => 'lite',
    'devtag'      => ''
  ); 
$soap_result = $soap_client->KeywordSearchRequest($soap_params);

foreach ($soap_result->Details AS $product)
{
    /*
    echo '<a href="' . $product->Url . '">' . 
       $product->ProductName . "</a><br>\n";
    echo '<img src="' . $product->ImageUrlSmall . 
       '" border="0" alt="book cover"><br>' . "\n";
       */
      echo(createArticle($elems, $opt, $product->Asin, $product->ProductName));
echo("<br>"); 
       
}
//echo(createArticle($elems, $opt, "Nummer", "text"));


//echo(strNewCategory (78, "neue Kategorie", $remakeTree=true));
$artikel = new Article();
?>
Zu Testzwecken nutze ich den Amazon-Webservice, um Produktdaten in Contenido zu importieren. Den devtag bekommt man, wenn man sich bei Amazon.com Webservices als Entwickler anmeldet.

Martin S.
Beiträge: 183
Registriert: Fr 14. Jan 2005, 10:46
Kontaktdaten:

Re: Produktdaten importieren und als Artikel anlegen?

Beitrag von Martin S. » Di 11. Aug 2009, 07:52

Hallo,

habt ihr noch weitere Test damit gemacht und funktioniert das jetzt sauber? Ich muss 1500 Artikel aus einer Excelliste in div. Kategorien anlegen, da wäre eine solche Funtion perfekt.

Gesperrt