Joomla.it Forum
Componenti per Joomla! => Gestione Form => : klyde 02 Jul 2011, 20:26:04
-
Ciao ragazzi, gestisco un sito dedicato alla telefonia cellulare e vorrei dare ai miei utenti la possibilità di creare un QR Code della propria VCard, ossia un codice nel quele inserire tutti i propri dati come numero di telefono, indirizzo, e-mail ect. ect.
Ho trovato un modulo che permette di realizzare questo tipo di QR Code ma è possibile farlo soltanto da lato Admin, mentre io vorrei dare la possibilità a tutti di farlo.
E' possibile creare un form di questo tipo tramite Chronoform o simili? o magari modificare quello che ho per renderlo fruibile da tutti gli utenti da lato pubblico?
Grazie per l'aiuto.
-
Per essere più chiaro vorrei realizzare una pagina di questo tipo: http://zxing.appspot.com/generator/
come posso fare?
Grazie
-
Penso si può fare.
1) procurarsi un generatore di QR code in php (disponibili in rete)
2) inserire il generatore nel form insieme ai campi da usare nel codice.
Farò alcune prove.
-
grazie mille, te ne sarei molto grato se riuscissi a trovare una soluzione.
Grazie
-
Fatto. Pubblicherò la guida.
-
Grandeeeee!!! aspetto con ansia il link della guida.
Grazie mille!!
-
Ciao Vales, ci sono notizie per la guida?
-
Lavori in corso. ;)
-
Eccolo !
http://www.joomla.it/articoli-della-community-16/5015-creare-i-tuoi-qr-code-in-un-sito-joomla.html
-
Ciao Vales, grazie mille per la guida, ma io sono bloccato all'inizio della stessa, poiché dopo aver acquistato ed installato chronoforms, clikko su "Form Wizard" e poi su Form Settings, ma non succede nulla, rimango sempre sulla scheda "Preview", hai idea del motivo?
-
ho notato che tutti i Tab non funzionanto, quando ci clikko sopra non succede assolutamente nulla.
-
Risolto il problema installando Mootools.
Ho seguito tutta la tua guida ma quando vado a fare una prova ottengo questo messaggio di errore:
Fatal error: Cannot redeclare class QRCode in /home/miodominio/public_html/administrator/components/com_chronoforms/form_actions/custom_code/custom_code.php(17) : eval()'d code on line 2
Dove ho sbagliato?
-
Si, chronoforms v4 vuole mootools attivato.
Controlla che il copia incolla del codice non abbia inserito qualcosa di indesiderato nel codice custom.
-
Niente da fare, ho anche cancellato e incollato nuovamente il codice facendo attenzione a copiarlo bene senza comprendere altri caratteri o spazi vuoti, ma mi dà sempre lo stesso errore!!
-
Prova ad inserire questo è il mio e funziona.
-
Niente da fare, sempre lo stesso problema!!
-
Quale configurazione di sistema hai ? php, joomla, chronoforms, ecc.
-
In che senso "configurazione di sistema"?
-
Versione di php, joomla e chronoforms.
-
Allora, ho le seguenti versioni:
PHP= 5.2.6-1+lenny9
Joomla =1.5.23
Chronoform=4.0 RC1.9 con licenza validata.
-
Sembra tutto OK, ignoro però il significato di lenny9.
La riga 2 del codice è una semplice dichiarazione della classe
class QRCode {
che viene letta normalmente in altri siti ed è una classe PHP di pubblico dominio sul web.
Puoi attaccare ad un post il codice inserito per un ulteriore controllo.
PS. Controlla che quel modulo che stavi usando non sia attivo da qualche parte. Può darsi che usi la stessa classe e quindi trovandola già dichiarata da l'errore.
in questo caso puoi cambiare anche il nome alla classe ed all'istanza successiva.
Così per esempio
class QRCodes {
....
....
$qrcode = new QRCodes();
-
Stesso problema risolto con...
if(class_exists('QRCode') != true)
{
class QRCode {
......
}
}
....
-
Ciao Vales, ho risolto eliminando il modulo precedente per la generazione del qr code, ma adesso non mi da più l'errore, ma dopo aver cliccato su "Submit" mi si riapre semplicemente la stessa pagina senza generare l'immagine.
-
Non ho idea dei motivi del tuo problema. Forse hai inserito caratteri strani nel campo da codificare ? Prova con una sola parola.
-
Stesso problema risolto con...
if(class_exists('QRCode') != true)
{
class QRCode {
......
}
}
....
Benvenuto nella comunità italiana di Joomla alegmartiz,
si, anche quella che hai proposto è un'elegante e buona soluzione. Grazie per averla condivisa.
-
A me non funziona, se vuoi darci uno sguardo la pagina è questa : http://www.cellularihitech.it/option,com_chronoforms/index.php?option=com_chronoforms&chronoform=QR_code
-
Stesso problema risolto con...
if(class_exists('QRCode') != true)
{
class QRCode {
......
}
}
....
ma questo codice dove andrebbe inserito?
-
Nel Field name del campo del codice hai inserito "Testo" devi mettere "testo" tutto minuscolo come indicato nella guida. Era lui il problema.
-
Grazie vales, adesso funziona, ma come avevo scritto all'inzio di questo thread il mio obiettivo è quello di poter realizzare delle Vcard come in questo sito http://zxing.appspot.com/generator/ per ottenere dei qr code come questo che allego. è possibile?
[allegato vecchio più di un anno eliminato da un amministratore]
-
Se inserisci quel testo ti codificherà quello.
Se i dati sono in un database basta modificare un po' il form per prendere quei campi e codificarli.
Oppure fai un form con i campi nome, cognome, indirizzo, ecc e gli assembli tutti nel codice. Non vedo il problema.
-
Quindi se creo un form con i campi di testo nome, indirizzo, telefono ect. , dici che automaticamente sarà riconosciuto come una vCard ? Io credevo che doveva avere un'impostazione particolare. Ok ora ci provo e ti faccio sapere. Grazie mille per il tuo aiuto!!!
-
Ho provato ad inserire nel form così com'è dati quali Nome, cognome, cell, ect., ma ovviamente il cellulare non riconosce il codice come vCard, ma semplicemente come del testo. Ho provato a creare dei campi con Nome Indirizzo, telefono ect, ma cosi il form non funziona più, evidentemente va modificato anche il codice php. Secondo me comunque il codice deve dare delle informazioni al cellulare dicendogli che si tratta di una vCard e non di semplice testo.
-
Se inserisci i campi di testo il QRcode restituisce campi di testo.
Se inserisci l'indirizzo di una Vcard ottieni il link ad essa che poi il cellulare trasforma in link da visitare.
-
Ma io non voglio inserire un indirizzo ad un vCard , ma voglio crarla, ossia voglio creare un qr code che restituisca un biglietto da visita elettronico che il cellulare lo riconosca come tale. Hai provato a leggere l'immagine che ho allegato qualche post prima? Vedrai che il cellulare va in automatico in modalità di aggiunta di un nuovo contatto.
-
Ok, ci siamo, facendo mille prove e ricerche ho capito che per essere riconosciuto come una vCard il codice deve avere le seguenti caratteristiche:
BEGIN:VCARD
VERSION:2.1
N: Nome e cognome
ADR: indirizzo del contatto
TEL: numero telefonico
URL: indirizzo internet
EMAIL: indirizzo email
END:VCARD
Cosi composto il codice restituisce una vCard , ora peró bisogna adattare il form. Come si fa?
-
Penso potresti provare a modificare più o meno in questo modo la parte finale del codice del form.
$codice=JRequest::getVar('nome','','post');
if ($codice<>"") {
$codice="BEGIN:VCARD\n";
$codice.="VERSION:2.1\n";
$codice.="N: ".JRequest::get('nome','','post')." ".JRequest::get('cognome','','post')."\n";
$codice.="ADR: ".JRequest::get('indirizzo','','post')."\n";
$codice.="TEL: ".JRequest::get('telefono','','post')."\n";
$codice.="URL: ".JRequest::get('web','','post')."\n";
$codice.="EMAIL: ".JRequest::get('mail','','post')."\n";
$codice.="END:VCARD\n";
$qrcode = new QRCode();
$qrcode->setData($codice);
$qrcode->setOutputEncoding(QRCode::$_ENCODING_UTF8);
$qrcode->setOutPutFormat(QRCode::$_OUTPUT_FORMAT_PNG);
//$content = $qrcode->getContentsForPost();
$content = $qrcode->getUrlQuery();
echo $codice."<br/>";
echo '<img src="'.$content.'">';
}
I nomi dei campi da usare dovrebbero essere quelle delle Jrequest oppure modifichi di conseguenza.
Ho messo il controllo sul campo nome, quando è nullo non mostra il codice. Ma puoi adottare un altro criterio.
-
Ho modificato il codice come mi hai consigliato, ma l'immagine che ottengo mi da una vCard con tutte le voci compilate con la parola "Array". Come mai?
-
posta il codice del form.
-
Il codice modificato è questo:
<?php
class QRCode {
public static $_ENCODING_UTF8 = "UTF-8";
public static $_ENCODING_Shift_JIS = "Shift_JIS";
public static $_ENCODING_ISO_8859_1 = "ISO-8859-1";
public static $_OUTPUT_FORMAT_PNG = "png";
public static $_OUTPUT_FORMAT_GIF = "gif";
private $baseUrl = "http://chart.apis.google.com/chart";
private $width=300;
private $height=300;
private $map = array();
function __construct() {
$this->map['cht']="qr";
$this->map['chs']=$this->width."x".$this->height;
$this->map['chof'] = QRCode::$_OUTPUT_FORMAT_PNG;
}
public function setOutputEncoding($type) { $this->map['choe'] = $type; }
public function setOutputFormat($type) { $this->map['chof'] = $type; }
public function getOuputFormat() { return $this->map['chof']; }
public function setData($data) { $this->map['chl'] = urlencode($data);}
public function setImageSize($width, $height) { $this->map['chs'] =
$width."x".$height; }
public function setMargin($margin) { $this->map['chld'] = $margin; }
public function getMap() { return $this->map; }
public function setErrorCorrectionLevel($errorCorrectionLevel) {
$this->map['chld'] = $errorCorrectionLevel;
}
public function getUrlQuery() {
return $this->baseUrl."?".$this->getQuery();
}
public function getQuery() {
$query = "";
$keys = array_keys($this->map);
$i = 0;
$length = count($this->map);
foreach($keys as $key) {
$query .= $key."=".$this->map[$key];
$i++;
if($i<$length) $query.="&";
}
return $query;
}
public function getContentsForGet() {
return file_get_contents($this->baseUrl."?".$this->getQuery());
}
public function getContentsForPost() {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->baseUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("accept: image/png"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$this->getQuery());
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if($info['http_code'] == 200) {
return $output;
}
return $info['http_code'];
}
}
$codice=JRequest::getVar('nome','','post');
if ($codice<>"") {
$codice="BEGIN:VCARD\n";
$codice.="VERSION:2.1\n";
$codice.="N: ".JRequest::get('nome','','post')." ".JRequest::get('cognome','','post')."\n";
$codice.="ADR: ".JRequest::get('indirizzo','','post')."\n";
$codice.="TEL: ".JRequest::get('telefono','','post')."\n";
$codice.="URL: ".JRequest::get('web','','post')."\n";
$codice.="EMAIL: ".JRequest::get('mail','','post')."\n";
$codice.="END:VCARD\n";
$qrcode = new QRCode();
$qrcode->setData($codice);
$qrcode->setOutputEncoding(QRCode::$_ENCODING_UTF8);
$qrcode->setOutPutFormat(QRCode::$_OUTPUT_FORMAT_PNG);
//$content = $qrcode->getContentsForPost();
$content = $qrcode->getUrlQuery();
echo $codice."[br /]";
echo '<img src="'.$content.'">';
}
?>
... un'altra cosa, produce il codice, sopra all'immagine c'è tutto il testo che è stato inserito e per cui è stata creata l'immagine, ma assieme ai vari dati inseriti dall'utente compare anche "BEGIN:VCARD" e "EDN:VCARD", è possibile evitare che questa parte di testo non venga riportata?
Il form modificato puoi vederlo in funzione qui: http://www.cellularihitech.it/option,com_chronoforms/Itemid,100161.html
-
Volevo vedere il codice dei campi. Il mio funziona.
-
Scusa vales, ma da dove lo prendo il codice dei campi? sicuramente sono domande banali per te, ma io non conosco bene chronoforms, lo sto usando adesso per la prima volta.
-
Non importa l'ho visto nel sorgente pagina.
Manca il campo cognome. Forse è l'errore provocato dalla sua assenza.
-
Niente da fare, sembra che non legga i dai immessi nel form, infatti se provi a generare un immagine vedrai che sopra l'immagine generata c'è la lista dei dati inseriti, e al loro posto troverai "Array" , "Array" ....
-
Eccolo
<?php
class QRCode {
public static $_ENCODING_UTF8 = "UTF-8";
public static $_ENCODING_Shift_JIS = "Shift_JIS";
public static $_ENCODING_ISO_8859_1 = "ISO-8859-1";
public static $_OUTPUT_FORMAT_PNG = "png";
public static $_OUTPUT_FORMAT_GIF = "gif";
private $baseUrl = "http://chart.apis.google.com/chart";
private $width=150;
private $height=150;
private $map = array();
function __construct() {
$this->map['cht']="qr";
$this->map['chs']=$this->width."x".$this->height;
$this->map['chof'] = QRCode::$_OUTPUT_FORMAT_PNG;
}
public function setOutputEncoding($type) { $this->map['choe'] = $type; }
public function setOutputFormat($type) { $this->map['chof'] = $type; }
public function getOuputFormat() { return $this->map['chof']; }
public function setData($data) { $this->map['chl'] = urlencode($data);}
public function setImageSize($width, $height) { $this->map['chs'] = $width."x".$height; }
public function setMargin($margin) { $this->map['chld'] = $margin; }
public function getMap() { return $this->map; }
public function setErrorCorrectionLevel($errorCorrectionLevel) {
$this->map['chld'] = $errorCorrectionLevel;
}
public function getUrlQuery() {
return $this->baseUrl."?".$this->getQuery();
}
public function getQuery() {
$query = "";
$keys = array_keys($this->map);
$i = 0;
$length = count($this->map);
foreach($keys as $key) {
$query .= $key."=".$this->map[$key];
$i++;
if($i<$length) $query.="&";
}
return $query;
}
public function getContentsForGet() {
return file_get_contents($this->baseUrl."?".$this->getQuery());
}
public function getContentsForPost() {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->baseUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("accept: image/png"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$this->getQuery());
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if($info['http_code'] == 200) {
return $output;
}
return $info['http_code'];
}
}
$codice=JRequest::getVar('nome','','post');
if ($codice<>"") {
$codice="BEGIN:VCARD\n";
$codice.="VERSION:2.1\n";
$codice.="N: ".JRequest::getVar('nome','','post')." ".JRequest::getVar('cognome','','post')."\n";
$codice.="ADR: ".JRequest::getVar('indirizzo','','post')."\n";
$codice.="TEL: ".JRequest::getVar('telefono','','post')."\n";
$codice.="URL: ".JRequest::getVar('web','','post')."\n";
$codice.="EMAIL: ".JRequest::getVar('mail','','post')."\n";
$codice.="END:VCARD\n";
$qrcode = new QRCode();
$qrcode->setData($codice);
$qrcode->setOutputEncoding(QRCode::$_ENCODING_UTF8);
$qrcode->setOutPutFormat(QRCode::$_OUTPUT_FORMAT_PNG);
//$content = $qrcode->getContentsForPost();
$content = $qrcode->getUrlQuery();
echo "N: ".JRequest::getVar('nome','','post')." ".JRequest::getVar('cognome','','post')."<br/>";
echo "ADR: ".JRequest::getVar('indirizzo','','post')."<br/>";
echo "TEL: ".JRequest::getVar('telefono','','post')."<br/>";
echo "URL: ".JRequest::getVar('web','','post')."<br/>";
echo "EMAIL: ".JRequest::getVar('email','','post')."<br/>"."<br/>"."<br/>";
echo '<img src="'.$content.'">';
//echo '<img src="data:image/png;base64,'.base64_encode($content).'">';
//file_put_contents("C:\wamp\www\joomla16\prova.png", $content);
}
?>
C'era alcune VAR rimaste a casa. Ho sistemato anche la visualizzazione del testo inviato.
-
Grande vales, adesso funziona perfettamente, anche le informazioni vengono riportata in modo più ordinato, è possibile evitare che vengano mostrati le voci "N", "ADR" ect.?
-
Bene, allora puoi mettere risolto nel primo post.
Se vuoi togliere i prefissi basta che li calcelli dalle echo aggiunte nell'ultima modifica subito prima di JRequest, punto compreso.
-
Perfetto, grazie mille di tutto sei stato gentilissimo e molto paziente. Grazie
-
C'è ancora un piccolo problema, ossia, l'indirizzo non viene letto da tutti i lettori perché non rispetta lo standard richiesto che è: ADR:;;Street address;city;state;zip;country
Quindi ho cambiato il codice così:
$codice.="ADR:;;".JRequest::getVar('via_home','','post').";".JRequest::getVar('city_home','','post').";".JRequest::getVar('stato_home','','post').";".JRequest::getVar('zip_home','','post')."\n";
ma non lo accetta ancora, per inserire il ; tra un campo e l'altro è giusto come ho fatto io?
-
Nessuna idea?
-
Il codice sembrerebbe corretto. Che reazione ti mostra?
-
Adesso funziona, forse era in cache il vecchio codice. Come faccio per ottenere un'immagine un po' più grande?
-
Trovato, ora funziona tutto perfettamente grazie di cuore per il tuo aiuto e la tua pazienza!!!
-
C'è modo di fargli ignorare i campi lasciati vuoti?
-
Occorre un if che trasformi ogni campo passato in una variabile uguale al contenuto del campo + ";" ed in caso di contenuto del campo vuoto la variabile resta vuota, dovresti risolvere.
-
Per piacere potresti farmi un esempio in modo che possa copiare il codice?
-
Penso dovrebbe essere qualcosa di simile a questo
if (JRequest::getVar('via_home','','post')<>"") {
$via_home=JRequest::getVar('via_home','','post').";";
} else {
$via_home="";
}
if (JRequest::getVar('city_home','','post')<>"") {
$via_home=JRequest::getVar('city_home','','post').";";
} else {
$city_home="";
}
if (JRequest::getVar('stato_home','','post')<>"") {
$via_home=JRequest::getVar('stato_home','','post').";";
} else {
$stato_home="";
}
if (JRequest::getVar('zip_home','','post')<>"") {
$via_home=JRequest::getVar('zip_home','','post');
} else {
$zip_home="";
}
$codice.="ADR:;;".$via_home.$city_home.$stato_home.$zip_home."\n";
-
Ciao Vales rieccomi a darti fastidio, hai avuto un po' di tregua perché ero in vacanza ;D !!!
Il codice che mi hai dato in quale punto va inserito?
Grazie.
-
Ora non mi ricordo bene, ma credo prima della riga che crea ADR ed inoltre sostituisce la vecchia creazione di ADR
questo è il codice corretto. L'altro aveva delle imprecisioni.
if (JRequest::getVar('via_home','','post')<>"") {
$via_home=JRequest::getVar('via_home','','post').";";
} else {
$via_home="";
}
if (JRequest::getVar('city_home','','post')<>"") {
$city_home=JRequest::getVar('city_home','','post').";";
} else {
$city_home="";
}
if (JRequest::getVar('stato_home','','post')<>"") {
$via_home=JRequest::getVar('stato_home','','post').";";
} else {
$stato_home="";
}
if (JRequest::getVar('zip_home','','post')<>"") {
$zip_home=JRequest::getVar('zip_home','','post');
} else {
$zip_home="";
}
$codice.="ADR:;;".$via_home.$city_home.$stato_home.$zip_home."\n";
-
Ciao Vales, ho sostituito il codice che mi hai dato con la riga che generava il codice ADR, ma i campi vuoti continuano ad essere inseriti nel codice.