XML wird nicht schnell genug gespeichert

DrEvil

Erfahrenes Mitglied
Hallo Leute,
ich bastle gerade an einem Wordpress-Widget. Es basiert prinzipiell darauf, dass bestimmte Daten in eine XML geschrieben werden.

Nun ist mein Problem, dass das Widget die XML zwar korrekt in eine textarea ausliest, wenn ich aber den geänderten Inhalt der textarea ändere und Speichern möchte, wird die alte Datei geladen.

Auszug aus dem Script:
PHP:
function widget_randomtxt_control(){
	$controlpanel = '';
	
	if ( isset($_POST['randomtxt-submit']) ) {
		$options['title'] = $_POST['randomtxt-title'];
		
		$cache = fopen('randomtxt_data.xml','w') or die("can't write to file");
		$xml = '<?xml version="1.0" encoding="UTF-8"?><randomTXT>'.$_POST['randomtxt-xml'].'</randomTXT>';
		fwrite($cache,$xml);
		fclose($cache);
		
		update_option('widget_randomtxt', $options);
	}
	
	$options = get_option('widget_randomtxt');
	$title = $options['title'];
	$xml = simplexml_load_file(WP_PLUGIN_URL."/randomTXT/randomtxt_data.xml");
	
	
	
	
	$controlpanel .= '<p><label for="randomtxt-title">Title: <input style="width: 250px;" id="randomtxt-title" name="randomtxt-title" type="text" value="'.$title.'" /></label></p>';
	$controlpanel .= '<p><label for="randomtxt-xml">XML: <textarea style="width: 450px;" rows="10" id="randomtxt-xml" name="randomtxt-xml">'.$xml->asXML().'</textarea></label></p>';
	
	$controlpanel .= '<input type="hidden" id="randomtxt-submit" name="randomtxt-submit" value="1" />';
	
	echo $controlpanel;
}

Es werden auch keine Fehler ausgegeben oder der gleichen. Bin echt irritiert, weil ich schon öfter auf genau die gleiche Weise Dateien geschrieben/erstellt habe...

Jemand ne Idee?
 
Hast du es mal testweise mit [phpf]flock[/phpf] versucht oder statt der [phpf]fopen[/phpf] Prozedur direkt [phpf]file_put_contents[/phpf] mit dem Flag LOCK_EX probiert?
 
Habe es probiert, immer noch das gleiche Problem.

Scheinbar ist es ja so, dass die Vaiable $xml an irgendeiner Stelle mit den alten Werten überschrieben wird (- meine Vermutung -), die Frage ist wo...

Falls es in irgendeiner Weise behilflich ist, habe Wordpress samt Widget mal in Firefox geöffnet. Firefox kann die textarea scheinbar nicht Fokussieren - soll heißen, ich klicke ins Textfeld und der Cursor blinkt einmal und ist wieder raus der textarea.

Hier einmal der ganze Code:
PHP:
<?php
/*
Plugin Name: randomTXT
Plugin URI: http://erichartmann.de/
Description: randomTXT is a widget for integrating random text out of a xml-file into your Wordpress-Sidebar
Author: Eric Hartmann
Version: 0.1
Author URI: http://erichartmann.de/
*/

/* randomTXT
Congrats for chosing "randomTXT"!
*/

function randomtxt_dothewidget(){
	//Load XML
	$xmlURL = WP_PLUGIN_URL."/randomTXT/randomtxt_data.xml";
	$randomtxtXML = simplexml_load_file($xmlURL);
	$randomtxtXMLcount = count($randomtxtXML);
	
	echo $randomtxtXML->item[0];
}

function widget_randomtxt($args){
	extract($args);
	
	$options = get_option('widget_randomtxt');
	$title = $options['title'];
	
	
	echo $before_widget . $before_title . $title . $after_title;
	randomtxt_dothewidget();
	echo $after_widget;
}

function widget_randomtxt_control(){
	$controlpanel = '';
	
	if ( isset($_POST['randomtxt-submit'])) {
		$options['title'] = $_POST['randomtxt-title'];
		
		$cache = fopen('randomtxt_data.xml','w') or die("can't write to file");
		$xml = '<?xml version="1.0" encoding="UTF-8"?><randomTXT>'.$_POST['randomtxt-xml'].'</randomTXT>';
		
		if (flock($cache, LOCK_EX)) { // do an exclusive lock
			ftruncate($cache, 0); // truncate file
			fwrite($cache, $xml);
			flock($cache, LOCK_UN); // release the lock
		} else {
			echo "Couldn't get the lock!";
		}
		//fwrite($cache,$xml);
		fclose($cache);
		//file_put_contents('randomtxt_data.xml', $xml);
		
		update_option('widget_randomtxt', $options);
	}
	
	$options = get_option('widget_randomtxt');
	$title = $options['title'];
	$xml = simplexml_load_file(WP_PLUGIN_URL."/randomTXT/randomtxt_data.xml");
	
	
	
	
	$controlpanel .= '<p><label for="randomtxt-title">Title: <input style="width: 250px;" id="randomtxt-title" name="randomtxt-title" type="text" value="'.$title.'" /></label></p>';
	$controlpanel .= '<p><label for="randomtxt-xml">XML: <textarea style="width: 450px;" rows="10" id="randomtxt-xml" name="randomtxt-xml">'.$xml->asXML().'</textarea></label></p>';
	
	$controlpanel .= '<input type="hidden" id="randomtxt-submit" name="randomtxt-submit" value="1" />';
	
	echo $controlpanel;
}

function randomtxt_widgets_init() {
	register_widget_control('randomTXT', 'widget_randomtxt_control', 500, 250);
	register_sidebar_widget('randomTXT', 'widget_randomtxt');
}
add_action( "init", "randomtxt_widgets_init" );

?>

Gruß
 
Moin,

Es muss zwar nicht gezwungenermaßen die Ursache sein, aber bist du sicher, dass du bei beiden Schritten die selbe Datei am Wickel hast?
Zumindest verwendest du 2 unterschiedliche Pfade.

Ansonsten: das XML sollte schon per htmlentities() codiert werden, bevor du es im <textarea> ausgibst, würde ich sagen.
 
Zurück