Edit XML-specific data with LOOP using form in PHP file

0

I'm having some issues trying to edit XML-specific data (with LOOP) with form on a PHP page.

PHP file: input.php (without loop)

<meta charset="UTF-8">
<?php
    if(isset($_POST['submit'])){
        $carregador_xml=simplexml_load_file('minha_lista.xml');
        $carregador_xml->lista->título=$_POST['título'];
        $função=fopen("minha_lista.xml","wb");
        fwrite($função,$carregador_xml->asXML());
        fclose($função);
    }
    $carregador_xml=simplexml_load_file('minha_lista.xml');
    $título=$carregador_xml->lista->título;
?>
<form id="yourFormId" method="post">
    <input name="título" value="<?php echo $título ?>">
    <input class="submitBtn" type="submit" name="submit" value="Enviar Registro!">
</form>

PHP file: input.php (with loop)

<meta charset="UTF-8">
<?php
    $carregador_xml = simplexml_load_file("minha_lista.xml");
    foreach($carregador_xml->children() as $lista){
?>
<form method="post">
    <input name="título" value="<?php echo $título ?>">
    <input class="submitBtn" type="submit" name="submit" value="Enviar Registro!">
</form>
<?php
    if(isset($_POST['submit'])){
        $carregador_xml=simplexml_load_file('minha_lista.xml');
        $carregador_xml->lista->título=$_POST['título'];
        $handle=fopen("minha_lista.xml","wb");
        fwrite($handle,$carregador_xml->asXML());
        fclose($handle);
    }
    $título = $lista->título;
}
?>

How do I generate an edit form loop for each specific XML data that is within the title and title tags? (In the case of my input.php without a loop, I can only display the first list, how can I do to generate others besides it?

XML file: my_list.xml

<?xml version="1.0" encoding="UTF-8"?>
<banco-de-dados>
    <lista>
        <título>Título 1</título>
    </lista>
    <lista>
        <título>Título 2</título>
    </lista>
</banco-de-dados>
    
asked by anonymous 20.10.2015 / 02:33

1 answer

0

Here's a code that should work for what you want.

  

NOTE : Do not use special characters in code, either PHP or XML.   Special characters only for text to be read, otherwise, avoid.

Change your XML to this one, where I removed the special character from the tag name.

<?xml version="1.0" encoding="UTF-8"?>
<banco-de-dados>
    <lista>
        <titulo>Título 1</titulo>
    </lista>
    <lista>
        <titulo>Título 2</titulo>
    </lista>
    <lista>
        <titulo>Título 3</titulo>
    </lista>
    <lista>
        <titulo>Título N</titulo>
    </lista>
</banco-de-dados>

For your list of titles, I do not think you need a form for each item on the list (I would never use it). One is enough, but it will always change all of them with the given code.

<form method="post">
<?php
    $carregador_xml = simplexml_load_file("minha_lista.xml");
    $i = 1;
    foreach ($carregador_xml->children() as $lista) { ?>        
    <input name="titulo[<?php echo $i++; ?>]" value="<?php echo $lista->titulo; ?>"> <br />    
<?php } ?>

    <input class="submitBtn" type="submit" name="submit" value="Salvar Registros!">
</form>

The code that writes back the changes can be this one here

if (isset($_POST['titulo'])) {
    $titulos = (array) $_POST['titulo'];
    $carregador_xml = simplexml_load_file('minha_lista.xml');
    $funcao = fopen("minha_lista.xml", "wb");
    foreach ($titulos as $num => $titulo) {
        $i = 1;
        foreach ($carregador_xml->children() as $lista) {
            if ($i++ == $num ) {
                $lista->titulo = $titulo ; 
                break 1;
            }
        }       

    }
    fwrite($funcao, $carregador_xml->asXML());
    fclose($funcao);        

}
  

NOTE 2 : If titles will contain special characters other than accents, it may be necessary to use CDATA session, however simplexml does not support creating these sessions, requiring the use of DOM. I've already used this solution here that I consider very elegant.

    
20.10.2015 / 14:32