Problema con Mod Hide Tag Special (SMF2)

Aperto da Marco Di Lenardo, Venerdì - 25 Aprile 2014 - 23:26

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

Marco Di Lenardo

Vado ad installare la mod in oggetto e mi da  test fallito in subs.php

in pratica dovrei cercare

static $disabled;

e aggiungere prima:


// On the first Parsing i will gernerate all things i need ;) after that it's not needable :)
if (!isset($modSettings['hide_preparedOption']))
{
// First there is nothing in it ;)
$modSettings['hide_preparedOption']['hiddentext'] = ' ';
$modSettings['hide_preparedOption']['unhiddentext'] = ' ';

if (empty($modSettings['hide_noinfoforguests']) || !$user_info['is_guest'])
{
// Prepare the hidden information :)
$modSettings['hide_preparedOption']['hiddentext'] = isset($modSettings['hide_hiddentext']) ? $modSettings['hide_hiddentext'] : '';
$modSettings['hide_preparedOption']['hiddentext'] = str_replace('$language', $user_info['language'], $modSettings['hide_preparedOption']['hiddentext']);
if (!empty($modSettings['hide_MUIswitch']) && isset($txt['hide_hiddentext']))
$modSettings['hide_preparedOption']['hiddentext'] = str_replace('$txtvariable', $txt['hide_hiddentext'], $modSettings['hide_preparedOption']['hiddentext']);
if (!empty($modSettings['hide_enableHTML']))
$modSettings['hide_preparedOption']['hiddentext'] = un_htmlspecialchars($modSettings['hide_preparedOption']['hiddentext']);

// Prepare the unhidden infomation?
if (!empty($modSettings['hide_enableUnhiddenText']))
{
$modSettings['hide_preparedOption']['unhiddentext'] = isset($modSettings['hide_unhiddentext']) ? $modSettings['hide_unhiddentext'] : '';
$modSettings['hide_preparedOption']['unhiddentext'] = str_replace('$language', $user_info['language'], $modSettings['hide_preparedOption']['unhiddentext']);
if (!empty($modSettings['hide_MUIswitch']) && isset($txt['hide_unhiddentext']))
$modSettings['hide_preparedOption']['unhiddentext'] = str_replace('$txtvariable', $txt['hide_unhiddentext'], $modSettings['hide_preparedOption']['unhiddentext']);
if (!empty($modSettings['hide_enableHTML']))
$modSettings['hide_preparedOption']['unhiddentext'] = un_htmlspecialchars($modSettings['hide_preparedOption']['unhiddentext']);
}
}

// So prepare the unhidden Option for the Parser ;)
if (!empty($modSettings['hide_useSpanTag']))
{
$modSettings['hide_preparedOption']['before_info'] = '<span class="hiddencontent">';
$modSettings['hide_preparedOption']['after_info'] = '</span>';
}
else
{
$modSettings['hide_preparedOption']['before_info'] = '<div class="hiddencontent">';
$modSettings['hide_preparedOption']['after_info'] = '</div>';
}

// Okay Let's see where i must put the unhidden Informations :)
if (!empty($modSettings['hide_enableUnhiddenText']) && empty($modSettings['hide_onlyonetimeinfo']))
{
if (empty($modSettings['hide_posUnhiddenText']) || $modSettings['hide_posUnhiddenText'] == 4)
$modSettings['hide_preparedOption']['after_info'] .= $modSettings['hide_preparedOption']['unhiddentext'];
elseif ($modSettings['hide_posUnhiddenText'] == 3)
$modSettings['hide_preparedOption']['after_info'] = $modSettings['hide_preparedOption']['unhiddentext'].$modSettings['hide_preparedOption']['after_info'];
elseif ($modSettings['hide_posUnhiddenText'] == 2)
$modSettings['hide_preparedOption']['before_info'] .= $modSettings['hide_preparedOption']['unhiddentext'];
elseif ($modSettings['hide_posUnhiddenText'] == 1)
$modSettings['hide_preparedOption']['before_info'] = $modSettings['hide_preparedOption']['unhiddentext'].$modSettings['hide_preparedOption']['before_info'];
else
$modSettings['hide_preparedOption']['after_info'] .= $modSettings['hide_preparedOption']['unhiddentext'];
}

$modSettings['hide_preparedOption']['parse_content'] = !empty($modSettings['hide_enableUnhiddenText']) && empty($modSettings['hide_onlyonetimeinfo']);

// Okay this is the check up if he is allowed to unhide it everytime! (Risky if wrong setup or diffrent mods can handle hide tag)
$modSettings['hide_preparedOption']['auto_unhide_parser'] = false;
if (!empty($modSettings['hide_unhideparser']) && !empty($modSettings['hide_autounhidegroups']))
{
$modSettings['hide_autounhidegroups'] = !is_array($modSettings['hide_autounhidegroups']) ? explode(',', $modSettings['hide_autounhidegroups']) : $modSettings['hide_autounhidegroups'];
foreach ($user_info['groups'] as $group_id)
if (in_array($group_id, $modSettings['hide_autounhidegroups']))
{
$modSettings['hide_preparedOption']['auto_unhide_parser'] = true;
break; //One is enouph ;D
}
}
}

// Hide Mod.. i remove the code before i do anything...
if ($message !== false && !empty($message))
{
if ($modSettings['hide_preparedOption']['auto_unhide_parser'])
$context['user_post_avaible'] = 1;
// Add the Hidden Text at the end of the post :)
if ((empty($context['user_post_avaible']) || !isset($context['user_post_avaible'])) && !empty($modSettings['hide_onlyonetimeinfo']) && hideTagExists($message, $cache_id))
$message .= '[br]'.$modSettings['hide_preparedOption']['hiddentext'];
// Here i remove this content :) or show onetime unhide info :)
if (!isset($context['user_post_avaible']) || empty($context['user_post_avaible']))
{
// Remove it ;D
$message = preg_replace("/\[hide\](.+?)\[\/hide\]/i", (empty($modSettings['hide_onlyonetimeinfo']) ? $modSettings['hide_preparedOption']['hiddentext'] : "&nbsp"), $message);
$message = preg_replace(array('~\n?\[hide.*?\].+?\[/hide\]\n?~is', '~^\n~', '~\[/hide\]~'), (empty($modSettings['hide_onlyonetimeinfo']) ? $modSettings['hide_preparedOption']['hiddentext'] : "&nbsp"), $message);
}
// Okay i need to add the unhidden information at the end of the post :)
elseif (!empty($context['user_post_avaible']) && !empty($modSettings['hide_onlyonetimeinfo']) && !empty($modSettings['hide_enableUnhiddenText']) && hideTagExists($message, $cache_id))
$message .= '[br]'.$modSettings['hide_preparedOption']['unhiddentext'];
}



il problema è che non trovo static $disabled;

:(

emanuele

Provato questo?
Altrimenti, prova cercando pezzi più corti. ;)

Così ad occhio, quel pezzo dovrebbe andare all'inizio della funzione parse_bbc.

Marco Di Lenardo

sarò duro di comprendonio ma non ho ancora risolto; allego l'intero subs.php

Lucarella

Marco, stando a quello che dice Emanuele, la stinga static $disabled; dovrebbe essere alla riga 1026 ma lì è così static $disabled,
Cmq, prima di provare aspetta lui, perchè è stano che la punteggiatura sia diversa.

emanuele

Allora, piccola divagazione così poi l'aggiungo all'articolo (e magari sposto l'articolo qui :P).

Quando usate il package manager per installare un mod, lui non fa nient'altro che una ricerca di testo "esatta".
Nel mod c'è scritto cerca la stringa static $disabled; SMF cercherà *esattamente* quella stringa, se non la trova da errore.
Da ciò se ne deduce che, se il package manager vi segnala un errore, quella stringa "tal quale" *non esiste* nel file.
O meglio non esiste più. Qualcosa l'ha cambiata. Di consegue cercare manualmente quella stringa di testo sarà inutile, perché SMF vi ha già detto che non esiste.
Ora, cosa si può fare?
Facciamo un esempio pratico.
static $disabled;
Due le possibilità.

Possibilità 1
Sappiamo che "esattamente" quella stringa non esiste, ma ci sono buone probabilità che "sotto-stringhe" (cioè pezzi più corti esistano.
Quindi, apriamo il nostro Subs.php e invece di cercare il pezzo intero, possiamo provare ad esempio con:
static
Ci accorgeremo presto che è un po' troppo corta, e troveremo numerose corrispondenza.
Allora proviamo con qualcosa di più lungo, ad esempio semplicemente senza il punto e virgola finale:
static $disabled
Bingo! Al primo colpo una sola istanza della stringa (dopo la "possibilità 2" vedremo come appare).



Possibilità 2
Sappiamo che quella stringa non esiste, ma sappiamo anche che "in precedenza" quella è esistita, quindi sappiamo che nei file originali di SMF, verosimilmente quella stringa esisterà.
Con questa sicurezza, prendiamo un pacchetto d'installazione di SMF, apriamo il file in questione (nell'esempio Subs.php) e cerchiamo.
Il risultato (nell'esempio che stiamo facendo) sarà quest'area
// Parse bulletin board code in a string, as well as smileys optionally.
function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = array())
{
global $txt, $scripturl, $context, $modSettings, $user_info, $smcFunc;
static $bbc_codes = array(), $itemcodes = array(), $no_autolink_tags = array();
static $disabled;

// Don't waste cycles
if ($message === '')
return '';

Vediamo che si tratta dell'inizio di una funzione (parse_bbc) e vediamo come appare il codice e sappiamo che appare alla riga 891 (consiglio di usare sempre un editor di testo "decente" tipo Notepad++ o Programmer's Notepad o altro, ve ne sono parecchi, il semplice notepad di Windows non è particolarmente adeguato al compito)
Ora cosa possiamo fare?
Andare a vedere nel nostro Subs.php se troviamo quel pezzo.
Apriamo Subs.php, e possiamo fare due cose:
1) cercare ad esempio parse_bbc
2) andare alla riga 891 e scorrere in su e in giù cercando il pezzo.
In entrambi i casi: bingo!
Individueremo la regione corretta.



Ed Eccoci qua con il codice come potrebbe apparirci:
//-Taby ed2k links functions


function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = array())
{
global $txt, $scripturl, $context, $modSettings, $user_info, $smcFunc;
static $bbc_codes = array(), $itemcodes = array(), $no_autolink_tags = array();
static $disabled, $default_disabled, $parse_tag_cache;

// Don't waste cycles
if ($message === '')
return '';

Piccole differenze, ma importanti quando anche un solo carattere fa la differenza.
In particolare la stringa che avremmo dovuto cercare era stata precedentemente modifica da:
static $disabled;
a
static $disabled, $default_disabled, $parse_tag_cache;
la differenza sostanziale in questo caso è un punto e virgola diventato virgola. Son due cose diverse ovviamente.

Ma passiamo a cosa fare.
Ora, per il "cosa fare" bisogna avere un minimo di conoscenze di PHP, almeno proprio le basi, oppure affidarsi alla buona sorte e provare. ;D (O chiedere eventualmente :P)
In questo caso l'istruzione era di "aggiungere prima" del codice, allora non è un grande problema, la riga finisce diversamente, ma è quella, perciò basterà aggiungere prima quello che va aggiunto.

Ovviamente questo è un caso particolare, ogni modifica ha la sua storia e il suo modo di essere risolta, questo non è generalizzabile, non esistono formule magiche, quindi se avete letto fino a qui sperando in una... beh, vi è andata male, mi spiace. :(




Quindi, come si suol dire, TL;DR: quello che ha detto Lucarella. ;D

Citazione di: Lucarella il Sabato - 26 Aprile 2014 - 18:14
Cmq, prima di provare aspetta lui, perchè è stano che la punteggiatura sia diversa.
E' diversa perché è stata cambiata la "struttura" dell'istruzione.
In PHP, come in molti altri linguaggi, il punto e virgola significa "fine della riga".
Quella riga, originariamente, dichiara una sola variabile ($disabled) come "static" (non mi dilungo a spiegare cosa sia perché non serve, prendetelo "così"), mentre nella versione del file di Marco è stata cambiata per dichiarare tre variabili in un sol colpo e la virgola è stata usata per separare le tre variabili che però fanno tutte riferimento all'istruzione originale "static" (va beh, è una spiegazione non proprio "correttissima", ma dovrebbe quantomeno essere comprensibile. :P)

Marco Di Lenardo

dopo altri 20 minuti di imprecazioni contro satana sono riuscito a fare la modifice...

La prova sta nel fatto che non ho più errori nel registro :P

Grazie

Lucarella

Ottima spiegazione Emanuele, non ho capito tutto, ma se avrò problemi chiederò comunque ;D

Discussioni simili (3)