hat conSaveContentEntry() ein Problem?
hat conSaveContentEntry() ein Problem?
Hallo!
Mal eine Frage:
Ich habe mir einen Artikel-Importer gebastelt.
Dieser liest aus einer Externen Datei(XML) alle Information und erstellt daraus einen Artikel.
Das ganze funktioniert sehr gut bei nur einem Artikel.
Findet das Modul mehr als eine Datei(XML), wird nur von der ersten alle Daten per conSaveContentEntry() korrekt eingetragen. Bei allen anderen werden zwar in der Datenbank(tabelle: _content) einträge gemacht diese bleiben aber bei Value leer.
Inhalt sind bei conSaveContentEntry() immer vorhanden.
Auch dachte ich erst an Sonderzeichenprobleme. Das klappt aber ebenfalls ohne probleme.
Was könnte ich falsch machen?
Bin für jeden noch so kleinen Tipp offen.
Mein Vorgehen:
Erst mit conEditFirstTime() einen Artikel generieren.
Als nächstes die neu erstellte IDARTLANG abrufen mittels loadByArticleAndLanguageId().
Als leztes kommt conSaveContentEntry() zu einsatz.
Beste Grüße
Matthias
Mal eine Frage:
Ich habe mir einen Artikel-Importer gebastelt.
Dieser liest aus einer Externen Datei(XML) alle Information und erstellt daraus einen Artikel.
Das ganze funktioniert sehr gut bei nur einem Artikel.
Findet das Modul mehr als eine Datei(XML), wird nur von der ersten alle Daten per conSaveContentEntry() korrekt eingetragen. Bei allen anderen werden zwar in der Datenbank(tabelle: _content) einträge gemacht diese bleiben aber bei Value leer.
Inhalt sind bei conSaveContentEntry() immer vorhanden.
Auch dachte ich erst an Sonderzeichenprobleme. Das klappt aber ebenfalls ohne probleme.
Was könnte ich falsch machen?
Bin für jeden noch so kleinen Tipp offen.
Mein Vorgehen:
Erst mit conEditFirstTime() einen Artikel generieren.
Als nächstes die neu erstellte IDARTLANG abrufen mittels loadByArticleAndLanguageId().
Als leztes kommt conSaveContentEntry() zu einsatz.
Beste Grüße
Matthias
Re: hat conSaveContentEntry() ein Problem?
In Zeile xy ist Deine Iteration oder while-Schleife fehlerhaft.Was könnte ich falsch machen?
Nein, im Ernst jetzt. Bei den Infos: Alles mögliche. Ohne dass Du Deinen Code hier postest - zumindes auszugsweise - wird man Dir kaum weiterhelfen können.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.
Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)
Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.
Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)
Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
Re: hat conSaveContentEntry() ein Problem?
Hi!
Gruß
Matthias
Hier ein Auszug der Schleife. Es ist alles relevante dringeblieben was das Erstellen eines neuen Artikel betrifft.McHubi hat geschrieben:In Zeile xy ist Deine Iteration oder while-Schleife fehlerhaft.
Nein, im Ernst jetzt. Bei den Infos: Alles mögliche. Ohne dass Du Deinen Code hier postest - zumindes auszugsweise - wird man Dir kaum weiterhelfen können.
Code: Alles auswählen
<?php
while ( $files ) {
$pbart = array();
$mf = file( $files );
foreach( $mf['content'] AS $k => $v) {
foreach($v AS $k2 => $v2) {
$pbart['article'][] = array( 'type' => $k, 'typeid' => $k2 , 'value' => $v2 ));
}
}
$new_art_id = conEditFirstTime(
$pbNew['idcat'], $pbNew['idcatnew'], $pbNew['idart'],
$pbNew['is_start'], $pbNew['idtpl'], $pbNew['idartlang'],
$pbNew['idlang'], $pbNew['title'], $pbNew['summary'],
$pbNew['artspec'], $pbNew['created'], $pbNew['lastmodified'],
$pbNew['author'], $pbNew['online'], $pbNew['datestart'],
$pbNew['dateend'], $pbNew['artsort'], $pbNew['keyart'],
$pbNew['searchable']
);
$obj = new cApiArticleLanguage();
$obj->loadByArticleAndLanguageId($new_art_id, $ilnmgid);
foreach($pbart['article'] AS $v) {
conSaveContentEntry($obj->getField('idartlang'), $v['type'], $v['typeid'], $v['value']);
}
}
closedir($mmverz);
}
?>
Gruß
Matthias
-
- Beiträge: 4256
- Registriert: Do 30. Jun 2005, 22:56
- Wohnort: Eltmann, Unterfranken, Bayern
- Kontaktdaten:
Re: hat conSaveContentEntry() ein Problem?
Servus Matthias,
der von Dir gepostete Code-Ausschnitt ist nicht logisch und ich kann ihn nicht wirklich nachvollziehen. In der While-Schleife wird für jede $files eine Datei eingelesen und zerlegt. Hast du da in jeder Datei nur für EINEN Artikel die Daten drin? Du hattest im 1. Posting von einer XML-Datei gesprochen, das was deine foreach-Schleifen verarbeiten aus der Variablen $mf['content'] scheint aber wohl eher ein Array zu sein.
Am Ende wird pro Datei (while) je 1 neuer Artikel mit dem aus der Datei extrahierten Daten angelegt. Oder ist das anders gedacht?
Wie schon McHubi geschrieben hat, ohne einen "funktionierenden" Code-Ausschnitt kann man da gar nichts wirklich nachvollziehen, denn um dir helfen und eine entsprechende Aussage treffen zu können, müsste man das Teil selbst in einer Demo mal laufen lassen können.
Gruß aus Franken
Ortwin
der von Dir gepostete Code-Ausschnitt ist nicht logisch und ich kann ihn nicht wirklich nachvollziehen. In der While-Schleife wird für jede $files eine Datei eingelesen und zerlegt. Hast du da in jeder Datei nur für EINEN Artikel die Daten drin? Du hattest im 1. Posting von einer XML-Datei gesprochen, das was deine foreach-Schleifen verarbeiten aus der Variablen $mf['content'] scheint aber wohl eher ein Array zu sein.
Am Ende wird pro Datei (while) je 1 neuer Artikel mit dem aus der Datei extrahierten Daten angelegt. Oder ist das anders gedacht?
Wie schon McHubi geschrieben hat, ohne einen "funktionierenden" Code-Ausschnitt kann man da gar nichts wirklich nachvollziehen, denn um dir helfen und eine entsprechende Aussage treffen zu können, müsste man das Teil selbst in einer Demo mal laufen lassen können.
Gruß aus Franken
Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Re: hat conSaveContentEntry() ein Problem?
Wir sind gestern noch kurzfristig von XML weggegangen.Oldperl hat geschrieben:1. Posting von einer XML-Datei gesprochen
Code: Alles auswählen
Hast du da in jeder Datei nur für EINEN Artikel die Daten drin?
Code: Alles auswählen
Am Ende wird pro Datei (while) je 1 neuer Artikel mit dem aus der Datei extrahierten Daten angelegt. Oder ist das anders gedacht?
Code: Alles auswählen
Wie schon McHubi geschrieben hat, ohne einen "funktionierenden" Code-Ausschnitt kann man da gar nichts wirklich nachvollziehen
Gruß
Matthias
-
- Beiträge: 4256
- Registriert: Do 30. Jun 2005, 22:56
- Wohnort: Eltmann, Unterfranken, Bayern
- Kontaktdaten:
Re: hat conSaveContentEntry() ein Problem?
Hmm, ein closedir ohne geöffnetes Verzeichnis, Dateien mit nem Array, bei dem man sich das Array erst mal selbst aus dem Quelltext tracen muss/kann.
Matthias, ganz ehrlich, wenn Du wirklich Hilfe willst, dann liefer mir bitte deinen Code so, dass ich diesen in ein Modul schmeißen und testen kann. Mir fehlt einfach die Zeit mir auch noch das ganze Testszenarium hier aufzubauen, denn nur anhand des Quelltextes kann ich nicht nachvollziehen woher dein Fehlerbild rührt.
Gruß aus Franken
Ortwin
Matthias, ganz ehrlich, wenn Du wirklich Hilfe willst, dann liefer mir bitte deinen Code so, dass ich diesen in ein Modul schmeißen und testen kann. Mir fehlt einfach die Zeit mir auch noch das ganze Testszenarium hier aufzubauen, denn nur anhand des Quelltextes kann ich nicht nachvollziehen woher dein Fehlerbild rührt.
Gruß aus Franken
Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Re: hat conSaveContentEntry() ein Problem?
Probier mal das vielleicht ...
Du packst vermutlich ein Array in eine while() Schleife, aber wo ist die Bedingung?
Arrays liest man besser mit foreach() aus.
Und du hast die Mehrzahl in $files aber file() bearbeitet nur ein File, nicht mehrere.
Also musst du das Array aufspalten, damit es Singular ist: $file.
Aber das ist alles Spekulation, wenn man nicht weiß, was in $files steht und wie das XML aufgebaut ist.
Ich vermute jetzt einfach auch mal, dass in $files eine Liste von Dateien steht?
Dann ist es aber kein Array.
Dann erzeugst du das Array erst mit file($files) und erst das kannst du mit einer Schleife auslesen.
Dann ist while falsch, dann wäre if($files) sinnvoller.
Dann sieht $files vielleicht so aus?
Aber das macht so alleine auch keinen Sinn, denn mehrere Artikel heißt mehrere XML Dateien.
Folglich müsstest du in $files eine Datei aufrufen die eine Liste von XML-Dateien enthält so dass du ein Array an XML Dateien bekommst.
Und dieses Array würde ich mit foreach() auslesen und dann mit file_get_contents() jede XML-Datei in einen String auslesen lassen.
Dann hast du darin den XML-Text. Achte auf utf-8 und so.
Aber du kannst es auch so gestalten: http://www.w3schools.com/php/php_xml_simplexml_read.asp
Mit file($files) die XML Dateien in ein Array packen und dann mit foreach() jede Datei mit simplexml_load_file() als Objekt (!) in eine Variable lesen und diese dann entsprechend verarbeiten.
http://php.net/manual/de/book.simplexml.php
Und hier verliere ich mich irgendwie in der Spekulation und ich denke, dass es ganz am Anfang bei den Daten hapert.
Code: Alles auswählen
foreach ( $files as $file ) {
$pbart = array();
$mf = file( $file );
Arrays liest man besser mit foreach() aus.
Und du hast die Mehrzahl in $files aber file() bearbeitet nur ein File, nicht mehrere.
Also musst du das Array aufspalten, damit es Singular ist: $file.
Aber das ist alles Spekulation, wenn man nicht weiß, was in $files steht und wie das XML aufgebaut ist.
Ich vermute jetzt einfach auch mal, dass in $files eine Liste von Dateien steht?
Dann ist es aber kein Array.
Dann erzeugst du das Array erst mit file($files) und erst das kannst du mit einer Schleife auslesen.
Dann ist while falsch, dann wäre if($files) sinnvoller.
Dann sieht $files vielleicht so aus?
Code: Alles auswählen
$files = file('datei.txt');
Folglich müsstest du in $files eine Datei aufrufen die eine Liste von XML-Dateien enthält so dass du ein Array an XML Dateien bekommst.
Und dieses Array würde ich mit foreach() auslesen und dann mit file_get_contents() jede XML-Datei in einen String auslesen lassen.
Dann hast du darin den XML-Text. Achte auf utf-8 und so.
Aber du kannst es auch so gestalten: http://www.w3schools.com/php/php_xml_simplexml_read.asp
Mit file($files) die XML Dateien in ein Array packen und dann mit foreach() jede Datei mit simplexml_load_file() als Objekt (!) in eine Variable lesen und diese dann entsprechend verarbeiten.
http://php.net/manual/de/book.simplexml.php
Und hier verliere ich mich irgendwie in der Spekulation und ich denke, dass es ganz am Anfang bei den Daten hapert.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Re: hat conSaveContentEntry() ein Problem?
Hi!
Ich werde erst wieder morgen dazu kommen.
Werde dann später auch einen kompletten Code posten. Vorher will ich noch was anderes diesbezüglich testen.
Ihr werdet von mir hören.
Grüße
Matthias
Ich werde erst wieder morgen dazu kommen.
Werde dann später auch einen kompletten Code posten. Vorher will ich noch was anderes diesbezüglich testen.
Ihr werdet von mir hören.
Grüße
Matthias
Re: hat conSaveContentEntry() ein Problem?
Hallo!
Hier nun das Komplette Modul, was ich nochmal geprüft und angepasst habe.
Das Modul kann Artikel Exportieren und auch Importieren(leider nur den ersten Artikel).
Zu beachten:
Das Modul setzt ein CMS_HEAD[1], CMS_HTML[1] und CMS_HTML[2] vorraus in den Artikeln. Dieses bei bedarf anpassen damit auch korrekt daten expotiert werden!
Ich habe einiges getestet. Immer bei der function conSaveContentEntry() gibts ab dem zweiten zu erstellenden Artikel nur Leere einträge im Contenido.
Grüße
Matthias
Hier nun das Komplette Modul, was ich nochmal geprüft und angepasst habe.
Das Modul kann Artikel Exportieren und auch Importieren(leider nur den ersten Artikel).
Zu beachten:
Das Modul setzt ein CMS_HEAD[1], CMS_HTML[1] und CMS_HTML[2] vorraus in den Artikeln. Dieses bei bedarf anpassen damit auch korrekt daten expotiert werden!
Ich habe einiges getestet. Immer bei der function conSaveContentEntry() gibts ab dem zweiten zu erstellenden Artikel nur Leere einträge im Contenido.
Code: Alles auswählen
<?php
cInclude('includes', 'functions.upl.php');
$pb = array();
$pb = array(
'exportfolder' => $cfgClient[$client]['path']['frontend'] . 'cache/imexport/',
'importfolder' => $cfgClient[$client]['path']['frontend'] . 'cache/imexport/'
);
$midcat = $_POST['exidcat'];
$midcat = $midcat + 0;
$exlngid = $_POST['exlngid'];
$exlngid = $exlngid + 0;
if ($_POST['export'] && $midcat > 0 && $midcat > $exlngid) {
$pb['exportfolder'] = $pb['exportfolder'] . '/';
@mkdir( $pb['exportfolder'] );
$collector = new cArticleCollector(array(
'idcat' => $midcat,
'lang' => $exlngid,
'start' => true,
'offline' => true
));
$co = 0;
foreach ($collector as $article) {
$article_id = $article->getField('idart');
$m = array();
$m['CMS_HEAD']['1'] = base64_encode( $article->getContent('CMS_HEAD', 1));
$m['CMS_HTML']['1'] = base64_encode( $article->getContent('CMS_HTML', 1));
$m['CMS_HTML']['2'] = base64_encode( $article->getContent('CMS_HEAD', 2));
$ex = array(
'content' => $m,
'values' => $article->values
);
$fp = fopen($pb['exportfolder'] . $article_id . '.idart', 'w');
fwrite($fp, serialize($ex));
fclose($fp);
$co++;
}
echo 'insgesamt ' . $co . ' Artikel nach \'' . $pb['exportfolder'] . '\' Exportiert<br><br>';
}
/*****************************************************************
*
*
* Import
*
*
*****************************************************************/
$iidcat = $_POST['imidcat'];
$iidcat = $iidcat + 0;
$ilnmgid = $_POST['imlngid'];
$ilnmgid = $ilnmgid + 0;
if ($_POST['import'] && $iidcat > 0 && $ilnmgid > 0) {
if ($mmverz = @opendir ( $pb['importfolder'] ) ) {
$co = 0;
while ( $mmfile = readdir ( $mmverz ) ) {
if ( $mmfile != '.' && $mmfile != '..' && in_array( strtolower(strchr($mmfile, '.')), array('.idart')) == TRUE) {
$pbart = array();
$mf = array();
$mm = implode(file( $pb['importfolder'] . $mmfile ));
$mf = unserialize( $mm );
unset($mm);
foreach( $mf['content'] AS $k => $v) {
foreach($v AS $k2 => $v2) {
if ($v2) {
$pbart['article'][] = array( 'type' => strtoupper($k), 'typeid' => $k2 , 'value' => utf8_encode( base64_decode($v2) ));
}
}
}
$values = $mf['values'];
if (count($pbart['article']) > 0) {
/*
* Neuen Artikel Anlegen
*/
$pbNew = array(
"client" => cRegistry::getClientId(), "lang" => $ilnmgid,
"idcat" => $iidcat, "idcatnew" => array($iidcat),
"is_start" => 0, "idtpl" => null,
"idartlang" => null, "title" => utf8_encode($values['title']),
"idlang" => $ilnmgid,
"summary" => $summary, "artspec" => null,
"created" => $values['created'], "lastmodified" => $values['lastmodified'],
"author" => $values['author'], "online" => $values['online'],
"datestart" => $values['datestart'], "dateend" => $values['dateend'],
"artsort" => $values['artsort'], "keyart" => 0,
"searchable" => 1
);
$new_art_id = conEditFirstTime(
$pbNew['idcat'], $pbNew['idcatnew'], $pbNew['idart'],
$pbNew['is_start'], $pbNew['idtpl'], $pbNew['idartlang'],
$pbNew['idlang'], $pbNew['title'], $pbNew['summary'],
$pbNew['artspec'], $pbNew['created'], $pbNew['lastmodified'],
$pbNew['author'], $pbNew['online'], $pbNew['datestart'],
$pbNew['dateend'], $pbNew['artsort'], $pbNew['keyart'],
$pbNew['searchable']
);
/*
* Hole Informationen vom neu anglegten Artikel
*/
$obj = new cApiArticleLanguage();
$obj->loadByArticleAndLanguageId($new_art_id, $ilnmgid);
/*
* Speicher neue Artikel daten
*/
foreach($pbart['article'] AS $k => $v) {
conSaveContentEntry($obj->getField('idartlang'), $v['type'], $v['typeid'], $v['value']);
}
/*
* Lösche importierte Datei um ein erneutes Importieren zu verhindern
*/
@unlink( $pb['importfolder'] . $mmfile );
$co++;
}
}
}
closedir($mmverz);
echo 'insgesamt ' . $co . ' Artikel in die Kategorie \'' . $iidcat . '\' Importiert<br><br>';
}
}
//$edit_url = "front_content.php?changeview=edit&client=$client&lang=$lang&action=con_editart&idartlang=$idartlang&idart=$idart&idcat=$idcat&contenido=" . $sess->id; // contenido 4.8.x
$edit_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // contenido 4.9.x
echo '
<h2>Export...</h2>
<form action="' . $edit_url . '" method="POST">
<input type="text" placeholder="Kategorie ID (IDCat)" required name="exidcat" value="' . $_POST["exidcat"] . '"> <input placeholder="Sprach ID" type="text" name="exlngid" required value="' . $_POST["exlngid"] . '"> <input name="export" type="submit" value="Exportieren">
</form>
';
echo '<br><br><br>';
$artikel = array();
if ($mmverz = @opendir ( $pb['importfolder'] ) ) {
while ( $mmfile = readdir ( $mmverz ) ) {
if ( $mmfile != '.' && $mmfile != '..' && in_array( strtolower(strchr($mmfile, '.')), array('.idart')) == TRUE) {
$artikel[$mmfile] = $mmfile;
}
}
closedir($mmverz);
}
echo '
<h2>Import...</h2>';
if (count($artikel) > 0) {
echo '
<form action="' . $edit_url . '" method="POST">
Im verzeichnis \'' . $pb['exportfolder'] . '\' befinden sich ' . count($artikel) . ' Artikel zum Import.<br><br>
in Kategorie Importieren: <input type="text" placeholder="IDCat" required name="imidcat" value="' . $_POST["imidcat"] . '"><br>
Sprach ID: <input placeholder="ID" type="text" name="imlngid" required value="' . $_POST["imlngid"] . '"><br><input name="import" type="submit" value="Importieren">
</form>';
} else {
echo '<b>nicht zum Importieren vorhanden!!</b>';
}
?>
Grüße
Matthias
Re: hat conSaveContentEntry() ein Problem?
Hallo!
Konnte es schon wer testen, ob die Funktion oder ich das Problem bin?
Gruß
Matthias
Konnte es schon wer testen, ob die Funktion oder ich das Problem bin?
Gruß
Matthias
Re: hat conSaveContentEntry() ein Problem?
Ich habe gar keine Zeit dazu, es zu testen.
Das müssen andere machen
Das müssen andere machen
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Re: hat conSaveContentEntry() ein Problem?
Unfair!Faar hat geschrieben:Ich habe gar keine Zeit dazu, es zu testen.
Das müssen andere machen
Re: hat conSaveContentEntry() ein Problem?
Es ist wirklich rappelschwer, ohne die Datenbasis auch nur annähernd zu verstehen, was da passiert und wo es hängt.
Hast du denn mal jeweils bei jedem Schritt ausgegeben, ob die Variablen, die in der Funktion gespeichert werden sollen, auch wirklich da sind? Oder ob die schon Käse sind? Ob deine Ausgangsarrays überhaupt richtig gefüllt sind? Ob die richtigen IDs für alles erstellt werden? Ich kenne mich mit den Funktionen hier nicht gut genug aus um zu sehen, ob darin ein Denkfehler steckt oder nicht, und ich habe auch keine Zeit zum Testen. Du müsstest mit konsequentem Ausgeben aller Variablen in allen Schritten nach und nach sehen, wo es zu haken anfängt.
Hast du denn mal jeweils bei jedem Schritt ausgegeben, ob die Variablen, die in der Funktion gespeichert werden sollen, auch wirklich da sind? Oder ob die schon Käse sind? Ob deine Ausgangsarrays überhaupt richtig gefüllt sind? Ob die richtigen IDs für alles erstellt werden? Ich kenne mich mit den Funktionen hier nicht gut genug aus um zu sehen, ob darin ein Denkfehler steckt oder nicht, und ich habe auch keine Zeit zum Testen. Du müsstest mit konsequentem Ausgeben aller Variablen in allen Schritten nach und nach sehen, wo es zu haken anfängt.
Re: hat conSaveContentEntry() ein Problem?
Genau aus dem Grund hab ich da komplette Script/Module hier gepostet. Dieses exportiert und importiert Nachrichten. Einfacher geht's nicht.homtata hat geschrieben:Es ist wirklich rappelschwer, ohne die Datenbasis auch nur annähernd zu verstehen, was da passiert und wo es hängt.
Re: hat conSaveContentEntry() ein Problem?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.