hat conSaveContentEntry() ein Problem?

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Di 5. Jul 2016, 13:47

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

McHubi
Beiträge: 992
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von McHubi » Mi 6. Jul 2016, 15:46

Was könnte ich falsch machen?
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. :wink:
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Die NEUAUFLAGE des Buchs zur Version 4.9: CONTENIDO für Einsteiger (4.9)

mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Do 7. Jul 2016, 08:53

Hi!
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. :wink:
Hier ein Auszug der Schleife. Es ist alles relevante dringeblieben was das Erstellen eines neuen Artikel betrifft.

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

Oldperl
Beiträge: 3984
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Franken, Bayern
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von Oldperl » Do 7. Jul 2016, 11:51

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
*NEU* PHP 7.x Community Draft von CONTENIDO 4.9 auf github
CONTENIDO 4.9 Entwickler-Handbuch - Publikation auf medium.com zu meinem angedachten Entwickler-Buch zu CONTENIDO 4.9
ConLite 2.0, alternatives und stabiles Update von Contenido 4.8.x
phpBO Search Advanced - das neue Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Do 7. Jul 2016, 12:34

Oldperl hat geschrieben:1. Posting von einer XML-Datei gesprochen
Wir sind gestern noch kurzfristig von XML weggegangen.

Code: Alles auswählen

Hast du da in jeder Datei nur für EINEN Artikel die Daten drin?
Ja!

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?
Das ist genau richtig so und funktioniert ja auch beim ersten durchlauf. Nur ab dem zweiten durchlauf der while-Schleife wird zwar ein Artikel angelegt aber alle CMS_TYPEN in der Tabelle "_content" sind leer.

Code: Alles auswählen

Wie schon McHubi geschrieben hat, ohne einen "funktionierenden" Code-Ausschnitt kann man da gar nichts wirklich nachvollziehen
Es handelt sich dabei um den kompletten Code. Es sind nur Zeilen rausgenommen worden, die nichts mit dem Problem zu tun haben.



Gruß
Matthias

Oldperl
Beiträge: 3984
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Franken, Bayern
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von Oldperl » Do 7. Jul 2016, 12:52

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
*NEU* PHP 7.x Community Draft von CONTENIDO 4.9 auf github
CONTENIDO 4.9 Entwickler-Handbuch - Publikation auf medium.com zu meinem angedachten Entwickler-Buch zu CONTENIDO 4.9
ConLite 2.0, alternatives und stabiles Update von Contenido 4.8.x
phpBO Search Advanced - das neue Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

Faar
Beiträge: 1335
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von Faar » Do 7. Jul 2016, 13:43

Probier mal das vielleicht ...

Code: Alles auswählen

  foreach ( $files as $file ) {
      $pbart = array();
      $mf    = file( $file );
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?

Code: Alles auswählen

$files = file('datei.txt');
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.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Do 7. Jul 2016, 17:58

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

mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Fr 8. Jul 2016, 09:02

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. :(

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

mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Di 12. Jul 2016, 18:45

Hallo!

Konnte es schon wer testen, ob die Funktion oder ich das Problem bin? :-)



Gruß
Matthias

Faar
Beiträge: 1335
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von Faar » Mi 13. Jul 2016, 16:12

Ich habe gar keine Zeit dazu, es zu testen.
Das müssen andere machen :(
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Mi 13. Jul 2016, 16:49

Faar hat geschrieben:Ich habe gar keine Zeit dazu, es zu testen.
Das müssen andere machen :(
Unfair! :wink:

homtata
Beiträge: 974
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von homtata » Mi 13. Jul 2016, 22:53

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.

mattmarr
Beiträge: 304
Registriert: Mo 3. Aug 2009, 14:11
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von mattmarr » Do 14. Jul 2016, 05:13

homtata hat geschrieben:Es ist wirklich rappelschwer, ohne die Datenbasis auch nur annähernd zu verstehen, was da passiert und wo es hängt.
Genau aus dem Grund hab ich da komplette Script/Module hier gepostet. Dieses exportiert und importiert Nachrichten. Einfacher geht's nicht.

Faar
Beiträge: 1335
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: hat conSaveContentEntry() ein Problem?

Beitrag von Faar » Do 14. Jul 2016, 14:16

Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Antworten