[WIP] - Customize SMF

Aperto da emanuele, Sabato - 09 Febbraio 2013 - 14:57

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

emanuele

Questo è qualcosa che mi è venuto in mente di "importare" da MediaWiki.
In MediaWiki c'è la possibilità, nel proprio profilo, di aggiungere del css e del javascript in modo da personalizzare la propria "user experience", ed ora vediamo di portare questa stessa flessibilità su SMF.

Allora, cosa ci serve?
0) un nome...io non sono bravo in queste cose, la prima cosa che mi è venuto in mente è "Customize SMF" ed inizierò con questo, se avete suggerimenti fate pure, sono abbastanza bravo ed abituato a cambiare nome ai miei mod, lo faccio almeno 4 volte prima di rilasciarne uno!! lol),
1) una licenza, sono pigro e scelgo sempre BSD (che "sinteticamente" implica che il codice può essere riutilizzato a piacimento a patto di mantere il riferimento all'autore nelle intestazioni dei file di codice) anche perché così se in un futuro qualcuno volesse introdurre la funzione in SMF (o altro derivato o altro software sarebbe libero di farlo senza dovermi chiedere di cambiare la licenza o di doverlo riscrivere lui stesso),
1) un posto dove tenere css e js,
2) un modo per richiamare i css e i js personalizzati,
3) un posto per aggiungere e modificare questi css e js,

Partiamo dall'ultimo punto: dove deve andare pa pagina per modificare questi elementi?
Beh, è qualcosa legato al profilo, quindi...profilo, menù "Modifica Profilo", ovviamente. :P

Vediamo ora se possiamo evitare di modificare il codice ed invece usare un "hook"... yes we can! integrate_profile_areas.

Quindi vediamo cos'è un hook e come usarlo.
Un hook è...diciamo un punto in cui SMF può eseguire delle funzioni definite da un mod senza la necessità di ricorrere alla modifica del codice sorgete. Questo sistema è stato introdotto in maniera più flessibile a partire da SMF 2.0 (esisteva già in 1.x, ma era piuttosto limitato).
Per poter utilizzare un hook servono due azioni:
1) all'installazione dobbiamo dire ad SMF di "registrare" l'hook,
2) quando SMF gira dobbiamo fornire una funzione da eseguire.
All'installazione dovremo chiamare la funzione add_integration_function passando come parametri il nome dell'hook a cui vogliamo agganciarci e il nome della funzione da eseguire, ad esempio in questo caso potremo utilizzare:
add_integration_function('integrate_profile_areas', 'custsmf_add_menu');
Il primo parametro indica l'hook a cui ci vogliamo agganciare, il secondo la funzione che vogliamo venga eseguita.
Quindi possiamo iniziare a scrivere un po' di codice:
Codice (package-inf.xml) Seleziona
<?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>emanuele:customize_smf</id>
<name>Customize SMF</name>
<version>0.0.1</version>
<type>modification</type>

<install for="2.0 - 2.0.99">
<code>install.php</code>
<require-file name="Subs-Customize.php" destination="$sourcedir" />
</install>

<uninstall for="2.0 - 2.0.99">
<code>uninstall.php</code>
<remove-file name="$sourcedir/Subs-Customize.php" />
</uninstall>
</package-info>


Codice (install.php) Seleziona
<?php
if (file_exists(dirname(__FILE__) . '/SSI.php') && !defined('SMF'))
require_once(dirname(__FILE__) . '/SSI.php');
elseif (!
defined('SMF'))
exit('<b>Error:</b> Cannot install - please verify you put this in the same place as SMF\'s index.php.');

add_integration_function('integrate_profile_areas''custsmf_add_menu');
add_integration_function('integrate_pre_include''$sourcedir/Subs-Customize.php');


Codice (uninstall.php) Seleziona
<?php
if (file_exists(dirname(__FILE__) . '/SSI.php') && !defined('SMF'))
require_once(dirname(__FILE__) . '/SSI.php');
elseif (!
defined('SMF'))
exit('<b>Error:</b> Cannot install - please verify you put this in the same place as SMF\'s index.php.');

remove_integration_function('integrate_profile_areas''custsmf_add_menu');
remove_integration_function('integrate_pre_include''$sourcedir/Subs-Customize.php');


Codice (Subs-Customize.php) Seleziona
<?php

if (!defined('SMF'))
die('Hacking attempt...');

function 
custsmf_add_menu (&$profile_areas)
{
// qui metteremo un po' di codice
}


Se notate bene, in install.php ho "registrato" due hook: integrate_profile_areas e integrate_pre_include. Quest'ultimo serve ad includere un file (nello scrivere questa "guida" darò per scontato alcuni concetti di base di php), in questo caso, il file verrà incluso ogni volta una pagina verrà caricata.

Altra cosa "nuova" è in uninstall.php, ho usato remove_integration_function che, come dice il nome, rimuove un hook e deve essere usatu durante la disinstallazione.

Per questa prima "puntata" è tutto, al prossimo appuntamento per come effettivamente utilizzare l'hook. Ovviamente se qualcuno vuole provare a scrivere il codice è benvenuto! ;D

Il codice è disponibile su Github: https://github.com/emanuele45/CustomizeSMF
Se volete contribuire, siete liberi di farlo! ;D

Edit: il primo commit relativo a questa prima lezione:
https://github.com/emanuele45/CustomizeSMF/commit/bdf8485f9e39c0f576022ec72b1ceb51fdd37c39

emanuele

#1
Nella prima parte abbiamo creato lo scheletro del mod e abbiamo visto velocemente come utilizzare gli hook. Bene, ora vediamo di preciso come aggiungere il menù.

Prendiamo come esempio il codice stesso di SMF deove il menù del profilo viene definito:
Codice (Profile.php) Seleziona
$profile_areas = array(
'info' => array(
[...]
'edit_profile' => array(
'title' => $txt['profileEdit'],
'areas' => array(
'account' => array(
'label' => $txt['account'],
'file' => 'Profile-Modify.php',
'function' => 'account',
'enabled' => $context['user']['is_admin'] || ($cur_profile['id_group'] != 1 && !in_array(1, explode(',', $cur_profile['additional_groups']))),
'sc' => 'post',
'password' => true,
'permission' => array(
'own' => array('profile_identity_any', 'profile_identity_own', 'manage_membergroups'),
'any' => array('profile_identity_any', 'manage_membergroups'),
),
),

In 'info' => array( vengono definite le voci del menu "Informazioni sul Profilo", quel che a noi interessa è invece "edit_profile", dobbiamo aggiungere lì una nuova voce.
Cosa ci serve?
1) il testo da mostrare,
2) la struttura dell'array,
3) i permessi (così che gli admin possano decidere se alcuni gruppi possono cambiare l'aspetto oppure no).

Quindi, prendendo spunto dal codice mostrato sopra, l'array dovrebbe risultare qualcosa di simile a:
'customize' => array(
'label' => $txt['custsmf'],
'file' => 'Subs-Customize.php',
'function' => 'custsmf_modify',
'sc' => 'post',
'permission' => array(
'own' => array('profile_custsmf_any', 'profile_custsmf_own'),
'any' => array('profile_custsmf_any'),
),
),

Il significato di ognuna delle singole voci non fa parte degli obiettivi di questa guida, ma se avete domande non siate timidi ed io cercherò di rispondere! ;D

Ora, come facciamo ad introdurre questo nella funzione che abbiamo scritto in precedenza? (custsmf_add_menu)

Semplice: l'hook passa alla nostra funzione un argomento: $profile_areas, che è l'array che contiene tutte le informazioni necessarie ad SMF per costruire il menù della pagina del profilo, noi quindi dobbiamo "solo" aggiungere la nostra voce nel posto giusto:
function custsmf_add_menu (&$profile_areas)
{
$profile_areas['edit_profile']['areas']['customize'] = array(
'label' => $txt['custsmf'],
'file' => 'Subs-Customize.php',
'function' => 'custsmf_modify',
'sc' => 'post',
'permission' => array(
'own' => array('profile_custsmf_any', 'profile_custsmf_own'),
'any' => array('profile_custsmf_any'),
),
);
}


Se però usiamo questa funzione così com'è, vedremo un errore nel registro degli errori, dove SMF si lamenterà di una variabile non esistente: $txt.
$txt è la variabile che contiene tutte le stringhe di testo di SMF. A seconda della pagina, conterrà diversi valori.
Per poterla usare in una funzione, bisogna metterla "in global", quindi la precedente funzione diventerà:
function custsmf_add_menu (&$profile_areas)
{
global $txt;

$profile_areas['edit_profile']['areas']['customize'] = array(
'label' => $txt['custsmf'],
'file' => 'Subs-Customize.php',
'function' => 'custsmf_modify',
'sc' => 'post',
'permission' => array(
'own' => array('profile_custsmf_any', 'profile_custsmf_own'),
'any' => array('profile_custsmf_any'),
),
);
}

Tutto bene? No.
Altro errore nel log: indice mancante.
Perché? Perché non abbiamo scritto da nessuna parte cosa ci sta in $txt['custsmf'].
Per far questo (siccome noi vogliamo modificare il minor numero di file possibile in modo da rendere più facile installazione, rimozione ed aggiornamento del mod), creiamo un altro file, CustSMF.english.php con all'interno questo codice:
<?php
$txt
['custsmf'] = 'Custom CSS and js';

e lo dobbiamo mettere nella directory "languages" presente nel tema di default. Per far ciò, aggiungiamo a package-info.xml, nella sezione <install>:
<require-file name="CustSMF.english.php" destination="$languagedir" />

e nella sezione <uninstall>:
<remove-file name="$languagedir/CustSMF.english.php" />


Ora non ci resta che dire ad SMF di caricare il file di lingua quando ci serve, quindi la funzione custsmf_add_menu diventerà:
function custsmf_add_menu (&$profile_areas)
{
global $txt;

loadLanguage('CustSMF');

$profile_areas['edit_profile']['areas']['customize'] = array(
'label' => $txt['custsmf'],
'file' => 'Subs-Customize.php',
'function' => 'custsmf_modify',
'sc' => 'post',
'permission' => array(
'own' => array('profile_custsmf_any', 'profile_custsmf_own'),
'any' => array('profile_custsmf_any'),
),
);
}


E per questo passo è tutto.
Il codice aggiunto lo potete vedere per intero qui:
https://github.com/emanuele45/CustomizeSMF/commit/db26d47007a36eaa234736c879010d26fdf83fd8

emanuele

Ragazzi oggi sono in vena, quindi sotto con il codice.
Andiamo avanti con il creare la pagina in cui poter modificare i CS e js personalizzati.

Nel precedente passaggio abbiamo aggiunto la voce di menù, ma ancora la pagina non può funzionare.
Una è la cosa mancante: una funzione che decida cosa mostrare. Però, nel definire il menù, abbiamo già definito come chiamare questa funzione:
'function' => 'custsmf_modify',
e dove mettere questa funzione:
'file' => 'Subs-Customize.php',
Quindi forza, creiamo la funzione nel file:
function custsmf_modify ()
{

}


Restano ancora due pezzi di codice da esaminare, uno ci pensiamo poi, per ora concentriamoci sui permessi:
'permission' => array(
'own' => array('profile_custsmf_any', 'profile_custsmf_own'),
'any' => array('profile_custsmf_any'),
),

'own' => proprio, ovvero il permesso di modificare il proprio profilo (in questo caso, ma potrebbe anche essere messaggio),
'any' => qualunque, il permesso di modificare qualunque profilo (o altro).
Quindi il codice sopra indica che, per poter modificare i css devi essere o il proprietario di quel profilo (in altre parole stai modificando il tuo profilo), oppure hai il permesso di modificare i css/js per ogni profilo.

Ora c'è il problema: come facciamo ad aggiungere una voce alla lista dei permessi in modo che gli admin possano concedere agli utenti di modificare css e js?
Un altro hook entra in gioco: integrate_load_permissions.
Questo va aggiunto a install.php:
add_integration_function('integrate_load_permissions', 'custsmf_add_permissions');
e l'equivalente "remove_integration_function sarà da aggiungere ad uninstall.

A voi il documentarvi a fondo su come l'hook funziona (ci sono dei commenti nel codice di SMF in ManagePermissions.php), io scrivo qui la funzione finita:
function custsmf_add_permissions (&$permissionGroups, &$permissionList, &$leftPermissionGroups, &$hiddenPermissions, &$relabelPermissions)
{
loadLanguage('CustSMF');

$permissionList['membergroup']['profile_custsmf'] = array(true, 'profile', 'edit_profile', 'moderate_general');
}


Ovviamente ci serviranno anche delle stringhe di testo per la pagina dei permessi, SMF segue uno standard per l'indice di $txt da usare per i permessi: $txt['permissionsname_nomepermesso'] = '...', dove "nomepermesso" è, nel nostro caso, "profile_custsmf" (l'indice usato prima in $permissionList).
Un'altra convenzione è: $txt['permissionhelp_nomepermesso'] = '...', in questo caso la stringa verrà usata per creare un'icona con un testo d'aiuto (permissionhelp invece di permissionname).
Quindi aggiungiamo al file di lingua il seguente codice:
$txt['permissionname_profile_custsmf'] = 'Edit custom styles and js';
$txt['permissionhelp_profile_custsmf'] = 'The custom styles and js function allows each user to customize their view of the forum.';
$txt['permissionname_profile_custsmf_own'] = 'Own profile';
$txt['permissionname_profile_custsmf_any'] = 'Any profile';


Ed ecco il codice:
https://github.com/emanuele45/CustomizeSMF/commit/6a3da79723745dd3e5f0a655742f516a98434422
Come potrete notare ho anche corretto un errore che ho fatto nella prima "lezione": in uninstall.php avevo chiamato la funzione remove_integration_hook invece di remove_integration_function. Sorry.

La prossima volta sarà l'ora di creare la pagina necessaria a modificare i valori.

emanuele

Ed eccoci al primo punto interessante: la pagina in cui modificare css e javascript.

Per ora, per semplicità, farò una sola pagina per entrambi, in futuro si potràno dividere e fare una per i css ed una per il js con magari anche un po' di istruzioni ed esempi, ecc.

Nella "puntata precedente", eravamo arrivati ad avere una funzione "custsmf_modify" chiamata nel momento in cui s premeva sul pulsante. Bene, ora dobbiamo fare in modo che quella funzione mostri una pagina come vogliamo noi.

Il primo passo è creare un altro file: un template. chiamiamolo "CustSMF.template.php". Aggiungiamo le linee a package-info.xml per dire ad SMF di spostare il file nel posto giusto durante l'installazione:
Codice (package.info.xml) Seleziona
<require-file name="CustSMF.template.php" destination="$themedir" />

e rimuoverlo durante la disinstallazione:
Codice (package.info.xml) Seleziona
<remove-file name="$themedir/CustSMF.template.php" />


Ora vediamo come la nostra funzione custsmf_modify può apparire:
Codice (Subs-Customize.php) Seleziona
function custsmf_modify ()
{
loadTemplate('CustSMF');
}

Questa è la forma "minima", in questo modo, SMF caricherà il file del template e in condizioni normali cercherà di lanciare la funzione di default template_main. Se questa funzione non esiste genererà un errore.
Il profilo (come anche altre sezioni) funzionano in maniera leggermente differente, in particolare, viene assegnato di default un "sub template" con lo stesso nome della funzione chiamata:
$context['sub_template'] = $profile_include_data['function'];
quindi, nel nostro caso, "custsmf_modify".

Cosa sono i sub template?
Come detto, "di norma" SMF per generare una schermata utilizza la funzione "template_main", un sub template è un template alternativo che consente di avere più template all'interno dello stesso file (è una grossa semplificazione, ma accettiamola così per ora ;)) e comunque di ridurre i conflitti.
Se devo essere sincero, a me di norma piace usare i sub template, perché in questo modo posso non preoccuparmi di eventuali altri template caricati che già hanno una funzione template_main (perché ovviamente se SMF dovesse caricare due template, entrambi con la funzione template_main php "crasherebbe" con un errore e tutto si fermerebbe) e posso meglio controllare quello che voglio mostrare.
Quando viene usato un sub template, SMF , invece di usare la funzione template_main, cercherà la funzione template_nome_subtemplate, quindi nel nostro caso: template_custsmf_modify.

Quindi, abbiamo un sub template impostato, usiamolo:
Codice (CustSMF.template.php) Seleziona
<?php
function template_custsmf_modify ()
{

}


Bene, ora abbiamo una bella pagina vuota! E' già qualcosa! ;D
Adesso bisogna scrivere il template, che in SMF significa scrivere dell'HTML incluso in un'istruzione "echo" di php, per semplificarci la vita, prendiamo spunto da un altro template simile, ad esempio la funzione template_ignoreboards.

Scriviamo il codice ottenendo qualcosa tipo:
Codice (CustSMF.template.php) Seleziona
function template_custsmf_modify ()
{
global $context, $settings, $options, $scripturl, $modSettings, $txt;

echo '
<form action="', $scripturl, '?action=profile;area=customize;update" method="post" accept-charset="', $context['character_set'], '" name="customize" id="customize">
<div class="cat_bar">
<h3 class="catbg">
<span class="ie6_header floatleft"><img src="', $settings['images_url'], '/icons/online.gif" alt="" class="icon" />', $txt['custsmf'], '</span>
</h3>
</div>
<p class="description">', $txt['custsmf_info'], '</p>
<div class="windowbg2">
<span class="topslice"><span></span></span>
<div class="content">
<dl class="settings">
<dt>
<strong>', $txt['custsmf_insert_css'], ':</strong>
</dt>
<dd>
<textarea class="editor" cols="50" rows="15" name="custcss" >', $context['custcss'], '</textarea>
</dd>
<dt>
<strong>', $txt['custsmf_insert_js'], ':</strong>
</dt>
<dd>
<textarea class="editor" cols="50" rows="15" name="custjs" >', $context['custjs'], '</textarea>
</dd>
<br class="clear" />';

// Show the standard "Save Settings" profile button.
template_profile_save();

echo '
</div>
<span class="botslice"><span></span></span>
</div>
</form>
<br />';
}


Ed abbiamo anche aggiunto le seguenti stringhe di testo:
$txt['custsmf_info'] = 'In this page you can customize the look&feel of this forum adding custom styles and custom javascript';
$txt['custsmf_insert_css'] = 'Inser here your custom css';
$txt['custsmf_insert_js'] = 'Inser here your custom javascript';


Bien, per ora è tutto, come al solito il codice aggiunto durante questa lezione è disponibile a questo link:
https://github.com/emanuele45/CustomizeSMF/commit/c25ca0b4bffa6ede1dc6ab037f6004abe70737f8

Alex

perdona il mio OT

il progetto mi sta incuriosendo molto ma la mia profonda ignoranza mi porta a chiederti:

Citazione di: emanuele il Sabato - 09 Febbraio 2013 - 14:57
Questo è qualcosa che mi è venuto in mente di "importare" da MediaWiki.
In MediaWiki c'è la possibilità, nel proprio profilo, di aggiungere del css e del javascript in modo da personalizzare la propria "user experience", ed ora vediamo di portare questa stessa flessibilità su SMF.

... non so cosa sia una "user experience" nè come funzioni Mediawiki.
Qual'è l'obietttivo che stai perseguendo?

emanuele

lol al momento non mi veniva come chiamarlo in italiano... sorry!

In pratica dare la possibilità ad ogni utente di scrivere del css o del javascript e salvarlo "nel forum" in modo che venga applicato al forum stesso quando tu lo visualizzi.
Per fare un esempio pratico: se domani questo mod fosse installato su questo sito e non mi piace il colore dello sfondo dei post, potrei andare nel mio profilo, nella pagina apposita ed inserire qualcosa tipo:
.windowbg, #preview_body
{
color: #FFF;
background-color: #000;
}
.windowbg2
{
color: #FFF;
background-color: #333;
}

e questo renderebbe il colore dei topic da scritta nera su sfondo grigino chiaro/scuro com'è adesso, a scritta bianca su sfondo nero o grigione scuro.

Come ho detto è una funzione presente in mediawiki (il software su cui gira wikipedia) e l'ho trovato molto utile a volte per "correggere" magari piccoli difetti o aggiungere piccole funzionalità che mi servivano. :)

Probabilmente non servirà al 90% della gente, ma siccome è un progetto abbastanza semplice e volevo scrivere una guida ho pensato di sfruttarlo. O:-)

emanuele

Ora viene la parte più tosta: salvare.
Facile direte voi, basta premere il pulsante...sì, ma poi questi dati che fine fanno?
Al momento nessuna, perché non esiste ancora un posto dove salvarli.

Allora vediamo le possibilità:
1) la più ovvia (e quella che adotteremo) è la tabella members,
2) la meno ovvia, sarebbe creare una nuova tabella e poi usare un "LEFT JOIN" per recuperare i dati. Questa soluzione è probabilmente la più "pulita" perché evita di ingombrare una una tabella già abbastanza pienotta, ma richiederebbe un maggior numero di modifiche, quindi la lasciamo da parte.
Andiamo per la 1.

Salvare i dati nella tabella members implica che, durante l'installazione, dobbiamo anche creare una nuova colonna...anzi due: una per i css ed una per i javascript.
Per creare la colonna dobbiamo quindi eseguire del codice durante l'installazione, per far questo si può riciclare "install.php", per creare una tabella possiamo sfruttare le funzioni messe a disposizione da SMF in modo da mantenere la compatibilità con i diversi DBMS supportati. Vediamo il codice:
Codice (install.php) Seleziona
db_extend('packages');

$smcFunc['db_add_column'](
'{db_prefix}members',
array(
'name' => 'cust_css',
'type' => 'text',
'default' => '',
'null' => false
)
);

$smcFunc['db_add_column'](
'{db_prefix}members',
array(
'name' => 'cust_js',
'type' => 'text',
'default' => '',
'null' => false
)
);


La prima riga "db_extend('packages');" serve nel caso di installazione manuale per caricare le funzioni necessari (installando via package manager queste funzioni sono già disponibili, ma caricarle non fa male).

La funzione "$smcFunc['db_add_column']" serve per aggiungere una colonna ad una tabella, il nome della quale è specificato come primo argomento: "'{db_prefix}members'" (ogni volta che viene usata una tabella in una query è bene mettere "{db_prefix}", stringa che verrà rimpiazzata con il prefisso corretto). L'array che segue serve quindi per descrivere la colonna che dovrà essere creata: il nome, il tipo di dati che conterrà, il valore di default, se potrà assumere il valore null. Esistono numerosi altri parametri che potete vedere nella documentazione della funzione.

Ora serve fare una piccola modifica anche a package-info.xml, fino ad ora c'era:
<code>install.php</code>
ora lo cambieremo in:
<database>install.php</database>
Perché? Perché il tag database registra le modifiche effettuate al database e quando sarà ora di disinstallare il mod, presenterà all'admin una casella con cui sarà possibile cancellare definitivamente tutti i dati del mod, senza che chi crea il mod esegua alcun codice aggiuntivo.

Bene, ora abbiamo un posto dove salvare i nostri valori, andiamo avanti. Quando clicchiamo su "Aggiorna profilo", SMF eseguirà nuovamente la funzione "custsmf_modify", questo perché la <form> nel template ha come action: "?action=profile;area=customize" che è esattamente l'URL che ci permette di aprire la pagina da noi precedentemente creata.
Come facciamo quindi a sapere se la funzione è eseguita perché stiamo caricando la pagina per la prima volta o stiamo salvando? Ci viene in aiuto un parametro nell'url dell'action della <form>: "update", quindi controlleremo che 'update' sia impostato in $_REQUEST e se così è, eseguiremo i controlli del caso e salveremo:
Codice (Subs-Customize.php) Seleziona
function custsmf_modify ($memID)
{

if (isset($_REQUEST['update']))
{
// salviamo
}

loadTemplate('CustSMF');
}


Tutte le volte che si salva qualcosa, come prima cosa (prima ancora di controllare i permessi), è bene controllare che la sessione sia valida con checkSession.
Piccola parentesi: nella seconda parte, quando abbiamo aggiunto il pulsante, ho omesso di spiegare uno dei parametri presenti, ora è il momento di farlo.
'sc' => 'post',
"sc" sta per "session check", "post" indica che i dati di sessione sono POSTati e non passati nell'URL.
Questo parametro dice ad SMF di verificare la sessione, senza che lo si faccia manualmente dopo.
Purtroppo in questo caso SMF non ci viene in contro perché il codice non è pensato per essere estensibile, quindi dovremo fare manualmente:
if (isset($_REQUEST['update']))
{
checkSession('post');
[...]

il valore del parametro passato può essere 'post', 'request', o 'get' (per controllare i dati di session passati via POST, GET, oppure uno dei due, il default è 'post'.

Il passaggio successivo, di solito, è controllare se chi sta cercando di salvare, ha i permessi per farlo, in questo caso, però SMF ci viene in contro perché abbiamo già indicato quali permessi sono necessari nel creare il menù (terza parte del tutorial)...beh, non ci resta altro da fare che salvare...ma a che utente?
Siccome il profilo può essere modificato anche da altri utenti, non solo dal proprietario (ad esempio gli admin), è necessario conoscere l'id dell'utente che stiamo modificando. Ancora una volta SMF ci viene in contro, passando l'id alla funzione "custsmf_modify", infatti se notate nel codice che ho postato prima, la funzione accetta in ingresso il parametro $memID.
Normalmente per salvare un valore nel database dovremmo usare una query, ma ancora una volta, nel caso particolare del profilo (e di valori che hanno una colonna nella tabella {db_prefix}members, SMF ci viene incontro fornendoci una funzione che si occupa di fare il lavoro sporco per noi, si tratta di "updateMemberData". Per sicurezza, però, è meglio assicurarsi che niente di "strano" finisca nel database, quindi dobbiamo usare htmlspecialchars, o meglio la versione di SMF che si occupa di gestire il corretto encoding dei caratteri, quindi la nuova funzione sarà qualcosa tipo:
function custsmf_modify ($memID)
{
global $context, $smcFunc;

if (isset($_REQUEST['update']))
{
checkSession('post');

$css = $smcFunc['htmlspecialchars']($_POST['custcss']);
$js = $smcFunc['htmlspecialchars']($_POST['custjs']);
updateMemberData($memID, array('cust_css' => $css, 'cust_js' => $js));
}

loadTemplate('CustSMF');
}


YAY!
Abbiamo salvato...ma se proviamo non vediamo niente, come mai!! :'(
Beh, semplice: non abbiamo ancora mostrato i dati presenti nel database, ma questo è per la prossima lezione! ;D

Il codice di questa volta lo si può trovare a questi indirizzo:
https://github.com/emanuele45/CustomizeSMF/commit/397ceda6690b50b3c888149a00fa814f23a249ef

emanuele

In teoria avrei voluto postare un messaggio alla settimana, ma...ehm... O:-)

Comunque se avete domande questo non vuole essere un monologo, ma proprio uno spunto per domande e risposte. ;D

emanuele

Non me ne son dimenticato, solo che le settimane passano più in fretta di quanto possa sembrare... ::)

Flavio93Zena

[necro mode: ON]
Citazione di: emanuele il Giovedì - 28 Marzo 2013 - 09:14
Non me ne son dimenticato, solo che le settimane passano più in fretta di quanto possa sembrare... ::)
E il seguito? ::) O:-)
P.s. No non l'ho letto tutto però la prima ora che ho libera ci provo xD

Discussioni simili (3)