Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal estou iniciando com o Smarty e estou com a seguinte duvida:
Estou criando um painel administrável com Smarty, queria usar o Smarty para o painel e o site, sendo assim eu teria que usar dois Smarty? Na pasta raiz onde estariam os controles do site e na pasta ADM onde estariam os controles do painel?
Já que se o Smarty estiver na pasta raiz eu não consigo fazer require da class do Smarty dentro da pasta ADM.
Alguém pode me tira essa duvida?
O problema não e os templates mais sim os controles, os controles do ADM estão em um subdiretório chamado ADM, assim quando vou chama a class do Smarty (require_once) que esta na raiz da um fatal erro, por que ele não consegui enxerga o diretório mesmo colocando “../” só funciona se eu coloca o controle na raiz, mais ai o usuário teria que digita o nome do arquivo e a extensão , exemplo: adm.php para logar no painel.
Trabalhe com caminhos absolutos ao invés de relativos.
Defina uma constante no primeiro arquivo da aplicação apontando para o diretório raiz:
define( 'ROOT_DIR', __DIR__ . DIRECTORY_SEPARATOR ); // PHP 5.3
define( 'ROOT_DIR', dirname( __FILE__ ) . DIRECTORY_SEPARATOR ) // PHP < 5.3
E todo o include/require você começa com essa constante e vai adicionando tantos/paths/quantos/necessarios até localizar o arquivo desejado.
Entendi mais ou menos.
você pode da um exemplo?
Tipo essa constante eu defino no arquivo index, certo?
Normalmente sim. Mas se nesse index houver algum include para os famosos arquivos de configuração (config.php, por exemplo) é até mais lógico colocar nele. Contanto, obviamente, que tal arquivo também esteja na raiz da aplicação, junto do index.php
O importante é uma vez definida essa constante, sempre utilizá-la nos include/require ao invés de ficar usando "infinitos" ../
include ROOT_DIR . 'Libraries/Smarty/Smarty.class.php';
Esse exemplo supõe uma estrutura de diretórios onde todo o conteúdo da pasta lib da Smarty se encontra dentro de um subdiretório libraries que se encontra na raiz da aplicação. Ilustrativamente, num cenário real, seria assim:
/
|--index.php
|--config.php
|--.htaccess
|--Application
|----Application/Portal
|----Application/Portal/Models
|----Application/Portal/Views
|----Application/Portal/Views/index.tpl
|----Application/Portal/Controller
|--Cache
|--Libraries
|----Libraries/Smarty
|----Libraries/Smarty/Smarty.class.php
|--Public
|----Public/images
|----Public/jscripts
Veja que demonstrei, também, onde ficariam os arquivos de template (.TPL).]
Essa constante, durante a execução, será interpretada com o caminho absoluto até o arquivo no qual você definir.
No Windows virá desde o C: (ou a letra da unidade em uso - no meu "acidental" caso é G: o.O) e nos servidores *ix, que são a maioria dos servidores online rodando PHP, desde o /, onde se encontram o etc, o public_html...
Entendi!
Fiz a constante certinho mais quando vou fazer o require no subdiretório ADM da o seguinte notice:
Use of undefined constant ROOT_DIR - assumed 'ROOT_DIR' in C:\......
Será que e configuração no meu servidor?
Hmmmmm.....
Então sua aplicação é daquele tipo que cada arquivo faz uma coisa, ao invés de toda requisição passar por um único arquivo (querystrings, com ou sem Friendly URL's).
Bom, nesse caso, é mais do que recomendado que a definição dessa constante fique num config.phppois, normalmente, esses arquivos contém diversas configurações comuns à todo os sistema.
Dessa forma, sempre que iniciar um novo arquivo, comece-o incluindo esse arquivo de configurações.
Aos mais experientes eu não mencionei as melhores práticas propositalmente, para não fugir do escopo do tópico e/ou para não confundir o autor.
Consegui resolver pessoal!
Solução:
Chamei a class do Smarty “Smarty.class.php” direto no menu arquivo no subdiretório ADM e fiz as configuração do Smarty direto nesse arquivo. Assim resolvi o problema de require.
Foi um solução! Se alguém tiver mais algua sugestão manda ai..
Obrigado a todos pela ajuda!
O problema dessa solução é que você acaba repetindo a configuração sempre que precisar dela.
O ideal mesmo seria você usar um Singleton Registry (no fórum um zilhão de tópicos sobre isso).
Dessa forma você incluiria o arquivo uma só vez, configuraria uma só vez e perpetuaria a instância do objeto pela aplicação. Sempre que precisasse do objeto você apenas "pegaria" do Registro anteriormente adicionado.
Sóparece complicado, mas é mole, mole.
basta um diretório smarty. você pode ter um sub-diretório "admin" dentro de smarty/templates, onde guardará os templates da áread administrativa