Semplice CMS per news con PHP e XML

hyperoom

Nuovo Utente
10 Dic 2010
8
0
0
Ciao a tutti,
con molta fatica sono riuscito ad accozzare con php un semplice cms che mi permette di inviare/modificare/cancellare delle news contenute in un file xml. Fin qui tutto ok, anche perche' virtualmente posso gestire un numero di campi variabile per altre esigenze.
Nel caso di news, mi ritrovo a gestire un input di testo per il titolo ed uno per il testo vero e proprio: vorrei che quest'ultimo fosse una textarea, ma non riesco ad inserire la cosa nel codice.
Potete aiutarmi?

Il seguente e' il file news.xml:
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
- <news>
- <articolo>
<titolo>Titolo 4654949</titolo>
<testo>Lorem 2Lorem 456464534 2Lorem 2Lorem 2Lorem 2Lorem 2</testo>
</articolo>
- <articolo>
<titolo>zxcz\cz\xczxc</titolo>
<testo>lkjh;kugyfjhghf</testo>
</articolo>
</news>

Creo poi un file "amministraNews.php":
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Gestione News</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>ARTICOLI</h2>
<p>&nbsp;</p>
<?php
$myFile = "news.xml";
$myEntity = "news";
$myFields = array("titolo", "testo");
include_once("amministraXML.php");
XMLInitialize($myFile, $myEntity, $myFields);
XMLStart();
?>
</body>
</html>

Ed ecco, poi, il cuore di tutta l'applicazione: amministraXML.php:

<link href="MyStyle.css" rel="stylesheet" type="text/css" />
<?php
//definizione funzioni
$filename = "";
$entity = "";
$fields = array();

function XMLLoadFile($filename) {
$xmlstr = file_get_contents($filename);
$xml = new SimpleXMLElement($xmlstr);
return $xml;
}

function XMLSaveFile($filename, $xml) {
$xmlstr = $xml->asXML();
return file_put_contents($filename, $xmlstr);
}

function XMLInitialize($p_filename = "", $p_entity = "", $p_fields = array()) {
global $filename, $entity, $fields;
$filename = $p_filename;
$entity = $p_entity;
$fields = $p_fields;
}

function XMLStart() {
global $filename, $entity, $fields;
if (!strlen($filename))
return;
$records = XMLLoadFile($filename);
if (isset($_POST["insert"])) {
$news = $records->addChild("news");
foreach ($fields as $field) {
$news->addChild($field, utf8_encode($_POST[$field]));
}
XMLSaveFile($filename, $records);
}
if (isset($_POST["delete"])) {
if (isset($_POST["ID"])) {
$id = (int) $_POST["ID"];
unset($records->{$entity}[$id]);
XMLSaveFile($filename, $records);
}
}
if (isset($_POST["edit"])) {
if (isset($_POST["ID"])) {
$id = (int) $_POST["ID"];
foreach ($fields as $field) {
$records->{$entity}[$id]->$field = $_POST[$field];
}
XMLSaveFile($filename, $records);
}
}
XMLShowRecords($records);
}

function XMLShowRecords($records) {
global $filename, $entity, $fields;
print <<<EOL
<table border="0" cellpadding="5" cellspacing="5" width="100%">
<tr>

EOL;
foreach ($fields as $field) {
print " <th>" . $field . "</th>\n";
}
print <<<EOL
</tr>

EOL;
for ($i = 0; $i < count($records); $i++) {
print <<<EOL
<tr>
<form method="POST">

EOL;
foreach ($fields as $field) {
print " <td><input type=\"text\" name=\"" . $field . "\" value=\"" . $records->{$entity}[$i]->$field . "\" /></td>\n";
}
print <<<EOL
<td>
<input type="hidden" name="ID" value="{$i}" />
<input type="submit" name="edit" value="Modifica" />
<input type="submit" name="delete" value="Elimina" onclick="javascript: return window.confirm('Sei sicuro di voler cancellare il record?');" />
</td>
</form>
</tr>

EOL;
}
print <<<EOL
<tr>
<form method="POST">

EOL;
foreach ($fields as $field) {
print " <td><input type=\"text\" name=\"" . $field . "\" value=\"\" /></td>\n";
}
print <<<EOL
<td>
<input type="submit" name="insert" value="Nuovo" />
</td>
</form>
</tr>
</table>

EOL;
}

?>
:hammer:
 
Ultima modifica di un moderatore:
Se non ho visto male basta inserire un controllo così:

PHP:
foreach ($fields as $field) {
	switch($field) {

		case 'titolo':
			print " <td><input type=\"text\" name=\"" . $field . "\" value=\"" . $records->{$entity}[$i]->$field . "\" /></td>\n";
			break;

		case 'testo':
			print " <td><textarea name=\"" . $field . "\" cols=\"40\" rows=\"6\">" . $records->{$entity}[$i]->$field . "</textarea>\n";
			break;	
	}
}

nei punti dove stampi i campi dell'articolo. Se poi implementi altri campi, basta aggiungere nuovi case a seconda che debbano essere poi visualizzati come INPUT o TEXTAREA.
 
Se non ho visto male basta inserire un controllo così:

PHP:
foreach ($fields as $field) {
	switch($field) {

		case 'titolo':
			print " <td><input type=\"text\" name=\"" . $field . "\" value=\"" . $records->{$entity}[$i]->$field . "\" /></td>\n";
			break;

		case 'testo':
			print " <td><textarea name=\"" . $field . "\" cols=\"40\" rows=\"6\">" . $records->{$entity}[$i]->$field . "</textarea>\n";
			break;	
	}
}

nei punti dove stampi i campi dell'articolo. Se poi implementi altri campi, basta aggiungere nuovi case a seconda che debbano essere poi visualizzati come INPUT o TEXTAREA.

Ciao Trogo,
infatti ha funzionato benissimo, grazie.
Ma se volessi visualizzare i dati ordinati dove e come dovrei agire?
Mi spiego meglio.
Ho modificato l'XML (e quindi ho aggiunto un altro case allo switch php) per inserire la data della news: naturalmente l'ultima news si accoda al resto e sia visualizzando in php che in swf questa rimane in fondo.
Cosa posso fare?
Modificare il php in modo che l'xml venga scritto gia' ordinato (e fornisca i dati belli pronti all'swf) o modificare l'actionscript perche' li riordini prima della visualizzazione?
In questo caso ho trovato una funzione che si chiama sortOn che lavora sull'array, ma una volta implementata, non mi da' alcun risultato. Dove sbaglio?

Codice:
// --
System.useCodepage=true;
import TextField.StyleSheet;
news.autoSize = true;
news.html = true;
news.htmlText = "Sto caricando..";
//creo e inizializzo css
var myCSS:StyleSheet = new StyleSheet();
myCSS.setStyle("em", {fontWeight:'bold',color:'#000000'});
myCSS.setStyle("h6", {fontWeight:'normal',color:'#000000'});
news.styleSheet = myCSS;
news.htmlText = this.news;
// --
var nNews:XML = new XML();
nNews.ignoreWhite = true;
nNews.load('news.xml');
nNews.onLoad = function() {
	news.htmlText = "";
	qtd = this.childNodes[0].childNodes.length;
	for (i=0; i<qtd; i++) {
		nNews.push([qtd[i].childNodes[0].childNodes, qtd[i].childNodes[1].childNodes, qtd[i].childNodes[2].childNodes]);
	}
	nNews.sortOn([0], Array.NUMERIC);
	for (i=0; i<qtd; i++) {
		var nData = (this.childNodes[0].childNodes[i].childNodes[0]);
		var nTitolo = (this.childNodes[0].childNodes[i].childNodes[1]);
		var nTesto = (this.childNodes[0].childNodes[i].childNodes[2]);
				news.htmlText += +nData+"<br />"+"<em>"+nTitolo+"</em>"+nTesto+"<br/><br/>";
	}
	
};

Magari col php e' piu' semplice, non so.
Cosa mi consigli?
 
Ultima modifica di un moderatore:

Discussioni simili