Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bem, como na Parte 3
Já tínhamos falado de DOMXPath, e como se chega aos elementos através de uma query, podemos dar continuidade
ao que estávamos fazendo dês de a primeira aula, como já tínhamos parado com o XML dessa forma:
<?xml version="1.0" encoding="utf-8"?>
<albums>
<album usuario="0669">
<capa src="meuPrimeiroAlbum.jpg"/>
<foto id="1" classificacao="5" src="umaFoto1.jpg"/>
<foto id="2" classificacao="5" src="umaFoto2.jpg"/>
<foto id="3" classificacao="4" src="umaFoto3.jpg"/>
<foto id="4" classificacao="2" src="umaFoto4.jpg"/>
<foto id="5" classificacao="1" src="umaFoto5.jpg"/>
<foto id="6" classificacao="2" src="umaFoto6.jpg"/>
</album>
<album usuario="1589">
<capa src="capas/umaCapa.jpg"/>
<foto id="1" classificacao="5" src="fotoDoUsuario1589.jpg"/>
<foto id="2" classificacao="2" src="fotoDoUsuario1589.png"/>
<foto id="3" classificacao="3" src="fotoDoUsuario1598.jpg"/>
</album>
</albums>
Nele mesmo nos continuaremos, já que na parte 2 já achamos o álbum respectivo á um usuário
agora pensamos, e se esse 'usuário' deseja alterar uma foto ?, você reescreveria todo o XML ?
Isso pra mim seria uma perda de processamento, então tem outra forma de fazer isso ?
Alterar o valor do atributo 'src' de uma foto ?.
Claro que tem !!!!
Podiamos fazer assim ..
<?php
$DOMDocument = new DOMDocument( '1.0', 'utf-8' );
$DOMDocument->formatOutput = true;
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->loadXML( $XML );
$DOMXPath = new DOMXPath( $DOMDocument );
$idUsuario = '0669';
$idFoto = 4;
$DOMXPath->query( './/album[@usuario="'.$idUsuario.'"]/foto[@id="'.$idFoto.'"]' )
->item(0)->setAttribute( 'src', 'fotoAlterada.jpg' );
Percebam que na query, eu paro no elemento foto, não prossigo ou volto para um elemento anterior
Então se eu já estou na foto desejada, basta setar o attributo SRC novamente, Após executar esse código
o output do xml seria
<?xml version="1.0" encoding="utf-8"?>
<albums>
<album usuario="0669">
<capa src="meuPrimeiroAlbum.jpg"/>
<foto id="1" classificacao="5" src="umaFoto1.jpg"/>
<foto id="2" classificacao="5" src="umaFoto2.jpg"/>
<foto id="3" classificacao="4" src="umaFoto3.jpg"/>
<foto id="4" classificacao="2" src="fotoAlterada.jpg"/>
<foto id="5" classificacao="1" src="umaFoto5.jpg"/>
<foto id="6" classificacao="2" src="umaFoto6.jpg"/>
</album>
<album usuario="1589">
<capa src="capas/umaCapa.jpg"/>
<foto id="1" classificacao="5" src="fotoDoUsuario1589.jpg"/>
<foto id="2" classificacao="2" src="fotoDoUsuario1589.png"/>
<foto id="3" classificacao="3" src="fotoDoUsuario1598.jpg"/>
</album>
</albums>
Alteramos a foto com o 'id' 4 do XML, como também poderíamos remove-la de nossa galeria ..
<?php
$DOMDocument = new DOMDocument( '1.0', 'utf-8' );
$DOMDocument->formatOutput = true;
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->loadXML( $XML );
$DOMXPath = new DOMXPath( $DOMDocument );
$idUsuario = '0669';
$idFoto = 4;
$Foto = $DOMXPath->query( './/album[@usuario="'.$idUsuario.'"]/foto[@id="'.$idFoto.'"]' )->item(0);
$Foto->parentNode->removeChild( $Foto );
Podemos ver que, $Foto retorna uma instância de DOMElement ..
Mais também, em DOMElement, que extende DOMNode, temos que andar pra trás pra poder pegar o node 'foto'
Por isso o uso do parentNode, porque aparentemente, item(0) nos leva ate o elemento 'foto' e seus filhos ..
mais nos não queremos seus filhos.. então voltando para o node Original, podemos remove-lo, apenas usando um removeChild( $Foto )
Após o código executado, o output séria
<?xml version="1.0" encoding="utf-8"?>
<albums>
<album usuario="0669">
<capa src="meuPrimeiroAlbum.jpg"/>
<foto id="1" classificacao="5" src="umaFoto1.jpg"/>
<foto id="2" classificacao="5" src="umaFoto2.jpg"/>
<foto id="3" classificacao="4" src="umaFoto3.jpg"/>
<foto id="5" classificacao="1" src="umaFoto5.jpg"/>
<foto id="6" classificacao="2" src="umaFoto6.jpg"/>
</album>
<album usuario="1589">
<capa src="capas/umaCapa.jpg"/>
<foto id="1" classificacao="5" src="fotoDoUsuario1589.jpg"/>
<foto id="2" classificacao="2" src="fotoDoUsuario1589.png"/>
<foto id="3" classificacao="3" src="fotoDoUsuario1598.jpg"/>
</album>
</albums>
Percebam que não temos mais a foto de ID 4, isso poderia ser feito simplesmente com um formulário normal ..
Se você consegue extrair todo o XML em um array, percorrendo esse array você mode montar o html normalmente com as tags <img>
em um formulário com checkbox \ inputs para remover, alterar ..
Então é isso gente !
Até mais..