Si la cartella di destinazione esiste e viene creata insieme ad altri file e cartelle quando si installa il sito la prima volta. Ho utizzato
mkdir('config_xml', 0755); solo per questa cartella.
In generale al suo interno ci sono file xml che contengono alcuni dati e impostazioni, infatti in fase di lettura saranno mostrati a video nella pagina "admin" e l'utente ha la possibilità di modificarli.
1) Dopo aver salvato le modifiche si crea un file.xml temporaneo allo stesso livello della index.php e non nella cartella "config_xml".
2) Il file.xml temporaneo deve aggiornare l'altro xml, quella nella cartella config_xml, utilizzando file_put_contents();
si tratta quindi di copiare un file in quella cartella..
questo è il codice che crea il file temporaneo in xml:
Codice PHP:
$nav_first = filter_message($_POST['nav_first']);
$seo_title = post_slug($_POST['seo_title']);
$seo_description = filter_message($_POST['seo_description']);
$comment = $_POST['comment'];
$nav_lang = $_POST['nav_lang'];
if(isset($_POST['idnavbar']))
{
$idnavbar = $_POST['idnavbar'];
}
if(!isset($_POST['idnavbar']))
{
//ADD-CLASS-XML-ITERATOR
include_once($path_default_dir.'admin/xmlreader-iterators.php');
$xmlInputFile = $db_nav_xml;
$xmlOutputFile = $inputiterator_nav;
$reader = new XMLReader();
$reader->open($xmlInputFile);
$writer = new XMLWriter();
$writer->openUri($xmlOutputFile);
$iterator = new XMLWritingIteration($writer, $reader);
$writer->startDocument();
foreach ($iterator as $node)
{
$isElement = $node->nodeType === XMLReader::ELEMENT;
if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == 'navcontent')
{
if($reader->getAttribute('lang')==$nav_lang)
{
$rand=rand(0,999999);
$writer->startElement('navbar');
$writer->writeAttribute('nav', $rand.'nav');
$writer->startElement('firstchild');
$writer->writeAttribute('firstItem', $rand.'list');
$writer->writeElement('navfirstchild', $nav_first);
$writer->startElement('metatag');
$writer->writeElement('title', $seo_title);
$writer->writeElement('description', $seo_description);
$writer->writeElement('author', $site);
$writer->startElement('hreflang');
$writer->writeElement('alternate', $nav_lang);
$writer->endElement();
$writer->endElement();
$writer->startElement('contentpage');
$writer->writeCData($comment);
$writer->endElement();
$writer->endElement();
$writer->startElement('listchild');
$writer->writeAttribute('group', $rand.'child');
$writer->writeElement('empty', '');
$writer->endElement();
$writer->endElement();
}
}
//end-writer
$iterator->write();
}
//end-iteration
$writer->endDocument();
$reader->close();
unset($reader);
unset($writer);
//save
save_stream_alert_return($xmlOutputFile,$db_nav_xml,'admin.php?target=editmenu&navlang='.$nav_lang.'&',$success,$erroraction);
//$xmlOutputFile (contiene il nome del file temporaneo)
//$db_nav_xml (percorso e nome del file da aggiornare)
questo è il codice che copia il file temporaneo aggiornando il file nella cartella "config_xml"
Codice PHP:
function save_stream_alert_return($src,$dest,$return,$good,$bad)
{
chmod($src, 0755);
chmod($dest, 0755);
$content = file_get_contents($src);
file_put_contents($dest, $content);
}
Non posso evitare di creare un file temporaneo perchè xmlwriter non accetta come percorso un file all'interno di una cartella nella funzione openUri(), è un suo bug riportato anche in php.net
Ho dovuto usare la classe xmlreader+xmlwriter per parsare e sovrascrivi file xml che saranno di grandi dimensioni dai 50 mb circa in su.
Come posso copiare il file?