Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Godoi

Como faço isso?

Recommended Posts

Bom dia meu povo...

 

Seguinte, to pegando POO com PHP agora, e comecei minhas classes e tudo mais.

 

To fazendo uma classe para criar arquivos de configuração em XML pra mim. então segue o código (ps: esse é somente uma parte dela..)

 

<?php
class Config_Files{

protected $_xmlw;
protected $_child;

public function __construct($version = '1.0', $charset = 'utf-8'){
	$this->_xmlw = new DOMDocument($version, $charset);
	$this->_xmlw->formatOutput = true;
	$this->_child = $this->_xmlw->createElement('Config');
	$this->_xmlw->appendChild($this->_child);
}

public function addNode($name){
	$this->_child = $this->_xmlw->createElement($name);
	$this->_xmlw->appendChild($this->_child);
}

public function addText($text){
	$text = $this->_xmlw->createTextNode($text);
	$this->_child->appendChild($text);
}

public function endFile(){
    echo $this->_xmlw->saveXML();
}
}
?>

 

Se eu usar da seguinte forma funciona e meu xml sai direitinho;

 

<?php
$novoconfig = new Config_Files;
$novoconfig->addNode('nofilho');
$novoconfig->addText('Texto no filho');
$novoconfig->endFile;
?>

 

mas eu quero usar as funcoes assim:

 

<?php
$novoconfig = new Config_File;
$novoconfig->addNode('nofilho')->addText('Texto no filho');
$novoconfig->endFile;
?>

 

Com qual principio eu posso fazer isso? Me passem como fazer.. não como implementar isso nesse código.. hehe quero aprender.. links com conteúdo também são extremamente bem vindos..

 

Vlw pessoal..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com qual principio eu posso fazer isso? Me passem como fazer..

Fluent Interface

 

retorne o objeto atual no fim de cada método.

 

não pense 'quero fazer assim', pense: 'se faz sentido fazer assim'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

retorne o objeto atual no fim de cada método.

Não necessariamente o objeto atual, William. Desde que método anteriormente invocado retorne um objeto válido, a cadeia pode continuar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não necessariamente o objeto atual, William.

sim exato, mas no contexto dele, como pretende trabalhar apenas com os métodos do objeto gerado apartir da class Config_Files, fez mais sentido eu falar do objeto atual, até para não confundir o colega.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, e vou pesquisar a respeito..

 

mas no meu contexto, ao meu ponto de vista, torna meu código mais fácil.

 

estou certo?

 

So pra avisar,

 

Consegui implementar o código, na realidade nem é tão difícil assim.

 

A meu ver ficou muito mais fácil. Alem de economizar meus dedos quando for usar a classe.. hehe.

 

Assim que terminar essa classe, vou posta-la aqui a quem interessar..

 

Vlw pessoal

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey,

 

Muito obrigado,

 

mas o motivo principal de eu estar criando isso.. e quero aprender.. OOP, MVC, e saber implementa-los de forma mais correta possivel...

 

depois que eu souber, ai sim, com certeza vou procurar as bibliotecas e codicos prontos para poder me auxiliar a resolver meus problemas de forma mais fácil e rápida..

 

mas vlw mesmo assim..

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nen sempre a Criação das Classes

São a Solução mais Rapida Para Certo Tipo de Problema

MVC Tem um Proposito, OOP Tambem

Não 'Procurar os Codigos, Ou Solução Mais Rapida' é sim Saber Quando é onde Utilizar dos Recursos

Que o PHP nos oferece ;)

 

 

Em Questão da Sua Duvida, Basta Retornar $this

Isso Siginifica Que Você Está Retornando 'isto, este, ou esta'

 

Então

<?php
     class Fabrica{
          public $Boneco, $Vende, $Troca;

                public function Monta(){
                       $this->Boneco = 'Montamos um Boneco !!!';
                       return $this;
                }
                public function Vende(){
                       $this->Vende = 'Vendemos um Boneco !!!';
                       return $this;
                }
                final public function Troca(){
                       $this->Troca = 'Trocamos um Boneco !!!';
                       return $this->Boneco . PHP_EOL . $this->Vende . PHP_EOL . $this->Troca;
                }

    }
    $Fabrica = new Fabrica();
    echo $Fabrica->Monta()->Vende()->Troca();

 

Saida:

Montamos um Boneco !!! Vendemos um Boneco !!! Trocamos um Boneco !!!

 

^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim como você tenho a mesma dúvida então digo o seguinte, porque não fazer o node e o texto juntos. no mesmo método?

Por exemplo, voce apenas declara o node(obrigatório) e o texto você deixa como opcional, assim em um próprio metodo você insere 2 valores, isso está certo ou errado ?!?!

 

<?php
class Config_Files{

       protected $_xmlw;
       protected $_child;

       public function __construct($version = '1.0', $charset = 'utf-8'){
               $this->_xmlw = new DOMDocument($version, $charset);
               $this->_xmlw->formatOutput = true;
               $this->_child = $this->_xmlw->createElement('Config');
               $this->_xmlw->appendChild($this->_child);
       }

       public function addNode($name, $text = NULL){
               $this->_child = $this->_xmlw->createElement($name);
               $this->_xmlw->appendChild($this->_child);

               $text = $this->_xmlw->createTextNode($text);
               $this->_child->appendChild($text);
       }

       public function endFile(){
           echo $this->_xmlw->saveXML();
       }
}
?>

 

Na implementação seria apenas

<?php
$novoconfig = new Config_File;
$novoconfig->addNode('nofilho', 'Texto no filho'); // Com texto
$novoconfig->addNode('nofilho2'); // Sem texto
$novoconfig->endFile;
?>

 

Isto estaria certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não Prescisa de Invocar Mais um Metodo

Para Criar o Texto ao Elemento

 

<?php
  $DOMDocument = new DOMDocument( '1.0', 'iso-8859-1' );
  $Element = $DOMDocument->createElement( 'node', 'texto ...' );
  $DOMDocument->appendChild( $Element );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, realmente,

 

mas e se for pra eu criar um nó, que recebera outros.. ele não tem a necessidade de ter um texto dentro.. e outra.. e se eu for criar um nó... com um conteudo que tenha CDATA... acho melhor criar metodos independentes para trabalhar com isso.. da mesma forma que um metodo para criar atributos ao nó..

 

  $novono->addChild('config')->setAttribute('database' ,'mysql')->addText('qualquertexto');

 

acho que fica mais legivel assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem ai e Contigo, a Reescrita dos Metodos Nen Sempre Pode ser a Melhor Solução ^_^

Se Prescisar Criar um Nó Dentro de Outro

 

<?php
	$DOM = new DOMDocument();
$Node = $DOM->createElement( 'pai' );
$Element = $DOM->appendChild( $Node );
$Append = $Element->createElement( 'filho', 'oi' );
$DOM->appendChild( $Append );
...

Isso Faz uma Hierarquia .. Mais Fique atento a Semântica

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

é realmente,

 

ainda estou limpando o código... mas esta ficando legal.. fazendo testes e aprendendo.. hehe

 

<?php

$teste = new Tools_Files_Dom();

$teste->startFile("teste.xml", ".");
$teste->addRoot("config");
$teste->addChild('filho');

for($i = 0; $i<10; $i++){
	$teste->addChild('neto', true);
if($i == 3){
	$teste->setAttribute('type' ,'database')->addText('Neto com attributo');
} else {
	$teste->addText('nome '.$i);
}
$teste->getNode('filho',true);
}

$teste->addChild('esposa', false)->addText('MinhaEsposa');
$teste->endFile();

class Tools_Files_Dom {

	// @ Domdocument for read
	protected $_xml = null; 

	// @ Domdocument for write
	protected $_xmlw = null;

	// @ Path for write
	protected $_path = null;

	// @ Filename for write
	protected $_file = null;

	// @ Dom Element
	protected $_child = null;

	// @ Dom root Element
	protected $_root = null;

	// @ Dom frament Element
	protected $_fragment = null;


/**
* @ Carregar arquivo via string
*
* @ Param string $file
* @ Retorna DOMDocument
*/
public function loadFile($file)
{
	if(is_readable($file)){
		$this->_xml = new DOMDocument();
		$this->_xml->load($file);
	} else {
		// Adicionar Exceptiond
		echo 'não leu';
	}
}

/**
* @ Retorna um nó do elemento
*
* @ Param string $node
* @ Param int $level
* @ Retorna DOMNode
*/
public function getNode($node, $insert = false, $level = 0)
{
	if(!$insert){
		return $this->_xml->getElementsByTagName($node)->item($level);
	} else {
		$this->_child = $this->_xmlw->getElementsByTagName($node)->item($level);
	}
}

/**
* @ Retorna o valor de um nó
*
* @ Param string $node
* @ Param int $level = 0
* @ Retorna string
*/
public function getNodeValue($node, $level = 0)
{
	return $this->getNode($node, $level)->nodeValue;
}

/**
* @ Retorna o nome de um nó
*
* @ Param string $node
* @ Param int $level = 0
* @ Retorna string
*/
public function getNodeName($node, $level = 0)
{
	return $this->getNode($node, $level)->nodeName;
}

/**
* @ Retorna os atributos de um nó
*
* @ Param string $node
* @ Param int $level = 0
* @ Retorna array
*/
public function getNodeAtt($node)
{
	$a = array();		
	$node = $this->getNode($node);
	if($node->hasAttributes()){
		$attributes = $node->attributes;	
		if(!is_null($attributes)){
			foreach($attributes as $key => $attr){
				$a[$attr->name] = $attr->value;
			}
		}
	}
	return $a;
}

/**
* @ Inicia a escrita de um arquivo
*
* A fazer, verificar se a pasta de destino é passivel de escrita
*
* @ Param string $filename
* @ Param string $folder
* @ Retorna bool
*/
public function startFile($filename, $path, $version = '1.0', $charset = 'utf-8')
{
	if(is_dir($path)){
		$this->_xmlw = new DOMDocument($version, $charset);
		$this->_xmlw->formatOutput = true;
		$this->_file = $filename;
		$this->_path = $path;
	} else {
		// Exception
		echo 'nao criou';
	}	
}

/**
* @ Adiciona o nó root
*
* @ Param tipo $variavel
* @ Retorna tipo
*/
public function addRoot($name)
{
	$this->_root = $this->_xmlw->createElement($name);
	$this->_xmlw->appendChild($this->_root);
}

/**
* @ Cria um child no documento XML
*
* @ Param string $name
* @ Param bool $child
*/
public function addChild($name, $child = false)
{
	$node = $this->_xmlw->createElement($name);

	if($child){
		$this->_child->appendChild($node);
	} else {
		$this->_root->appendChild($node);
	}

	$this->_child = $node;
	return $this;
}

/**
* @ Cria um texto dentro do nó atual
*
* @ Param string $text
*/
public function addText($text)
{
	$text = $this->_xmlw->createTextNode($text);
	$this->_child->appendChild($text);
	return $this;
}

/**
* @ Cria um attributo no nó atual
*
* @ Param string $key
* @ Param string $value
*/
public function setAttribute($key, $value)
{
	$this->_child->setAttribute($key, $value);
	return $this;
}

/**
* @ Salva o documento XML
*
* @ Param tipo $variavel
* @ Retorna tipo
*/
public function endFile()
{
    echo $this->_xmlw->saveXML();
}



}

?>

 

esse código retorna exatamente isso aqui:

 

<?xml version="1.0" encoding="utf-8"?> 
<config> 
 <filho> 
   <neto>nome 0</neto> 
   <neto>nome 1</neto> 
   <neto>nome 2</neto> 
   <neto type="database">Neto com attributo</neto> 
   <neto>nome 4</neto> 
   <neto>nome 5</neto> 
   <neto>nome 6</neto> 
   <neto>nome 7</neto> 
   <neto>nome 8</neto> 
   <neto>nome 9</neto> 
 </filho> 
 <esposa>MinhaEsposa</esposa> 
</config> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.