Como colocar um include em um diretório variado?

  • Identifique-se para criar novos tópicos neste fórum
  • Visitantes anônimos não podem postar neste fórum
fbs777  Ocasional   Postagens: 22

o título está meio esquisito, mas não sei direito como explicar o que quero em poucas palavras.

O que quero é colocar nos arquivos PHP um include que vá buscar um arquivo PHP passando por um diretório não-especifico.

Se fosse em shellscript no console do linux, seria tipo: diretório/*/arquivo.php

Nesse caso, "*" simboliza qualquer diretório (todos) incluido dentro do dir "diretório".

Eu quero tirar vários códigos de hacks de dentro dos arquivos do core, substituindo por includes que vão buscar os hacks em um arquivo específico.

Por exemplo: o hack de tags do rw-banner.
Ele pede para incluir no cabeçalho.php o seguinte hack:

Include_once (XOOPS_ROOT_PATH.'/modules/rw_banner/include/maketags.php');

Tem um outro pedaço de código, mas é só para indicar "if", então o que interessa aqui é essa linha.

Eu criei dentro do módulo rw-banner uma outra pasta chamada plugins e copiei os dois arquivos chamados pelos hacks de tags e bbcodes.
Por isso quando eu coloco no cabeçalho.php o include:

Include_once (XOOPS_ROOT_PATH.'/modules/rw_banner/plugins/maketags.php');

Também funciona tranquilo.
Só que eu não quero ficar criando um include para cada novo hack que eu quiser colocar no cabeçalho, então o que eu queria é que o include fosse buscar os arquivos maketags.php em todos os diretórios de módulos.
Nesse caso eu posso por ex. criar uma pasta de módulo sem módulo, só para incluir uma pasta de plugins dentro e jogar o outro hack dentro do maketags.php do outro "módulo"

Já tentei algumas coisas, mas nenhuma funcionou, tipo:

Include_once XOOPS_ROOT_PATH."/modules/".$xoopsModule->dirname()."/plugins/maketags.php";

Include XOOPS_ROOT_PATH.'/modules/'.$GLOBALS.'/plugins/maketags.php';

$maketags = $GLOBALS["xoopsModule"];
Include_once XOOPS_ROOT_PATH."/modules/".$maketags->url."/plugins/maketags.php";

Outra coisa: no arquivo que gerencia o uso de ícones bbcode no formulario do XOOPS também tem uns hacks que eu queria carregar por include jogando eles para modules/*/plugins/bbcode.php só que aí parece ainda mais complicado, porque o lugar para colocar a informação das imagens está dentro de uma variável de uma função, portanto dentro de aspas "" (para detalhes, ver variável &ret na linha 133 do arquivo class/xoopsform/formdhtmltextarea.php)

Por estar dentro das aspas de uma variável, esse include eu ainda não consegui fazer funcionar nem por endereço direto, indicando o módulo exato.

Não sei se deu para explicar direito, mas será que dá para fazer essas 2 coisas usando include?

Luix  Iniciante   Postagens: 1

olá fábio,
Cara não sei o pode funcionar, mas agora tive uma ideia, não sei se funfa... mas vai lá.

Tenta fazer uma função guerreira, que busca todas as pastas dentro da pasta modules, e vai entrando nas subpastas e procurando pelos arquivos "metatags".

Pode utilizar o bom e velho opendir(), readdir() e is_dir()

Claro, não sei se o XOOPS já não tem essa função pronta, afinal no gerenciamento de módulos ele lê todos.

Nesse caso eu posso por ex. criar uma pasta de módulo sem módulo, só para incluir uma pasta de plugins dentro e jogar o outro hack dentro do maketags.php do outro "módulo"

Neste caso, não esquece de colocar os arquivos básicos para um módulo, apenas para disfarçar para o XOOPS, porque senão fica retornando aquele errinho chato no gerenciador de módulos.

Hehe, sei que não ajudou muito.

é isso

fbs777  Ocasional   Postagens: 22

luix, eu tentei o que você sugeriu mas não funcionou, não sei também se o jeito que fiz era o que você queria dizer.
O que fiz com essas 3 opções que você colocou foi tentar desses 3 jeitos:

Include_once XOOPS_ROOT_PATH."/modules/".$xoopsModule->opendir()."/plugins/maketags.php";

Include_once XOOPS_ROOT_PATH."/modules/".$xoopsModule->readdir()."/plugins/maketags.php";

Include_once XOOPS_ROOT_PATH."/modules/".$xoopsModule->is_dir()."/plugins/maketags.php";

Mas todos deram o mesmo erro com tela branca, apenas mudando o nome do *dir():

Fatal error: Call to a member function is_dir() on a non-object in /opt/lampp/htdocs/testes/xoops/header.php on line 126

Dependendo das coisas que tento, aparece esse erro de function, mas tem hora que tento algumas coisas que não aparece erro nenhum e o portal abre normal, o único "detalhe" é que a linha é completamente ignorada, como nesse caso:

Include XOOPS_ROOT_PATH.'/modules/'.$GLOBALS.'/plugins/maketags.php';

Luix  Iniciante   Postagens: 1

fábio,

A função que imaginei seria mais ou menos assim:

===== inicio do suposto código ====
Function incluiMetas {
$dir = opendir(XOOPS_ROOT_PATH."/modules");
While(($diretórios=readdir($dir)) !== false){
If($diretórios=="." or $arquivos=="..") continue; {

If(is_dir($diretórios)){
- fazer armazenar em um array só os diretórios.
- se quiser cortar caminho, pode armazenar na.
Array a linha do comando include inteira.
Mas prefiro fazer separado para poder.
Depurar... se a função funcionar, Hehe.
}
}
}

While( $arrayAnterior !== false ) {
Include_once XOOPS_ROOT_PATH."/modules/".$diretórioDentrodoArray."/plugins/maketags.php";
}
}

IncluiMetas();

==== fim do suposto código ====

Hehe, sou muito ruim mesmo, para fazer funcionar uma função dessa levaria horas.

Mas a ideia é por ai.

Quem sabe alguém salve o tópico, informando se existe esse função e quem sabe onde ela está.

é isso

fbs777  Ocasional   Postagens: 22

Vixi, aí complicou, ficou muito grande para entender

Já é a segunda vez que preciso de um esquema para colocar diretórios estilo "*" e não acho uma solução simples.

Da outra vez eu precisava de um esquema para carregar em um bloco a imagem "logo.gif" do tema, independente se tivesse no tema A ou no B.

na época a Gisa_Iagami ajudou com um código php:

if(!defined('XOOPS_ROOT_PATH')) exit();
$dirTema = $GLOBALS["xoTheme"];
Echo ' Logo';


Por isso eu tentei repetir o esquema agora, trocando "todos os temas" ( $GLOBALS["xoTheme"] ) por "todos os módulos" ( $GLOBALS["xoopsModule"] ), mas não funciona (e nem dá erro):

$maketags = $GLOBALS["xoopsModule"];
Include_once XOOPS_ROOT_PATH."/modules/".$maketags->url."/plugins/maketags.php";

Gislaine  Ocasional   Postagens: 36
<p>Lembra daquele desenho animado que tem uma frase <b>"E vamos nós"</b><br /><br />Bom pelo visto você está a tentar criar um <b>preload</b>, rs XOOPS excelente.<br /><br />Existem muitas formas de tomar nescau.<br /><br />- Você pode pegar o objeto xoopsmodule para isto.<br /><br />Ele já contém em seu array de objeto o nome de cada módulo e o diretório.<br /><br />- A outra forma é via comando em um script simples como o luisX falou. Eu tinha isto rodando no http://x20.www.xoops.net.br da mesma forma que tu precisa.<br /><br />Vou ver se acho ele, senão vamos fazer.<br />O caminho é este mesmo, tanto de um modo ou de outro. Claro que no XOOPS já existe isto, só precisamos é pegar o objeto correto.<br /><strong>Observação:</strong> Em tempo, em hipotese alguma pode existir o mesmo nome para o include. Apenas para avisar, o include de um arquivo só pode ser feito uma única vez. Esta rotina não poderá entrar em parafuso com outras existentes no core, por isto precisa pesquisa e testes de depuração.<br /><br />Independente da solução, vá usando o hack do Fernando chamado debug sarado para ir acompanhando as variaveis e objetos necessários no seu trabalho. Vale a pena e irá economizar um bom tempinho em depuração.</p>
fbs777  Ocasional   Postagens: 22

O caminho é este mesmo, tanto de um modo ou de outro. Claro que no XOOPS já existe isto, só precisamos é pegar o objeto correto.

Pois é, pelo que eu andei olhando em vários arquivos PHP do core, parece que é o $xoopsModule mesmo que define o módulo, mas simplesmente incluir ele no include não funcionou
Apesar que acho que você está falando de outra coisa, porque para mim $xoopsModule é uma variável não um objeto

ps: Em tempo, em hipotese alguma pode existir o mesmo nome para o include. Apenas para avisar, o include de um arquivo só pode ser feito uma única vez.

Eu pensei que isso era por causa do "_once" (uma vez) no include_once, por isso também tentei cada um dos vários testes que fiz tanto usando include_once como include apenas, para ver se estava aí o problema.
Se está aí ou não o problema eu não sei, só sei que com o include também não deu resultado

De qualquer maneira, então o caminho é fazer como o luix sugeriu, de buscar tipo modules/*/plugins/*.php assim não se repete o mesmo nome de arquivo, mas nesse caso então cada arquivo PHP de plugin seria obrigado a ter um nome diferente, tipo bbcode_xt.php, bbcode_news.php, bbcode_Fábio.php, etc.

Nesse caso seria interessante copiar o mesmo esquema para deixar no root do XOOPS uma pasta de plugins, assim não precisa ficar criando uma pasta de módulo só para incluir um plugin extra que não seja de um módulo específico, como no caso dos bbcodes de efeitos do tipo ajax.

Independente da solução, vá usando o hack do Fernando chamado debug sarado para ir acompanhando as variaveis e objetos necessários no seu trabalho.

Não sei não, mas acho que achei um portal bem útil, principalmente para quem realmente entende de php, o que não é o meu caso

Dá uma olhada nessas páginas:

[Functions]

[Classes]

[Variables]

Na página de variaveis, por exemplo, tem uma lista de todas as variaveis usadas pelo XOOPS, e clicando em uma delas, você vai para uma página que informa em qual arquivo PHP ela está e quais arquivos fazem referencia a ela.

O único ponto negativo é que essa enciclopedia toda é baseada no XOOPS 2.0.13.2

fbs777  Ocasional   Postagens: 22

Caramba esse portal que eu coloquei aí em cima é muito bom mesmo, agora que eu fui ver em detalhes e em poucos segundos que estou navegando nele agora, já achei o que precisava para chamar um módulo qualquer:

GetList($criteria = null, $dirname_as_key = false)

Baseado em outros códigos em outras páginas PHP do XOOPS, acho que tem um "::" para separar o nome da variável da função dela, então fica assim:

XoopsModule::getList($criteria = null, $dirname_as_key = false)

A parte de chamar qualquer módulo está feita, mas daí a isso funcionar como include é outra historia

Mas que fique registrado: esse portal que coloquei aí no outro post é uma tremenda mão na roda, excelente

Ha, no post acima faltou colocar o endereço para lista de constantes também:

[Constants]

Gislaine  Ocasional   Postagens: 36

Caramba Fábio, primeiro mundo XOOPS

Até conhecia o portal, mas não sabia que possuia esta documentação porreta.

Vomos tentar resolver isto na hora do almoço sem falta.

- Objetivos.

A) Função para pegar nomes e diretórios de módulos.
B) Identificar se contém o diretório [pergunta] dentro do módulo.
C) Se existe o diretório, veja se existe o arquivo [pergunta]
D) Existindo, executa o include_once deste arquivo chamado [pergunta]

Onde você vê a interrogação seria o padrão combinado. Para se ter certeza que os devs irão fazer a coisa certa, precisamos de um padrão.

Observação: O que esta função irá fazer [pergunta]

Apenas carregar os arquivos PHP destes diretório e deixar disponivel alguns detalhes que eles possuirem. Poderá fazer o extend de classes aumentando o suporte a determinados itens do XOOPS para o módulo em especial.

Esta proposta tem por caracteristica o aproveitamento de recursos de outros módulos.

Observação: Minha observação pessoal.

Desta forma gera uma dependencia entre módulos em especial e isto será tratado por cada módulo. Se os recursos EXTRAS são imperdivéis, o correto seria ter um Framework e dentro dele incluir estas caracteristicasMas vamos ver como será este comportamento.

[Editado]

Ps2: Se a ideia for com estas cargas e extensões de plugins dar suporte a compatibilidade a módulos para outras versões de XOOPS , code-plus, xoopscube, etc..., talvez possa gerar conflito com outros módulos e mesmo o kernel.

Para este caso também um módulo unificado que implementa esta compatibilidade como é o caso do Legacy do cube seria o ideal. Alias, é uma ótima ideia. XOOPS

Gislaine  Ocasional   Postagens: 36

Contribuição final Claudia

Este teste deve ser realizado em uma página a parte para se averiguar o funcionamento. A ideia para se acompanhar é que salve este script com um nome por exemplo teste.php

Ele roda independente e será adaptado na rotina onde desejar.
Texto comentado abaixo para entendimento.

As tags PHP estão de forma errada com espaço para permitir a sua utilização aqui no fórum.


< ? php
// Incluindo o arquivo principal do XOOPS para controle geral das páginas.
// Se já estiver dentro do ambiente XOOPS, não será necessária, mas para uma página em separado, isto seria obrigatório.

include '..\..\mainfile.php';

// Ai está a inclusão que deverá carregar os cabeçalhos da página.
// O carregamento dos objetos será feito aqui também.
// Também se já estiver em ambiente XOOPS, esta linha não é necessária.

include XOOPS_ROOT_PATH.'/header.php';

//Olha o objeto necessário para as cargas dos módulos.

//include_once XOOPS_ROOT_PATH."/class/xoopsmodule.php";

// variável objeto dos módulos.

$module_handler =& xoops_gethandler('module');

// A carga da listagem de módulos.

$modules =& $module_handler->getList(null,1);

// Uma var-dump para mostrar os módulos, só para acompanhamento.

var_dump($modules);

// Vamos rodar o var modules para pegar os valores e executar o que desejamos.

foreach($modules as $key => $value ){
$fileinc=XOOPS_ROOT_PATH."/modules/$key/plugins/maketags.php";

// Está sendo verificado se possuimos o arquivo maketags no diretório do módulo.

if(file_exists($fileinc)){
Include_once($fileinc);
Echo "
Arquivo incluido corretamente ".$fileinc;
}else{
Echo "
Arquivo não incluso, porque não encontrou ".$fileinc;
}

}

// inclusão apenas para se o teste for em uma página fora do XOOPS independente.

include XOOPS_ROOT_PATH.'/footer.php';
? >


Abraços e obrigado Claudia, primeiro mundo. XOOPS

fbs777  Ocasional   Postagens: 22

Caramba, funcionou

Consegui retirar do núcleo o hack de smartytags do rw-banner e os dois hacks de bbcodes, um do próprio rw-banner e outro para thumbs usando o Lightbox

No lugar dos hacks coloquei apenas um include para bbcodes e outro para tags.

Só ficou faltando uma coisa que ainda não consegui: colocar um include para retirar do núcleo os hacks feitos no editor DHTML do XOOPS para incluir os ícones de botão para novos bbcodes, para não precisar incluir os bbcodes manualmente.
O problema é que o include nessa parte precisa ficar exatamente em um lugar, para poder aparecer no lugar certo na página.

O código original que regula os ícones da 1ª fileira do XOOPS editor é esse (linha 133 do class/xoopsform/formdhtmltextarea.php):

$ret = "url email imgsrc code quote

\n";


Isso quer dizer que está tudo dentro de $ret = ""; e é antes do fim (
\n"; ) que o include deve entrar, mas mesmo usando echo dá pau depois.
Ficou assim com o include:
$ret = "url email imgsrc code quote

'echo include XOOPS_ROOT_PATH.\""/plugins/xoopseditor_icons.php;"\"'

\n";

O arquivo que ele vai buscar ficou assim:
// ícone de imagem thumb no editor xoops.
Echo " imgthumbsrc "
//fim.

// frame do Imageshack.
Echo "
<iframe src='http://imageshack.us/iframe.php?txtcolor=111111&type=blank&size=30' scrolling='no' allowtransparency='true' frameborder='0' width='280' height='70'>Update your browser for ImageShack.us!//fim do frame.
*?>


Então dá esse erro:
Parse error: syntax error, unexpected T_ECHO, expecting ',' or ';' in /opt/lampp/htdocs/testes/xoops/plugins/xoopseditor_icons.php on line 7

O que significa que o include chega a funcionar, mas aí o conteúdo do xoopseditor_icons.php (plugin) não entra em acordo com alguma coisa, fica pedindo uma virgula ou ponto-e-virgula no lugar do echo.

Só falta essa questão para fechar a questão do bbcode. Os hacks de códigos bbcodes já funcionam pelo plugin, só falta os ícones bbcodes do xoopseditor

Ha, olhando o "módulo de módulos" happy_linux do Ken Ohwada achei um arquivo (functions.php) que é um framework para pegar módulos, então acho que dava para ter usado o mesmo esquema dele também, caso a Claudia não tivesse colocado esse modo aí

fbs777  Ocasional   Postagens: 22

O que eu vou tentar fazer agora é criar um "módulo" estilo o happy_linux do Ken Ohwada, para ver se consigo implementar os plugins sem precisar hackear o cabeçalho.php também, para, como módulo, ativar automaticamente o arquivo que chama os plugins, aí teria só que hackear o loal onde é inserido os include para chamar os plugins.

Mas ainda não consegui fazer funcionar direito o include que vai dentro das aspas da variável como disse no post acima.

fbs777  Ocasional   Postagens: 22

Contribuição final Claudia.

Este teste deve ser realizado em uma página a parte para se averiguar o funcionamento. A ideia para se acompanhar é que salve este script com um nome por exemplo teste.php

Ele roda independente e será adaptado na rotina onde desejar.

Bom, depois da euforia e dizer que tinha funcionado, acho que voltei a estaca zero... Parece que não deu mesmo para utilizar aquele arquivo PHP da claudia.

Só estava funcionando porque eu tinha esquecido de tirar as referencias diretas aos arquivos.

O problema é que o script até funciona para listar os arquivos modules/*/plugins/bbcodes.php, por exemplo, mas para carregar os arquivos bbcodes.php através desse script, não funciona (pelo menos não consegui depois de várias tentativas).

O que fiz: onde ia o hack original, eu coloquei um include para buscar o arquivo teste.php (da claudia). Este, deveria buscar todos os modules/*/plugins/bbcodes.php e interpretar o conteudo de cada um, mas parece que não faz isso na prática, apesar de ele ter um include dentro que seria para isso.

A ideia era seria tipo:

Lugar original do hack: {include para o teste.php { include para cada modules/*/plugins/bbcodes.php} }

Ou seja, no lugar onde tem que incluir os hacks de bbcodes, eu incluiria apenas o teste.php, que por sua vez iria buscar todos bbcodes.php

Por enquanto o máximo que deu para fazer foi criar um módulo (de módulo mesmo só o xoops_version.php) com os pacotes de efeitos tipo AJAX e chamar diretamente os plugins desse módulo apenas, indicando o nome do módulo no include.

Agora vou dar uma olhada no happy_linux para ver se dá para pegar algum esquema dele.

Gislaine  Ocasional   Postagens: 36

incluído no RoadMap da versão by XOOPS XOOPS, CodNome=PreCarga.

Diferente do preload do XC que demanda uma delegação, o precarga irá servir para complementar e dar consistencia a variadas necessidades de extensões.

Não deixe de continuar relatando features interessantes que gostaria de ver incluidas no XOOPS completando funções existentes como esta solicitada pelo Fábio.

  Pesquisa avançada






Entrada

Codinome:


Senha:





Perdeu a senha?  |Cadastre-se!


Quem nos visita
Há 26 visitantes neste momento... (14 na seção Fóruns)

Associados: 0
Anônimos: 26

outros...

Banner XOOPS Cube