Como faço para impedir que o Joomla inclua o jQuery?
Pergunta
Atualizei recentemente do Joomla 3.2.1 para o Joomla 3.2.2.
No Joomla 3.2.1, desativei manualmente a inclusão do jQuery:
$doc = JFactory::getDocument();
$dontInclude = array(
'/media/jui/js/jquery.js',
'/media/jui/js/jquery.min.js',
'/media/jui/js/jquery-noconflict.js',
'/media/jui/js/jquery-migrate.js',
'/media/jui/js/jquery-migrate.min.js',
'/media/jui/js/bootstrap.js',
'/media/system/js/core-uncompressed.js',
'/media/system/js/tabs-state.js',
'/media/system/js/core.js',
'/media/system/js/mootools-core.js',
'/media/system/js/mootools-core-uncompressed.js',
);
foreach($doc->_scripts as $key => $script){
if(in_array($key, $dontInclude)){
unset($doc->_scripts[$key]);
}
}
Mas isso não está funcionando no Joomla 3.2.2.Existe uma maneira de não incluir o jQuery do Joomla no 3.2.2?
Solução 3
Eu já adicionei:
$doNotInclude = array(
'jquery',
'bootstrap',
'behavior',
);
if(in_array($file, $doNotInclude)){
return;
}
imediatamente depois:
list($key, $prefix, $file, $func) = static::extract($key);
em bibliotecas/cms/html/html.php, na função "_".
Não gosto disso, pois é uma modificação do núcleo do Joomla, mas funciona.Ainda estou procurando uma solução melhor.
Outras dicas
Outra variação que funciona bem para mim com o Joomla 3.4 é editar o arquivo template > index.php com algo como:
$doc = JFactory::getDocument();
$headData = $doc->getHeadData();
$scripts = $headData['scripts'];
//scripts to remove, customise as required
unset($scripts[JUri::root(true) . '/media/system/js/mootools-core.js']);
unset($scripts[JUri::root(true) . '/media/system/js/mootools-more.js']);
unset($scripts[JUri::root(true) . '/media/system/js/core.js']);
unset($scripts[JUri::root(true) . '/media/system/js/modal.js']);
unset($scripts[JUri::root(true) . '/media/system/js/caption.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/jquery.min.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/jquery-noconflict.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/bootstrap.min.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/jquery-migrate.min.js']);
$headData['scripts'] = $scripts;
$doc->setHeadData($headData);
Você precisa adicionar um prefixo de JUri::root(true)
antes de cada um desses nomes de arquivo - caminhos relativos não funcionarão
Você também pode tentar algo assim:
$removeScripts = [
'/media/jui/js/jquery.min.js',
'/media/jui/js/jquery-noconflict.js',
'/media/jui/js/jquery-migrate.min.js',
'/media/system/js/caption.js',
];
foreach ($removeScripts as $removeScript) {
unset($this->_scripts[JURI::root(true).$removeScript]);
}
O problema é com o seu in_array
.
Se você removê-lo alterando isto:
foreach($doc->_scripts as $key => $script){
if(in_array($key, $dontInclude)){
unset($doc->_scripts[$key]);
}
}
para isso:
foreach($doc->_scripts as $key => $script){
unset($doc->_scripts[$key]);
}
Então funciona bem.É inútil verificar se a chave do array existe, pois percebi que você não excluiu manualmente nenhum desses arquivos.
Espero que isto ajude
Joomla 3.3.6 carrega scripts de maneira diferente, então $doc->_scripts não retornará nada...então não há nada para desmarcar.
Eu recomendo usar este plugin: https://github.com/Poznakomlus/joomla_options
Ele permite remover bootstrap, jQuery e mootools (você pode escolher o que desabilitar).
Isenção de responsabilidade:Não sou afiliado de forma alguma ao desenvolvedor do plugin ou ao próprio plugin.
Se você estiver escrevendo um modelo personalizado ou um componente, onde você precisa remover todos os scripts carregados por padrão dentro do Joomla, você pode criar um plugin simples e vincular a execução ao onBeforeCompileHead
evento.
Minha implementação foi como abaixo.É muito simples.Você pode brincar ainda mais com a lista de pesquisa, especificando os nomes dos arquivos ou simplesmente colocando a pasta pai na lista negra.
protected $app;
public function onBeforeCompileHead() {
// Front end
if ($this->app instanceof JApplicationSite) {
$doc = JFactory::getDocument();
$search = array(
'jui/js/',
'system/js/'
);
foreach ($doc->_scripts as $key => $script) {
foreach ($search as $findme) {
if (stristr($key, $findme) !== false) {
unset($doc->_scripts[$key]);
}
}
}
}
}