Ir para conteúdo

Arquivado

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

ro.fonseca

[Resolvido] Acessar dinamicamente uma variavel d

Recommended Posts

Bem pessoal, eu tenho aqui uma estrutura MVC, que é orientada pela url, então por exemplo, se eu tenho a seguinte url "www.meusite.com.br/cadastro/add", ele irá acessar o controlador(classe) "cadastro" e a action(metodo) "add", chamando pelo o controlador o arquivo da view "cadastro.phtml", enfim, quem conhece o zend deve estar familiarizado com isso, a minha dúvida é o seguinte, e se no controlador eu quiser criar uma variavel que seria printada(ECHO) na tela pelo arquivo "cadastro.phtml"??

 

Um pouco de codigo, um exemplo da classe do controlador Cadastro:

class Cadastro{

 public function add(){
    ...

  //Vamo dizer que eu queira personalizar o title do html, como jogar isso no arquivo "cadastro.phtml"??
  $title = "Cadastro - Adicionar Usuário";

 }
}

 

E agora um mini exemplo do cadastro.phtml

<html>
<head>
<title>(Variavel criada pela classe controlador Cadastro, ficaria aqui. Como eu faria isso???)</title>
</head>
<body>
...
</body>
</html>

 

Como eu faria isso?

abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

você ta usando zend?

 

no controlador

 

... resto do controlador

//colocaria assim
$this->view->title='seu titulo';

... resto do controlador

 

e no .phtml assim

 

... resto do .phtml

//colocaria assim
<?php echo $this->title;?>

... resto do controlador...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Igor, desculpa a demora em responder. Então, eu não estou usando o zend, to fazendo na mão mesmo, até por aprendizado e não estou conseguindo usar a variavel que eu criei na classe, no arquivo phtml...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, a aplicação é simples, em MVC, então temos o Model, Controller e o View, através do autoload são chamados o controlador e o model como mostrado no código abaixo:

 

Sim, eu sei que deve colocar o set_include_path, mas é que ainda estou na fase de implementação.

function __autoload_files($file){
   require_once(CONTROLLERS . $file . 'Controller.php');
   require_once(MODELS . $file . 'Model.php');
}
spl_autoload_register('__autoload_files');

 

O autoload chama os respectivos model e controlador, então se for digitado na url isso: www.site.com.br/teste/teste, ele irá chamar o modelo "TesteModel" o controlador "TesteController" e a action "testeAction", dentro do controlador eu chamo a respectiva view(teste.phtml). Segue abaixo o TesteController:

 

class TesteController extends Controller{
   testeAction{
     //Aqui chama a view pela classe Controller, mostro abaixo o codigo do Controller
     $this->view('teste', 'teste');

     //Aqui a variavel que eu quero que funcione na view teste.phtml e que nao funciona, pois diz que a variavel $title nao existe
     $title = "Teste";
  }
}

 

Agora a classe Controller, como se pode observar, ele recebe o nome e a pasta e chama a respectiva view através do require_once

class Controller{

   protected function view($nome,$pasta){
if(empty($pasta))
    return require_once(VIEWS . $nome.'.phtml');
else
    return require_once(VIEWS . $pasta.'/'.$nome.'.phtml');
   }

}

 

 

Pronto, é isso ae, a minha duvida, como dita anteriormente, é como fazer com que a variavel inicializada no controlador possa ser usada na View. E podem meter o pau no código, me xingarem o que for, o que eu quero antes de td é sempre aprender.

 

abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

isto nao esta em mvc...preste bem atencao...o papel do controller eh aplicar a logica do negocio, o model as regras do negocio, o view eh mostrar e receber dados, você esta fazendo o papel do view no controller

 

class[b] Controller[/b]{

   protected function [b]view[/b]($nome,$pasta){
       if(empty($pasta))
           return require_once(VIEWS . $nome.'.phtml');
       else
           return require_once(VIEWS . $pasta.'/'.$nome.'.phtml');
   }

}

 

uma ideia? usa o smarty como view, vai t poupar muito tempo....digamos q 1/3 do seu trabalho, ja que você ainda tera 2/3 pra fazer (controlls, e models)...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não conheco nada de smarty pra falar a verdade, só uma dúvida entao, o view seria chamado onde se nao fosse pelo proprio controlador? O controlador nao é o responsavel pelo intermedio entre Model e View?

Compartilhar este post


Link para o post
Compartilhar em outros sites
isto nao esta em mvc...preste bem atencao...o papel do controller eh aplicar a logica do negocio, o model as regras do negocio, o view eh mostrar e receber dados, você esta fazendo o papel do view no controller

Sua definição de MVC está um tando equivocada quanto às responsabilidades do Model e do Controller.

 

O Controller cuida das REQUISIÇÕES feitas pelo usuário, não da lógica do negócio.

O Model cuida das regras e da lógica do negócio.

 

Leitura

:seta: http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

Compartilhar este post


Link para o post
Compartilhar em outros sites

O title deve ser global para a classe .. ou seja, se você setar dentro do método, somente o escopo do método vai poder acessar a variável, pra isso use uma propriedade ..

 

<?php 
     class Test {

           public $title ;

           public function doSomething ( ) {
                  $this->title = 'hello world !' ;
           }
     }

 

Então .. no html você faz

<html>
      <head>
            <title><?php echo $testController->title ?></title>
      </head>
</html>

 

Lembrando que não é responsabilidade do Controller exibir esse tipo de coisa .. alias, sua view que tinha que ter um método para recuperar o titulo da aplicação ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

O title deve ser global para a classe .. ou seja, se você setar dentro do método, somente o escopo do método vai poder acessar a variável, pra isso use uma propriedade ..

 

<?php 
     class Test {

           public $title ;

           public function doSomething ( ) {
                  $this->title = 'hello world !' ;
           }
     }

 

Então .. no html você faz

<html>
      <head>
            <title><?php echo $testController->title ?></title>
      </head>
</html>

Ok.

 

Lembrando que não é responsabilidade do Controller exibir esse tipo de coisa .. alias, sua view que tinha que ter um método para recuperar o titulo da aplicação ..

 

Eu sei que não é responsabilidade do controlador fazer isso, mas é que eu preciso mudar o titulo e algum lugar teria q fazer essa mudança dinamicamente de acordo com a pagina... A view teria que ter um metodo na classe view, é isso? É bom lembrar que não é somente o titulo, mas tb por exemplo os dados obtidos no banco de dados pra jogar na view, então não é somente o titulo, mas basicamente qualquer informação retirada do BD para a pagina.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza, deu pra implementar legal... Andrey, tu pode me falar por alto como funciona a função "set_include_path"?? Li sobre ela, mas ainda fiquei sem entender algumas coisas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Toda vez que você inclui um arquivo, o construtor de linguagem escolhido (require/include), dá uma espiada no include_path, que é uma diretiva do PHP.INI, pra tentar incluir a partir de algum lugar conhecido.

 

set_include_path() permite incorporar outros diretórios à essa instrução padrão, permitindo que você "diminua" os paths quando for fazer um include/require.

 

Por exemplo. Se você der um require em MinhaClasse.php, assim, sem nenhum path, o require vai dar uma olhada no diretório do PEAR, por exemplo, que é um dos paths presentes por padrão nessa diretiva.

 

Obviamente, a menos que esse seu arquivo esteja jogado lá, não vai funcionar. Suponhamos, então, que ele esteja dentro de um diretório Libraries, na raiz da sua aplicação.

 

Ao fazer:

 

set_include_path( '.'
                        . PATH_SEPARATOR . realpath( './Libraries' ) . DIRECTORY_SEPARATOR

                        . PATH_SEPARATOR . get_include_path() )

No arquivo index.php, ou outro que também esteja na raiz da aplicação, já que nesse caso há um ./ junto de um realpath(), esse diretório Libraries será incluído na diretiva em tempo de execução e o seu require vai funcionar.

 

Perceba que normalmente set_include_path() vêm acompanhada de get_include_path(), que retorna o valor do include_path atual, para que você apenas complemente a instrução, ao invcés de alterá-la por completo.

 

Cada novo path a ser incluído na diretiva deve ser separado pela constante PATH_SEPARATOR, por padrão um ponto-e-vírgula, e todos eles numa única string, daí a concatenação entre eles.

 

Mas cuidado, se você fizer um include_path muito grande. Justamente pelo fato de antes de incluir/requerir aquilo que você solicitou a partir do path que você definiu o construtor da linguagem buscar no include_path, um muito grande fará sua inclusões ficarem mais lentas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok Bruno, mt boa essa explicação deu pra entender bem, só mais uma duvida, eu tenho essa classe abaixo em que eu faço um require dentro dela, funciona td certo, mas é correto fazer esse require DENTRO da classe??

 

No caso ae ele retorna um require, mas quem chamou a função view, foi uma outra classe.

 

class Controller{
   public $title = 'Ofertandos';

   protected function view($nome,$pasta){
if(empty($pasta))
    return require_once(VIEWS . $nome.'.phtml');
else
    return require_once(VIEWS . $pasta.'/'.$nome.'.phtml');
   }
}

 

 

Classe que chama a view:

 

class Cadastro extends Controller{
   public $teste;

//    public function __construct(){
////	parent::setTitle('Cadastro');
////	$this->teste = 'hello sdasd';
//    }

   public function indexAction(){
parent::setTitle('Cadastro');
$this->teste = 'fdf';
$this->view('cadastro', 'cadastro');
   }

   public function testeAction(){
...

   }


}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu vejo que, à parte de tudo aquilo que OOP significa, só de trabalhar com as classes, já implica num autoloader por praticidade.

 

Sendo assim, requie/include só devem ser usados em quatro casos:

 

- Funcionamento básico da aplicação, como incluir um arquivo de configuração, por exemplo.

- No próprio autoloader, óbvio

- Para chamar um arquivo de template, já que o autoloader só vai apenas operar sobre instâncias de objetos ainda não definidos.

- Dependendo do seu autoloader, para incluir classes necessárias fora do contexto de um namespace. No meu caso eu tenho um cojunto de classes, cada qual com uma técnica de autoloader, logo não pode se auto invocar automaticamente.

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.