1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema mais específico em PHP

Discussão em 'Web Development' iniciada por CrazyBomber, 16 de Novembro de 2006. (Respostas: 4; Visualizações: 1099)

  1. CrazyBomber

    CrazyBomber Power Member

    Boas.

    Estou práqui entretido a escrever código re-utilizável, por mim, em PHP. Tenho um conjunto de funções que pegam no código html da página (lido de um ficheiro), e vão verificar se existem "módulos".

    A chamada de um módulo é feita colocando algo do género no código html:
    {% name="newsmodule" path="modules/info/" args="top5" %}

    O gajo vai buscar o ficheiro "newsmodule.php" à directoria dada no path, e mete uma variavel com os args dados. O único atributo realmente requerido é o nome, o path e os args são facultativos.

    Depois, uso o @include para fazer parse do ficheiro. Aqui surgiu-me um problema: se chamar o mesmo módulo, ele não pode conter funções, pois iria dar um erro de re-definição de funções.
    Não encontrei grande solução para este problema. Se quiser usar funções, dentro de um módulo, tenho de as meter num ficheiro à parte e fazer include_once.

    No final do módulo, deve haver uma variável $_output, que contém o código html resultante da execução do módulo. O que faço é substituir directamente a chamada do módulo por este resultado.

    Em termos práticos, funciona bastante bem, acho eu.


    Agora surgiu-me outro problema. Para isto resultar como espero, um só ficheiro (o index.php) vai fazer a gestão toda das páginas. Portanto, cada secção irá ter o seu nome, ou um número identificativo (ou os 2 lol). E a minha dúvida reside aqui. Qual a melhor abordagem para organizar as páginas? Pensei numa tabela do MySQL, num ficheiro struct.php com arrays, ou directamente programados no index.

    Visto que o objectivo é ter código o mais genérico possível, estou mais inclinado para as duas primeiras soluções.

    Já alguém fez alguma coisa deste género? Como resolveram os problemas? :D

    Btw, fica aqui o meu código (e peço desculpa por não estar devidamente comentado :sad:):

    Código:
    	//Substitui um texto no $output (o que vai ser mesmo mostrado no browser)
    	function replaceText( $search, $text ) {
    		global $output;
    		if( $output !== NULL ) {
    		 	$output = str_replace( $search, $text, $output );
    		}
    	}
    	
    	//Carrega o modulo. recebe a string de chamada, o nome do modulo, e o resto...
    	function loadModule( $originalcontext, $modulename, $path="", $arguments=NULL ) {
    		global $args, $_output;
    		$_output = NULL;
    		
    		if( $arguments !== NULL )
    			$args = $arguments;
    		
    		@include_once( $path . $modulename . '.php' );
    		
    		if( $_output !== NULL ) {
    			replaceText( $originalcontext, $_output );
    		}
    	}
    	
    	//Função auxiliar para ir buscar um atributo (na forma $atrib="VALOR") dentro de uma string
    	function getAtrib( $string, $atrib ) {
    		preg_match( "/$atrib=\"([a-zA-Z0-9_-]+)\"/", $string, $res );
    		if( isset( $res[1] ) )
    			return $res[1];
    		else
    			return FALSE;
    	}
    	
    	//Funcao principal. Pega no $text (que ira quase sempre ser o $output) e encontra e substitui todos os modulos nele especificados
    	function parseModules( $text ) {
    		
    		preg_match_all( "/{%([a-zA-Z0-9=\" ]+)%}/", $text, $matches );
    		
    		if( count( $matches[0] ) == 0 )
    			return;
    		
    		for( $i = 0; $i < count( $matches[0] ); $i++ ) {
    			$v = $matches[0][$i];
    			
    			$name = getAtrib( $v, "name" );
    			if( $name !== FALSE ) {
    				$path = getAtrib( $v, "path" );
    				$args = getAtrib( $v, "args" );
    				
    				if( $path === FALSE )
    					$path = "";
    				
    				if( $args === FALSE )
    					$args = NULL;
    				
    				loadModule( $v, $name, $path, $args );
    			}
    		}
    		
    	}
    
     
  2. CrazyBomber

    CrazyBomber Power Member

    As coisas q um gajo se lembra quando está a comer... :)

    Outra solução para o problema:

    Através do GET, passar o nome da página, no estilo index.php?page=main

    O que fazia era pegar o main.html (ou main.php), tirar o output daí (no caso de ser html era o código html, se fosse php era a variavel $_output) e tratar dos modulos.

    Parece-me bem :)

    Alguma sugestão?
     
  3. spastikman

    spastikman Banido

    Isso é o que se costuma fazer :D
     
  4. mascker

    mascker Power Member

    Não utilizes include, utiliza include_once

    :D

    Saudações
     
  5. mcog_blaster

    mcog_blaster Power Member

    Para tratar casos de funçoes repetidas podes usar a funçao - function_exists - .
     

Partilhar esta Página