SMF Support > Modificações (Mods)
Como adaptar MODs? Temas diferentes do "Default", linguagens que não o "EN"
margarett:
Fica aqui um pequeno tutorial sobre como adaptar os MODs à nossa linguagem e aos nossos temas "custom". Peço ao Ivo que o fixe para ficar visível...
Antes de mais:
Os exemplos que vou dar foram baseados no tema que EU uso no meu fórum. Algumas coisas poderão ser diferentes de tema para tema, mas o "sumo" está cá. Quem pretenda administrar um fórum tem de ser capaz de entender e adaptar. Não é preciso ser programador de php (eu não sou) mas tem de se ter um minimo de conhecimento da estrutura que o SMF usa na sua programação. Esse conhecimento adquire-se mexendo. Foi assim que aprendi o pouco que sei.
Não vou também tecer comentários sobre clientes e transferencias de FTP, nem sobre o programa que vão usar para editar os ficheiros. Isso é com cada um.
Chega de conversa, vamos a isto.
Versão do SMF: 1.1.2
Tema: Musiconia
MOD exemplo: Ad Management mod
Note-se que eu não uso este MOD (aliás, não uso nenhum), e serve isto apenas como exemplo.
Antes de iniciar estas alterações, parte-se do princípio que o MOD já foi instalado pelo Gestor de Pacotes (Package Manager). Nesta fase, se mudarem o vosso tema para o "Default" e a linguagem do fórum para EN, o vosso MOD estará disponível e a trabalhar bem.
Para ajudar a instalar QUALQUER MOD, um dos membros da equipa do SMF, daniel15, criou o "SMF MOD Parser". É uma ferramenta que pega no "pacote" do MOD, analiza o ficheiro .xml que contém as modificações, e as expõe de uma forma bastante acessível ao "comum dos mortais". São portanto mostradas as alterações que aquele pacote vai fazer ao tema "default" e à lingua EN. Basta-nos depois adaptar.
A ferramenta está acessível aqui:
http://modparser.dev.dansoftaustralia.net/index.php?lang=portuguese (a tradução tuga foi feita por mim)
edit: O Parser está agora inserido directamente na página do MOD. Encontram os "Manual Install Instructions" do lado direito da janela.
Peguemos então no ficheiro do MOD e dizemos que queremos "instalar":
edit: se der alguns erros no "parser", as edições têm de ser procuradas "manualmente". A ferramenta é "beta", e nem todos os MODs estão escritos de forma complatamente compatível. Neste caso, o guia está alguns posts abaixo.
O "parser" vai mostrar-nos as alterações. Apesar de ele mostrar todas as alterações, apenas nos interessam as que dizem respeito ao template, e às linguagens. Não vou estar a indicar nada disso, é fácil de ver onde elas se encontram (repito, quem queira administrar um fórum, tem de ser capaz de interpretar este tipo de coisas...)
Este até nem é o melhor exemplo, porque não mexe nos ficheiros de linguagem, mas adiciona um novo...
Encontramos no inicio, a lista de ficheiros que vão ser copiados:
--- Quote ---Script PHP a executar: install.php
Ficheiros instalados
* Ads.php será copiado para $sourcedir
* LoadAds.php será copiado para $sourcedir
* Ads.template.php será copiado para $themedir
* Ads.english.php será copiado para $languagedir
--- End quote ---
Interessa-nos o "Ads.english.php" que será colocado na pasta dos ficheiros de linguagem. Depois da instalação do MOD, teremos então que COPIAR esse ficheiro, renomeando para "Ads.portuguese.php". Se quisermos, podemos traduzir o conteudo. Nos MODs que tragam "linguagem para o fórum", onde há interacção com os utilizadores, devemos fazê-lo para não ter meio EN, meio PT.
De seguida, às alterações no tema! O parser diz-nos:
--- Code: ---No ficheiro $boarddir/index.php
Encontrar:
'trackip' => array('Profile.php', 'trackIP'),
Adicione depois:
'admod' => array('Ads.php', 'Ads'),
Encontrar:
require_once($sourcedir . '/Security.php');
.......................................
--- End code ---
Este é um exemplo do que NÃO SE DEVE MEXER!!! Não faz referencia a "$themedir" não é para mexer!!! Destes ficheiros o MOD trata sozinho
Agora mais a sério...
--- Code: ---Encontrar:
<body>';
Adicione depois:
//Display ads on the top of the page
if (function_exists("show_topofpageAds"))
{
$ads = show_topofpageAds();
if(!empty($ads))
if($ads['type']==0)
echo $ads['content'];
else
eval($ads['content']);
unset($ads);
}
--- End code ---
No meu index.template.php vou encontrar "<body>';"
E vou fazer o que o parser me pede... Adicionar o código a seguir. E o resultado é este:
Depois basta fazer as alterações seguintes. No final, gravar o ficheiro, e enviá-lo para o servidor, tendo o cuidado de fazer um backup antes!!!
No final de todas as edições, e se tudo correu bem, teremos o nosso MOD fresquinho e pronto a usar! :D
Joomlamz:
Muito bom
Acho devia haver mais coisas como estas
Paracelsus:
Antes de mais, parabéns pelo bom trabalho! :)
Agora a dúvida:
--- Quote from: margarett on April 11, 2007, 10:51:16 AM ---
Este é um exemplo do que NÃO SE DEVE MEXER!!! Não faz referencia a "$themedir" não é para mexer!!! Destes ficheiros o MOD trata sozinho
--- End quote ---
Quando dizes isto, significa que devemos instalamos o MOD usando o Package Manager como se o estivéssemos a instalar no default e depois fazer as alteracões apenas relativas a um tema "custom" para que o MOD funcione nesse tema? É que essa primeira parte do MOD tratar disso sozinho não ficou muito clara...
margarett:
Isto refere-se a adaptar um MOD para trabalhar com o nosso tema "custom" e com a nossa linguagem.
A primeira coisa a fazer é SEMPRE instalar o MOD pelo package manager. Depois fazer as adaptações necessárias.
Já editei o post original para colocar essa nota ;)
margarett:
Esta "segunda parte" do guia serve para os casos em que o "parser" dá erro. Se isto acontecer, aquela forma mais simplificada deixa de estar disponível. Mas, não desesperemos! A forma mais "manual" é igualmente acessível!
Usando o exemplo do mesmo MOD acima, procuramos o ficheiro de extensão ".mod"
Que este MOD não tem :P Não tem porque os MODs, recentemente, passaram a ser desenvolvidos tendo por base a linguagem .xml, enquanto antes eram desenvolvidos numa sintaxe diferente, explanada num ficheiro ".mod".
Portanto, e indo ao assunto. No caso deste MOD, que não tem ficheiro ".mod", procuramos um ficheiro "install.xml", "modification.xml", "nomedomod.xml", etc... Temos um "install.xml"
--- Code: ---<modification xmlns="http://www.simplemachines.org/xml/modification" xmlns:smf="http://www.simplemachines.org/">
<id>jeremy:ads</id>
<version>2.3</version>
<file name="$boarddir/index.php">
<operation>
<search position="before"><![CDATA[ 'trackip' => array('Profile.php', 'trackIP'),]]></search>
<add><![CDATA[
'admod' => array('Ads.php', 'Ads'),]]></add>
</operation>
<operation>
<search position="before"><![CDATA[require_once($sourcedir . '/Security.php');]]></search>
<add><![CDATA[
if (file_exists($sourcedir . '/LoadAds.php'))
require_once($sourcedir . '/LoadAds.php');]]></add>
</operation>
<operation>
<search position="before"><![CDATA[ loadPermissions();]]></search>
<add><![CDATA[
// Load all the ads up
if (function_exists("loadAds"))
loadAds();
]]></add>
</operation>
....................................................
--- End code ---
MEDO!!!! :D
Que nada, é bastante simples. Não querendo fazer nenhum tutorial sobre XML (até porque não percebo nada disso :P ) só precisamos de saber que as acções são definidas por tags, tal e qual como as tags de html. Por exemplo, todas as operações dentro de um ficheiro estão delimitadas por uma tag desta forma:
<file name="$boarddir/index.php"> --> inicio da operação num ficheiro, e qual é esse ficheiro
</file> --> fim da tag "file", significa que as alterações a este ficheiro estão concluidas
Outro exemplo:
--- Code: ---<operation>
<search position="before"><![CDATA[ 'trackip' => array('Profile.php', 'trackIP'),]]></search>
<add><![CDATA[
'admod' => array('Ads.php', 'Ads'),]]></add>
</operation>
--- End code ---
Aqui temos 3 tags juntas.
Primeiro temos a tag "operation" que nos diz que vamos executar uma operação. <operation>
O primeiro passo da operação é procurar alguma coisa, em que posição: <search>search blablabla</search> IMPORTANTE: Encontra-se sempre aquele <![CDATA[ na string de pesquisa. Este campo deve ser ignorado! (o CDATA serve para garantir que aquele texto lá no meio não é interpretado como código de operação do MOD, mas sim como "texto"). O que se deve procurar é o texto a seguir ao <![CDATA[ e antes dos ]]>. Neste caso: 'trackip' => array('Profile.php', 'trackIP'),
O segundo passo é adicinar qualquer coisa: <add> etc e tal </add> Tamb+em aqui se encontra o texto entre a tag CDATA. tal como no search, o texto a adicionar é o que está entre "<![CDATA[" e "]]>"
Finalizamos esta operação: </operation>
Uma nota em relação ao "search": no caso do "xml", a posição em que pesquisa não é a posição em que vamos adicionar o código, mas sim a posição do texto encontrado em relação ao texto a inserir. Neste exemplo temos:
--- Code: ---<search position="before"><![CDATA[ 'trackip' => array('Profile.php', 'trackIP'),]]></search>
<add><![CDATA[
'admod' => array('Ads.php', 'Ads'),]]></add>
--- End code ---
Olhando rápidamente, iríamos adicionar o texto " 'admod' => array('Ads.php', 'Ads'), "
antes do texto encontrado " 'trackip' => array('Profile.php', " uma vez que o search indicava "before".
Não é assim. O que a posição do search indica é a posição relativa do texto encontrado em relação ao texto que se vai inserir. Neste caso, "before" indica que o texto encontrado vai ficar "antes" do texto a inserir. Consequentemente, é para inserir depois.
São estas as hipóteses do "search":
before: o texto encontrado fica antes do texto a inserir. Ou seja, "add" à frente do encontrado
after: o texto encontrado fica depois do texto a inserir. Ou seja "add" atrás do encontrado
replace: substitui o texto encontrado
end: no fim do ficheiro
E assim finalizamos o mini-tutorial de aprender a olhar para o ficheiro ".xml". Vamos então ao exemplo prático!
Mais uma vez, apenas precisamos dos ficheiros que dizem respeito aos TEMAS!!! Como saber quais são esses?
<file name="$themedir/ficheiroemquestão"> Fácil, não é?
O "install.xml" pede-me o seguinte (index.template.php)
--- Code: --- <operation>
<search position="before"><![CDATA[<body>';]]></search>
<add><![CDATA[
//Display ads on the top of the page
if (function_exists("show_topofpageAds"))
{
$ads = show_topofpageAds();
if(!empty($ads))
if($ads['type']==0)
echo $ads['content'];
else
eval($ads['content']);
unset($ads);
}
]]>
</add>
</operation>
--- End code ---
Para os mais distraídos, esta é exactamente a mesma alteração que exemplifiquei acima. A unica coisa que mudou foi a forma de encontrar as alterações necessárias.
Navigation
[0] Message Index
[#] Next page
Go to full version