Wikipedia:Bar/Discussioni/Come passare più valori in un solo parametro di un template

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Come passare più valori in un solo parametro di un template NAVIGAZIONE


Ho scovato un sistema piuttosto semplice (per l'utente che usa il trucco; ma anche il codice non è poi così astruso) per passare a un singolo parametro di un template valori multipli, mentre lavoravo sulla generazione di categorie su source. Può interessare a qualcuno che abbia cozzato con questo problema? O qui la cosa è già stata risolta? --Alex_brollo Talk|Contrib 10:20, 20 lug 2010 (CEST)[rispondi]

Puoi spiegarti con un esempio concreto? PersOnLine 10:41, 20 lug 2010 (CEST)[rispondi]
infatti. non ho capito bene. --Salvo da Palermo dimmelo qui 20:17, 20 lug 2010 (CEST)[rispondi]
OK. Faccio un esempio wikisource. In un template (molto utilizzato.... scritto migliaia di volte) esiste un campo Argomento= dov'è previsto inserimento dell'argomento di un libro (biografia, poesie, novelle....); poi il parametro viene usato per generare una categoria. Ma... se il libro contenesse argomenti multipli, ossia fosse un libro di poesie e di novelle e anche una biografia?
Posso creare un codice che (lasciando identiche tutte le chiamate al template già esistenti) accetti uno, due, o cinque o dieci valori diversi nell'unico parametro Argomento=, generando per ciascuno la giusta categoria, lasciando intatte tutte le chiamate al template già seminate qua e là? Si, posso. Qui su wiki ho trovato, ad esempio, il campo Categoria= di {{bio}} che si presta, ma ce ne sono parecchi. La faccio breve: basta usare #titleparts come se si chiamasse #stringparser ;-) (con un po' di codice, ma nemmeno tanto) e "passare" al parametro i valori multipli separandoli con caratteri /.
Ci sono limitazioni:
  1. l'iniziale del primo elemento viene resa maiuscola;
  2. il numero di elementi non può superare i 25, se non erro;
  3. la lunghezza della stringa non può oltrepassare i 254 o 255 caratteri;
  4. nessun elemento della stringa deve contenere caratteri /
Me ne torno a casa source, spero che il trucco vi torni utile, e che sia "nuovo". --Alex_brollo Talk|Contrib 01:00, 21 lug 2010 (CEST)[rispondi]
Qual è il vantaggio di ridurre i parametri di un template? Di solito si mettono molteplici parametri identici numerati; non è molto bello o flessibile e appesantisce il codice del template, che però resta leggibile e facilmente usabile. --Nemo 11:55, 21 lug 2010 (CEST)[rispondi]
Sarebbe utile se esistesse il ciclo For... ma non esiste, i vari elementi vanno comunque gestiti uno a uno, perciò tanto vale usare più parametri numerati, come dice Nemo è più leggibile --Bultro (m) 12:36, 21 lug 2010 (CEST)[rispondi]
Chi maneggia database sa che occorre assolutamente risolvere la "relazione uno a molti"; poi tocca affrontare anche quella "molti a molti"; e fatto questo il lavoro è pressochè finito. Se esiste la possibilità che un campo abbia valori in numero variabile (uno, o "qualcuno"), il problema non si risolve, aimè, assegnando un nome diverso di variabile a ognuno dei valori, ma facendo in modo che una variabile dello stesso nome sia associata a più di un valore. Altrimenti, il codice risulta ridondante e difficile da mantenere, e poi.... abbiamo previsto 3 variabili per 3 diversi valori.... e se ne abbiamo quattro? Ne prevediamo dieci... e se ce ne sono dodici? Ne prevediamo 20 per sicurezza, e ventuplichiamo la complessità del codice? ;-) Ma.... al solito, non insisto; adesso che ho condiviso l'idea, mi sento a posto e vi considero (ovviamente) liberissimi di pensarci quanto volete e di utilizzarla, eventualmente, come volete. Ciao! --Alex_brollo Talk|Contrib 16:39, 21 lug 2010 (CEST)[rispondi]
a me pare una super genialata. puoi farci vedere un esempio pratico in una sandbox? --Salvo da Palermo dimmelo qui 20:21, 21 lug 2010 (CEST)[rispondi]
Non ventuplichiamo la complessità, ma "solo" la pesantezza del codice e forse le prestazioni (di cui comunque gli amministratori di sistema ci dicono di non preoccuparci); non mi occupo sistematicamente di template ma mi pare che i parametri ripetuti perlopiú siano un semplice copincolla, quindi quando vanno corretti non i vuole moltissimo a incollare anche la correzione n volte. Anche a me piace molto la tua soluzione, non sempre però la soluzione piú brillante è necessariamente la piú adatta a un ambiente wiki. --Nemo 23:01, 21 lug 2010 (CEST)[rispondi]
Il punto è che il codice si ventuplica in ogni caso, solo che invece di
{{{param1}}}, {{{param2}}}, {{{param3}}}
abbiamo
{{#titleparts:{{{param}}}|1|1}}, {{#titleparts:{{{param}}}|1|2}}, {{#titleparts:{{{param}}}|1|3}}
Non potendogli dire "ripetilo N volte" non ci sono i vantaggi di cui sopra. Avrà le sue applicazioni ma non illudiamoci di avere gli array come nei linguaggi di programmazione --Bultro (m) 12:26, 22 lug 2010 (CEST)[rispondi]
Allora, visto che qualcuno ha messo codice, ce lo metto anch'io.
Il primo templatino di servizio è s:Template:Elemento a due parametri, che restituisce l'ennesimo elemento di una sequenza passata come stringa unica, in cui gli elementi sono separati da caratteri /:
{{#titleparts:{{{2|}}}|1|{{{1|}}}}}

e che, abbastanza intuitivamente, si chiama con un codice:

{{elemento|numero|stringa}}

Questo template è utilizzato per semplificare il codice del vero template che "fa qualcosa". Non escludo affatto che possa essere migliorato moltissimo! I miei neuroni non sono mai risultati adeguati a capire (quanto serve veramente) le pagine di "aiuto" sull'uso avanzato dei template. :-(

Un template che "fa qualcosa" per ognuno degli elementi è per esempio s:Template:ArgCat, che si occupa di categorizzare argomenti (da 1 a 5):

{{#if:{{elemento|1|{{{1|}}}}}|{{ArgCat/Cat|{{lc:{{elemento|1|{{{1|}}}}}}}}}
  {{#if:{{elemento|2|{{{1|}}}}}|{{ArgCat/Cat|{{lc:{{elemento|2|{{{1|}}}}}}}}}
    {{#if:{{elemento|3|{{{1}}}}}|{{ArgCat/Cat|{{lc:{{elemento|3|{{{1|}}}}}}}}}
      {{#if:{{elemento|4|{{{1}}}}}|{{ArgCat/Cat|{{lc:{{elemento|4|{{{1|}}}}}}}}}
        {{#if:{{elemento|5|{{{1}}}}}|{{ArgCat/Cat|{{lc:{{elemento|5|{{{1|}}}}}}}}}
        }}
      }}
    }}
  }}
}}

che è un codice "graficamente bello" :-). ArgCat/Cat è ovviamente una routine unica che "fa qualcosa" su ognuno degli elementi che gli viene passato (su source fa una cosa molto complicata, che qui non potete fare perchè su pedia non avete la #lst, nè, mi dicono, avete interesse o intenzione di installarla; ma mettiamo che crei solo una categoria). Il fatto che sia unica ha gli ovvi vantaggi di "coerenza", come ben sa chi maneggia database la ridondanza è una brutta malattia delle basi dati e anche del codice di qualsiasi linguaggio: ripetere due volte lo stesso dato o la stessa riga di codice, lasciando all'umano il compito di "tenere allineate" le cose, è l'anticamera del disastro, o almeno della cefalea. Per chi si domandasse perchè gli #if sono annidati e non sono in sequenza: siccome nell'assoluta maggioranza dei casi ci sono pochi valori (uno o due) l'annidamento degli if fa "uscire" dal ciclo non appena la sequenza dgli elementi è terminata. Se invece fossero in serie, lo sciocco software continuerebbe a eseguire tutti gli eleemnti dello script dal primo al massimo previsto. ;-) --Alex_brollo Talk|Contrib 16:33, 22 lug 2010 (CEST)[rispondi]

Cosa ti impedisce di fare così?
{{#if:{{{param1|}}}|{{ArgCat/Cat|{{lc:{{{param1}}}}}}}
  {{#if:{{{param2|}}}|{{ArgCat/Cat|{{lc:{{{param2}}}}}}}
    {{#if:{{{param3|}}}|{{ArgCat/Cat|{{lc:{{{param3}}}}}}}
      {{#if:{{{param4|}}}|{{ArgCat/Cat|{{lc:{{{param4}}}}}}}
        {{#if:{{{param5|}}}|{{ArgCat/Cat|{{lc:{{{param5}}}}}}}
        }}
      }}
    }}
  }}
}}
la faccenda della routine unica non c'entra niente con la faccenda del titleparts... --Bultro (m) 19:13, 22 lug 2010 (CEST)[rispondi]
Certo! Non c'entra direttamente; ma ha in comune con il discorso che facciamo il fatto di essere una seconda, diversa applicazione del principio generale databasesco "sforzarsi sempre di ottenere la coerenza mediante la riduzione della ridondanza". Quanto agli insiemi, se io riesco a passare al mio parametro unico Argomento= uno o tre o quattro o cinque valori diversi, hai ragione nel dire che il linguaggio template poi non mi consentirà di gestirlo come si deve, ma sta il fatto che sono riuscito a trasformare Argomento nel nome di una primordiale, limitata variabile di tipo array. Fuori dalla teoria e nella pratica: io avevo già scritte qua e là alcune decine di migliaia di chiamate a un template, all'interno delle quali era previsto il passaggio del parametro Argomento; invece di modificare ognuna di quelle decine di migliaia di pagine ognuna contenente una chiamata al template, inserendo dei nuovi parametri Argomento2, Argomento3... ne ho modificata una sola, quella del template, ottenendo lo lo stesso identico risultato. A me, la cosa ha dato soddisfazione.  :-) --Alex_brollo Talk|Contrib 00:35, 23 lug 2010 (CEST)[rispondi]
Non avresti dovuto modificarle nemmeno col metodo tradizionale. Dai su... se l'hanno chiamato "titleparts" e non "array", e se anche i nerd di en.wiki lo usano solo per i titoli, ci sarà un motivo :) --Bultro (m) 01:32, 23 lug 2010 (CEST)[rispondi]
Degli array (migliaia di elementi indipendenti in una sola pagina, chiamabili ciascuno "per nome") mi riservo di parlare un'altra volta. Non appena avrete installato #lst :-P.
Ho capito cosa intendi... confermamelo: tu dici: "avresti potuto aggiungere argomento2=, argomento3=... solo nei template dove ti servivano, lasciando intatti gli altri". Sai cosa ti dico? hai ragione! :-).
Tuttavia... l'uso di #titleparts come "small string parser & converter" è menzionato nella doc su meta della funzione e ha resistito alle revisioni... è ben vero che la nota l'ho introdotta io :-P, ma il fatto che non sia stata cancellata come una sciocchezza in quella pagina piuttosto importante mi rassicura(e non è passata inosservata perchè è stata successivamente editata). Ci vuole coraggio per modificare la doc ufficiale di una ParserFunction, ma non pare che io difetti di boldness. Ciao! Alla prossima! --Alex_brollo Talk|Contrib 06:39, 23 lug 2010 (CEST)[rispondi]