Supporto volontario e collaborativo per Joomla!® in italiano

Aggiungere un nuovo tipo di campo in SOBI2

Valutazione attuale: 0 / 5

Stella inattivaStella inattivaStella inattivaStella inattivaStella inattiva
 
SOBI2SOBI2 è un componente molto versatile che spesso viene utilizzato per creare Directory, permettendo agli utenti di inserire autonomamente nuove schede.
L'unica pecca riguarda il numero limitato di tipi di campo: quelli nativi dell'estensione sono 7 (input, textarea, select list, checkbox, checkbox group, text code e calendar) e, anche se possiamo creare delle cose interessanti, dobbiamo mettere mano al codice per avere un qualche effetto in più.

Entriamo subito nel vivo dell'azione: nel mio caso andremo a creare un campo che mostri in maniera casuale un link inserito dagli utenti nella relativa scheda. Darò per scontato che sappiate già utilizzare questo componente, in caso contrario leggete questa guida che vi fornirà una base per muovere i primi passi. Vi consiglio anche di utilizzare Eclipse per effettuare il debug e capire che cosa state facendo. Il team di Joomla ha creato questa esauriente guida nel caso in cui ne aveste bisogno.


Dal momento che andiamo a toccare il core di un componente, è altamente consigliato effettuare un backup di tutto quanto prima di iniziare.



In questa guida modificheremo 7 file:
  1. admin.field.class.html.php
  2. admin.field.class.php
  3. admin.sobi2.class.html.php
  4. field.class.php
  5. form.class.php
  6. sobi2.class.php
  7. sobi2.entry.php

L'architettura del componente può disorientare agli inizi, per questo motivo vi condurrò "per mano" dicendovi cosa cercare e cosa aggiungere sotto il testo cercato. Non me ne vogliate, è fatto solo per arrivare velocemente all'ultimo file dove andremo realmente ad inserire il nostro codice personalizzato.

I primi 3 si trovano nella parte amministrativa del vostro sito (administrator/components/sobi2), mentre gli altri si trovano in components/com_sobi2.
Iniziamo dalla parte amministrativa: per prima cosa dobbiamo creare il nuovo tipo di campo che chiameremo "random".
Aprite il primo file (admin.field.class.html.php) e cercate la seguente stringa (vi consiglio aggiungere un commento accanto ad ogni modifica che eseguite, sarà più facile cercarla in un secondo tempo):

$fieldTypes[]     = sobiHTML::makeOption( 'calendar', 'calendar');

Aggiungete sotto questa stringa:

$fieldTypes[]     = sobiHTML::makeOption( 'random', 'random');

Cercate questa stringa:

$field->fieldType = 'calendar';

E inserite sotto questa:

case '8':
$field->fieldType = 'random';
break;

Bene, in questo modo abbiamo detto che esiste un nuovo tipo di campo e sarà visibile nel menù a tendina nella scelta del tipo di campo.
Adesso passiamo al secondo file (admin.field.class.php). Cercate questa stringa:

$this->fieldType = 'calendar'

E aggiungete prima un nuovo blocco "case":

case '8':
$this->fieldType = 'random';
break;

Bene, un'ultima modifica e poi per questo file abbiamo finito. Cercate

case 'calendar':

E aggiungete un nuovo blocco "case":

case 'random':
$this->fieldType = '8';
break;

Ancora un file e poi per la parte amministrativa abbiamo finito. Aprite il terzo file (admin.sobi2.class.html.php) e cercate la seguente stringa:

$fieldHtml =  $this->isCalendar( $field );

Al di sotto aggiungete il seguente blocco elseif:

elseif($field->fieldType == 8) {
$fieldHtml =  $this->isTextField( $field );
}

Ora va aggiunta anche il controllo sulla validazione del campo nel backend. Cercate

case 1:

E aggiungete subito sotto

case 8:

Che cosa avete fatto? Dopo aver creato una nuova opzione (primo file), avete creato anche la relativa codifica (secondo file): quando salverete un campo di tipo "random" questo avrà id 8 e, allo stesso modo, quando il componente leggerà un id 8 lo associerà al tipo "random". Nell'ultimo file abbiamo specificato che il nuovo campo è di tipo testuale e aggiunto anche una validazione.
Fin qui niente di speciale, ora andiamo a definire esattamente cosa dovrà fare il componente quando incontra un campo di tipo random.
Aprite il quarto file (field.class.php), adesso dobbiamo dire come deve salvare il nuovo campo. Siccome non è altro che un campo di testo (la visualizzazione sarà differente, dal momento che vogliamo venga selezionato in modo casuale) lo trattiamo esattamente allo stesso modo.
Cercate il seguente testo:

case  7:

E aggiungete subito sotto

case 8:

Adesso cercate per:

$fo = $field->isCalendar( $field, $fieldData );

E aggiungete un nuovo blocco "case":

case 8: // is random
$fo = $field->isTextField( $field, false, $fieldData );
break;

Passiamo al quinto file (form.class.php). Qua invece parliamo di come viene generato il form di inserimento di una nuova scheda.
Cercate la stringa:

$fields[$field->fieldname]['field'] = $this->isCalendar( $field );

Sotto aggiungete un nuovo blocco "case":

case 8: // is random
$fields[$field->fieldname]['field'] = $this->isTextField( $field );
break;

Adesso cercate per

$fieldHtml = $fieldHtml.$this->isCalendar( $field );

E aggiungete un nuovo blocco "case":

case 8: // is random
$fieldHtml = $fieldHtml."\n\t\t\t\n\t\t\t";
$fieldHtml = $fieldHtml.$this->isTextField( $field );
break;

Ultima aggiunta e poi anche per questo file abbiamo finito.
Cercate per:

case  7:

E subito sotto aggiungete:

case  8:

Aprite il penultimo file (sobi2.class.php). Dovete fare solo una semplicissima aggiunta, ma fondamentale.
Cercate

elseif( $field->fieldType == 1 || $field->fieldType == 5 || $field->fieldType == 7

e aggiungete, fondo (aggiungete un OR all'IF):

|| $field->fieldType == 8

Bene, finalmente abbiamo finito con queste sostituzioni meccaniche, ora entriamo nella parte in cui serve fantasia.
Aprite l'ultimo file (sobi2.entry.php). Qui dentro sono raccolte tutte le funzioni che portano alla creazione dell'output che verrà visualizzato.
Per sapere in quale punto iniziare a scrivere, cercate la seguente stringa:

elseif( $field->fieldType == 6 ) {

alla chiusura del blocco elseif possiamo iniziare ad aggiungere il nostro codice.
In questo caso noi vogliamo che venga preso, casualmente, un record appartenente alla scheda che vogliamo visualizzare.
Questo è il codice che ho creato io:

elseif ($field->fieldType == 8){
$query = "SELECT data_txt
FROM #__sobi2_fields_data
WHERE itemid = $sobi2Id
AND fieldid IN (
SELECT fieldid FROM #__sobi2_fields WHERE fieldType = 8)
ORDER BY RAND()
LIMIT 1";
$database->setQuery($query);
$field->data = $database->loadResult();
if( $field->isUrl == 4 ) {
$data = $field->customCode;
}
else {
$data = $field->data;
}
}

La query utilizzata non è ottimale dal punto di vista della velocità: deve creare un indice casuale per tutte le righe senza sfruttare alcun tipo di indice interno. In tabelle con pochi record le prestazioni rimangono invariate, ma raggiunti qualche migliaio di record i tempi si allungano a dismisura rendendo di fatto questa via impraticabile. La soluzione migliore sarebbe quella di estrarre tutti i record e poi dopo effettuare la scelta casuale tramite un array_rand.
Quello che avete visto non è altro che un esempio: i file da modificare sono sempre questi 7.
Un altro esempio lo potete trovare sul sito che ho creato: www.soldinternet.net. Se visualizzate il dettaglio di una scheda, vedrete che è presente anche una sezione denominata "Pagamenti". L'estrazione degli ultimi pagamenti e la loro visualizzazione è resa possibile modificando il componente SOBI2 come vi ho appena illustrato.

P.S. Nota dell'ultimo secondo. Mi sono reso conto che anche il modo in cui vengono pubblicati gli articoli su joomla.it potrebbe essere realizzato con questa modifica. Infatti è sempre presente un blocco adsense in cui cambia solamente l'id del publisher. Se la cosa interessa in futuro potrei creare una guida anche sotto questo aspetto.

Saluti, tampe125

CommentaCommenta questo articolo sul forum

Ultima versione di Joomla!®

downloadVer. 3.8.13 Stabile
Data di rilascio: 09 ottobre 2018
(leggi la notizia Demo online

Le migliori estensioni gratuite

Un elenco aggiornato con i link a più di 100 estensioni fra componenti, moduli e plugin gratuiti per Joomla! 3

Registrati al JoomlaDay!

Manuale in italiano

Manuale in italianoPer conoscere meglio Joomla!, le sue caratteristiche ed il metodo di utilizzo leggi il manuale tradotto in italiano.

Molto utili anche le risposte alle domande più frequenti: FAQ

Sicurezza del proprio sito Joomla!Leggi anche: Nozioni sulla sicurezza del proprio sito

Autori di articoli recenti

Invia un articolo!Scrivi un articolo su Joomla.it e ricevi i ricavi dalle pubblicità di Google Adsense!
Segui queste istruzioni, condividi e collabora con la community. L'elenco degli autori attivi sul sito.

Torna su

Joomla.it sui Social Network

JoomlaDay Italia

JoomlaDay

Newsletter

Inserisci qui la tua e.mail: