Como adaptar MODs? Temas diferentes do "Default", linguagens que não o "EN"

Started by margarett, April 11, 2007, 10:51:16 AM

Previous topic - Next topic

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:
QuoteScript 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
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:
No ficheiro $boarddir/index.php
Encontrar:

'trackip' => array('Profile.php', 'trackIP'),



Adicione depois:


'admod' => array('Ads.php', 'Ads'),




Encontrar:

require_once($sourcedir . '/Security.php');

.......................................

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...
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);
}


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
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair

Apllicmz




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


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 ;)
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair

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"
<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>
....................................................

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:

<operation>
<search position="before"><![CDATA[ 'trackip' => array('Profile.php', 'trackIP'),]]></search>
<add><![CDATA[
'admod' => array('Ads.php', 'Ads'),]]></add>
</operation>

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:
<search position="before"><![CDATA[ 'trackip' => array('Profile.php', 'trackIP'),]]></search>
<add><![CDATA[
'admod' => array('Ads.php', 'Ads'),]]></add>

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)

<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>


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.
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair

margarett

Finalmente, vamos aos MODs escritos antes do novo formato em XML. Nestes MODs, ao tentar carregá-los no "parser", vão com toda a certeza receber um (ou vários) "parse error". Porquê? Simples, o "parser" foi escrito a pensar no novo formato, e a linguagem que encontra não tem nada a ver com aquilo que ele entende...

Estes MODs são um bocado mais chatos, porque as alterações não são todas no mesmo ficheiro...
Para este exemplo vamos precisar de outro MOD, porque o anterior é compatível com a nova versão e como tal não tem ficheiros ".mod". Vamos usar para este exemplo o "members color link" (um que também é muito requisitado):
http://custom.simplemachines.org/mods/index.php?mod=111
(usar a nova versão como é natural)

Abrindo o ficheiro do MOD encontramos lá uma série de ficheiros ".mod" e também alguns ".xml".
Ora bem... Os ficheiros ".xml", como o nome indica, são os que dizem respeito à linguagem. Neste exemplo, não tem PT (normalmente não tem), portanto temos de pegar no EN "MemberColorLinkEnglish.xml"
Comecemos já pela linguagem então:
<file name="$languagedir/Modifications.english.php">
<operation>
<search position="after"><![CDATA[?>]]></search>
.........................................................

Note-se que esta alteração é feita pelo MOD, não temos de a fazer. Mas precisamos de adaptar à nossa linguagem.
É fácil de ver quais os ficheiro de linguagem afectados. O que precisamos de fazer é fazer o que o MOD pede no ficheiro "Themes/default/languages/Modifications.portuguese.php". Vamos a isso!
Encontrar "?>" Fácil, é o fim do ficheiro.
Adicionar as tags de texto indicadas. Como aprendemos no exemplo anterior, a posição do "search" nos ficheiros "xml" é a relativa em relação ao texto encontrado. Portanto, se dizia "search after", é porque o texto encontrado deve ficar depois do texto que vamos inserir
Fim da tag adicinar (</add>), fim da operação com </operation>, e fim do ficheiro com </file>. E fim da modificação também com </modification>.
Claro que nesta altura devemos traduzir para PT. No entanto, o importante é que o MOD tenha acesso aos textos necessários. E isso fica feito aqui.

De seguida, às alterações ao tema! Antes de mais, procuramos o ficheiro ".mod". Chatice, tem uma série deles :P
É fácil de ver, cada ficheiro diz respeito a uma versão do SMF, a nós vai interessar-nos o "MemberColorLink1.1.x.mod".
Vamos então tentar perceber esta sintaxe (é mais simples que o XML).
<edit file>
$sourcedir/ModSettings.php
</edit file>

Fácil, a tag "edit file" diz-nos qual o ficheiro e editar. Neste caso não vamos mexer no ficheiro "ModSettings.php" porque não é um ficheiro do tema!!!
Todas as acções seguintes serão sempre em respeito ao ficheiro indicado na tag "edit file", até que apareça uma nova tag "edit file" (ou quando acabar o ficheiro, naturalmente)
Vamos procurar um:
<edit file>
$boarddir/Themes/default/Calendar.template.php
</edit file>

É um ficheiro de tema, mas que o meu tema não tem. Como não tem, é porque usa o do default. O do default é alterado pelo MOD, por isso não tenho de mexer! Outros temas poderão ter.

<edit file>
$boarddir/Themes/default/BoardIndex.template.php
</edit file>

OK, este ficheiro todos os temas têm. vamos então ver o que fazer dentro deste ficheiro:

<search for>
<a href="', $scripturl, '?action=profile;u=', $member['id'], '">', $member['is_today'] ? '<b>' : '', $member['name'], $member['is_today'] ? '</b>' : '', isset($member['age']) ? ' (' . $member['age'] . ')' : '', '</a>', $member['is_last'] ? '<br />' : ', ';
</search for>

<replace>
<a href="', $scripturl, '?action=profile;u=', $member['id'], '">', (!empty($member['color']) ? '<span style="color:'.$member['color'].';">' : ''), $member['name'], isset($member['age']) ? ' (' . $member['age'] . ')' : '', (!empty($member['color']) ? '</span>' : ''), '</a>', $member['is_last'] ? '' : ', ';
</replace>

Fácil de perceber? Procura, substitui, procura, substitui. Cada acção é também delineada por tags.
<search for> abre a pesquisa, </search for> fecha a pesquisa
<replace>o texto a substituir o pesquisado, </replace> fim do texto
No caso de adicionar texo, a posição é dada pela tag <add> </add>.
<add after> adiciona depois do texto encontrado
<add before> adiciona antes do texto encontrado

No meu tema:

E substituo pelo indicado, e fica assim:


Salvar, e fazer upload para o servidor. Não esquecer backups!!!!
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair


margarett

Obg ;)

Fiz mais algumas alterações. Estamos sempre a aprender, e eu a fazer este guia fartei-me de aprender ;)
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair

Antoinetta


margarett

Pedia que não usassem este tópico para tirar duvidas vossas relacionadas com os vossos fóruns... Usem-no para esclarecer o tuturial...
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair

GTC

Boas!!!

nao consegui tirar essa MOD de forma nenhuma ... seria possivel colocar aki um link directo para fazer o download???

thanks

um abraço

GhoXt

bom guia margarett :), eu pedia era que reupasses o parser visto que o link em cima ja era
obrigado

margarett

O parser não é meu. E sim, é pena porque já está em baixo há algum tempo...

Encontrei no entanto outra localização alternativa no "smfhacks"

http://www.smfhacks.com/packageparser/package.php?lang=portuguese
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair

GhoXt

many many thkz o parser ja me evitou andar as cabeçadas com as mods

Lord Zeus


aglioeolio



bruno.cunha

Viva
Ao usar o parser no mod Blobal Announcements deu-me este erro, ou é suposto dar?

Quote
ERROR: The package-info.xml file is invalid!

Debugging Information
Error message: String could not be parsed as XML
Source: /home/groups/modparser/htdocs/index.php:133
Errors encountered while parsing XML file:

   1. Entity: line 5: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xFC 0x72 0x6B 0xE7
   2. <name>Users Online Today T�rk�e Yamas�</name>
   3. ^

Stack Trace:
#0 /home/groups/modparser/htdocs/index.php(133): SimpleXMLElement->__construct('<?xml version="...')
#1 /home/groups/modparser/htdocs/index.php(94): parsePackageInfoXML('/tmp/smf_xml/pa...', 'install', 'all')
#2 /home/groups/modparser/htdocs/index.php(735): parseArchive('/tmp/phpGnTZui', 'install', 'all')
#3 {main}

XML File:

<?xml version="1.0"?>
<!DOCTYPE package-info SYSTEM "http://www.simplemachines.org/xml/package-info">
<package-info xmlns="http://www.simplemachines.org/xml/package-info" xmlns:smf="http://www.simplemachines.org/">
        <id>alperuzi:UsersOnlineTodayModTR</id>
     <name>Users Online Today T�rk�e Yamas�</name>
     <version>1.4.0b3</version>
     <type>modification</type>
     <install>
       
                <readme type="inline">Users Online Today Mod (ver. 1.4.0b3) T�rk�e Yamas�. Modun kurulmu� oldu�undan emin olun!</readme>
                <modification>modification.xml</modification>               
        </install>
        <uninstall>
                <readme type="inline">alperuzi taraf�ndan haz�rlanm�� olan bu modifikasyonu denedi�iniz i�in te�ekk�rler!</readme>
                <modification reverse="true">modification.xml</modification>
</uninstall>
</package-info>

Open your mind

Baixar Downloads

oloco que complicação no IPB é so por um simples codigo no footer

<--- D22 Shoutbox --->

Baixar Downloads

mais uma, eu quero por shoutbox em outro tema
se eu desinstalar ela e depois instalar denovo já com outro tema de defalt

ela irá aparecer nesse outro tema defalt, ou terei que fazer este processo ai em cima

margarett

O tema default é aquele que se chama mesmo "default" ou "SMF default theme".

Não tem nada a ver com o tema que tu podes escolher como "por defeito" para todo o fórum/users
Se forem conduzir, não bebam. Se forem beber... CHAMEM-ME!!!! :D

QuoteOver 90% of all computer problems can be traced back to the interface between the keyboard and the chair

Advertisement: