Múltiplos sites com CodeIgniter – Exemplo prático

16

Posted by flaviosilveira | Posted in CodeIgniter, Php | Posted on 27-01-2009

Devido a muita procura do post sobre a restruturação do CodeIgniter para trabalhar com múltiplos sites (Múltiplos sites com CodeIgniter), fiz um passo a passo aqui da estrutura para o pessoal entender melhor.

Estava recebendo muitas dúvidas, vamos ver se com este exemplo consigo deixar as coisas mais claras para todos.

Começando do zero.

Baixei a última versão do CodeIgniter.
Descompacto ela no meu desktop.

Dentro dessa pasta veio o system, o user_guide, o index.php e o license.txt.
Costumo deletar o User_guide, pois uso a documentação online.

Atenção agora !
Dentro da pasta system temos a pasta application. É esta pasta que faz o seu site funcionar. Com esta informação em mente vamos em frente.

Para começar a trabalhar com o servidor. Começe criando uma pasta para cada site. Como exemplo site1 e site2.
ex1



O que o site vai precisar para funcionar ? Sim, como vimos acima é a pasta application. Dentro da pasta de cada site vamos precisar de uma application.
ex2


A pasta application, claro, deve ir com a estrutura que vem por padrão nela, como você deve ter reparado na imagem acima.

Agora que já temos o local dos sites prontos, precisamos do que faz o Codeigniter funcionar, que é todo o restante da pasta system. Essa pasta deve estar no mesmo nível dos seus sites.
ex3


Ok. Quase lá.
Agora, sabe aquele index.php que veio quando descompactamos o codeIgniter ? Como digo no outro post, é ele quem indica o caminho da pasta application do seu site, e também do core do codeIgniter. Logo, vamos precisar de um deles para cada site.
ex4


Agora precisamos editar esse arquivo index.php. Vamos começar pelo do site1.
Procure pela linha

$system_folder = "system"

Esta variável indica aonde está o core do seu sistema, a pasta system.
No nosso caso ela está um nível acima, então basta mudar para

$system_folder = "../system"

Logo na sequência você deve ver a linha

$application_folder = "application"

Essa é a variável que indica onde está a pasta application desse site (lembrando…estamos alterando o site1). O caminho está correto, então, mantemos assim.

Faça o mesmo para o site2, indicando onde está o core do codeIgniter(pasta system) e a pasta application.

Está feito!

Agora, apenas para ficar mais explícito, vamos alterar a view de cada site.
Dentro de Application > views, temos o arquivo welcome_message.php.
ex5


Dentro desse arquivo, vem a mensagem padrão de boas vindas do codeIgniter. Na do site1 tirei tudo que havia (ctrl + a – del) e coloquei apenas o título

<h1>::: SITE 1 :::</h1>

e na do site2 apenas o título

<h1>::: SITE 2 :::</h1>

Agora basta acessar as pastas para conferir o resultado.

Para detalhes mais técnicos desse step by step, confira o antigo post.

Ainda com dúvida ? Faça aqui o download dos arquivos.

Caso ainda tenha sobrado dúvidas…entre em contato.
Abraços !!!

Share and Enjoy:
  • Print
  • Digg
  • Facebook
  • Google Bookmarks
  • email
  • LinkedIn
  • PDF
  • Twitter

Comments (16)

Muito bom, essas dicas que não se encontra nem no forum do CI é de grande importância, principalmente para quem deseja criar uma unica aplicação para ser usada em varios dominios diferentes com virtualhost.

Parabens

Valeu Natanael…

Muito bom mesmo Flavio!

Estou usando aqui também, ótima dica no CI.

Você conseguiu retirar o index.php nessa estrutura? Estou tentando fazer isso agora mas estou tendo problemas.

Abração,

e boa sorte com tudo ae.

T+

Ótimo post, obrigado por compartilhar as sua experiências no blog.

Estou tendo dificuldades para entender como trabalhar com múltiplos sites no CI.

No meu caso seria a seguinte estrutura:

/admin <- creio que seria a mesma estrutura do tutorial ex: site1
/index <- creio que seria a mesma estrutura do tutorial ex: site2
/public <- javascripts/css e etc..

Quando eu for acessar ex: http://site.com.br/ ele deve abrir “/index”

Caso eu acesse http://site.com.br/admin acessa o administrador do site, creio que essa configuração seja feita por um .htaccess certo ?

Outra pergunta, com essa estrutura, na minha view como eu chamaria um js dentro da /public ?

Seria desta forma:

Creio que pode ser a dúvida de outras pessoas e no início do desenvolvimento do projeto, não saber organizar a sua estrutura de pastas, é horrível.

Me baseando na estrutura deste tutorial, deixei da seguinte forma:

Primeiramente configurei um .htacess eliminando o index.php da url.

Minha nova estrutura:

/admin

/ <- subi 1 nível dos arquivos /admin.

/public <- arquivos css/js e etc…

Está funcionando normalmente, se digito: http://127.0.0.1 abre o front e http://127.0.0.1/admin abre o back. Estou conseguindo trazer os styles.css/js sem problemas.

* Essa estrutura é aceitável para se trabalhar no CI ?

Obrigado pelo tutorial, ajudou a resolver meus problemas !

Muito bom, não achei isso em lugar nenhum …
VLW

Olá Flávio, olha eu aqui de novo quase um ano depois.

Tenho um site funcionando com CI, ta tudo muito bem. Só que agora vou usar um outro site no mesmo servidor e para esse novo site estou tentando usar essa estrutura que você passou.

No localhost funciona uma maravilha com quantos site eu desejar mas no servidor de trabalho não esta funcionando, acho que não tem nada a ver com o fato de esta usando estrutura que você passou mas também não tenho certeza.

No arquivo application/config/config.php já usei todas as opções da diretiva URI PROTOCOL.

Ja usei todas as opções:
AUTO
PATH_INFO
QUERY_STRING
REQUEST_URI
ORIG_PATH_INFO

e mesmo assim o erro continua. O erro retornado esta no final do comentário.

Você sabe dizer o que pode esta acontecendo?

—————– ERRO ——————
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@w21studio.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

Fala cara…..
Sempre bem vindo..haha

Então…
O URI PROTOCOL e esse erro ai que você mostrou tem haver com mod_rewrite e .htaccess que realmente pode variar de um ambiente de desenvolvimento para um de produção…

Como está a configuração desses caras ??

Abraço!!

Ola Flávio,

o mod_rewrite esa habilitado.

O meu .htaccess é esse aqui:

php_flag magic_quotes_gpc off
RewriteEngine on
RewriteCond $1 !^(index.php|images|robots.txt|css|js)
RewriteRule ^(.*)$ /imobiliaria/index.php/$1 [L]

imobiliaria é o nome da pasta onde esta a aplicação com problema.

No outro site, que roda no mesmo servidor, uso um .htaccess igual, só muda o nome da pasta.

Valeu pela resposta, abraços.

Natanael…

.htaccess é loko….
Esse php_flag_magic_quotes_gpc off eu nunca vi…

As vezes no RewriteRule você tem que especificar o diretório inteiro, desde sua pasta de trabalho… é de se experimentar…

Olá Flávio! Parabéns pelas explicações,são as mais completas que encontrei. Porém tenho um problema em relação a reutilização dos models. Tenho um site e uma aplicação, porém quero poder acessar os models do site dentro da aplicação. Tentei das suas formas: servidor/application/website e servidor/application/sistema, com os devidos index.php configurados, e da outra forma servidor/website/application e servidor/sistema/application também com os index.php configurados e ambos apontando para o CodeIgniter-v1.7.2/system. No entando quando tento acessar o sistema recebo a seguinte mensagem: “Unable to locate the model you have specified: modelo_model”. Ou seja, quero compartilhar esse modelo_model para ambos website e sistema. Isso é possível, você poderia me ajudar de alguma forma. Muito Obrigado. MJ

MJ…
Tem que dar um jeito de você centralizar os models fora da applications dos sites.

Ai vai ter que mudar a pasta padrão onde o codeIgniter procura os models.
Você acha isso na pasta libraries, no arquivo Loader.php.
Procure pelo seguinte IF:
if ( ! file_exists(APPPATH.’models/’.$path.$model.EXT))
{
show_error(‘Unable to locate the model you have specified: ‘.$model);
}

Dê uma olhada se consegue. Não é complicado.
Qualquer coisa me avise que dá pra fazer um pequeno post disso aí. Acho que é legal a idéia.

Valeu pelo comentário.
Abraço!!!

Show de bola meu irmão, estou começando agora com o CI, e estava achando estranho mesmo ter que duplicar tudo do CI para os outros sites.

Valeu pelo tuto que ficou muito bom!

Muito bom tutorial, também estou começando agora com frameworks optando pelo CI devido a simplicidade do uso, e uma das minhas “preocupações” era a organização dos diretórios, dessa forma ficou muito simples evitando repetição de pastas.

Boa tarde cara, Antes de tudo parabéns pelo blog. Conteúdo de qualidade cara… Você e a equipe do blog do Codeigniterbrasil!

Ai apartir da pasta do módulo eu acesso o controller especifico daquele módulo…

Lá na empresa onde eu trabalho, estamos migrando todos nossos sistemas para a framework CI, e tenho ficado extremamente com as coisas que esse bixinho faz!

Mas deixa eu te falar, la na empresa nós temos diversos módulos, e eu estou estruturando ele de forma que o application fique na raiz, e os módulos dentro de cada controller como pastas…

Quando vi as soluções propostas por você achei muito legal a idéia mas estava pensando em como construir o sistema, principalmente porque eles trabalharam com o mesmo layout e talvez até usando mesmas funções… Deste jeito eu estaria tirando o poder do CI, apenas copiando funções semelhantes entre eles, uma vez que a POO existe para reduzir a existencia de códigos duplicados… (Eu sei que POO não serve apenas para isso…)

Oque acha cara?
Você consegue ver uma melhor solução?

Vlew aí!

Wallyson…
Não entendi muito bem o que você quis dizer com “módulos dentro de cada controller como pastas”
De qualquer forma… Essa coisa de copiar funções não é interessante. Realmente vai de encontro aos objetivos de se usar um Framework e orientação a objetos.

Procure centralizar as coisas. Por exemplo, se você tem vários módulos que vão usar a mesma funcão de um módulo, por exemplo, organize as coisas de uma maneira que todos consigam chegar nesse model. Sem copiar, repetir métodos.

Abraço!

Post a comment