Tumgik
michelewebdev · 7 years
Text
Skyrim Herbarium: an alchemy compendium
Ho completato il database dell'erbario di SKYRIM e DLC ufficiali (DragonBorn e DragonGuard). Con una comoda e rapida interfaccia web all'indirizzo SKYRIM HERBARIUM è possibile ricercare ingredienti o effetti.
Nella pagina di ogni ingrediente, oltre alla foto, si possono consultare gli effetti e trovare tutti gli altri ingredienti compatibili con cui creare le pozioni. Viceversa ricercando un particolare effetto vengono elencati tutti gli inredienti coinvolti.
ATTIVA LA VERSIONE INGLESE! English version in ONLINE!
I hope someone can send me translations in other languages!
In arrivo anche informazioni aggiuntive sugli ingredienti, ad esempio come e dove trovarli...
Ovviamente accetto consigli ed eventuali aggiustamenti.
Buon gioco a tutti!
0 notes
michelewebdev · 7 years
Text
New Software: Audio/Video transcoding/muxing + MXF utility (P2 card converter)
  In azienda abbiamo delle videocamere digitali HD che salvano i contenuti audio/video su schede P2 (non si tratta di logge massoniche, ma di schede flash più grandi e pesanti delle SD, che possono contenere 32 GB e oltre) in formato MXF.
Dopo ogni ripresa effettuata dai nostri operatori il contenuto delle P2 viene di solito dato in pasto a software di montaggio video, come ad esempio AVID, o Premiere, quindi ci pensa il montatore. A volte però ci capita di dover "impacchettare" il tutto in poco tempo e consegnarlo a un cliente, anche in assenza del montatore. In questi casi viene richiesto il mio aiuto, ma non avendo domestichezza con i software di montaggio ricorro ad altri software che permettono di convertire file MXF e creare un file audio/video che sia leggibile su qualunque computer o dispositivo.
È facile trovare in rete dei software con semplici interfacce grafiche che leggono e convertono file MXF (magari anche pagandoli poche decine di Euro, non è quello il problema), il problema è che in queste schede P2 i file MXF sono salvati in modo particolare: un file MXF che contiene il video sta in una cartella, i file che contengono l'audio si trovano in altre cartelle. Addirittura i singoli canali audio (destro e sinistro) sono registrati in file diversi, per non parlare del fatto che i file non possono essere piú grandi di 2 GB, quindi le singole scene sono divise in piú file. Insomma una vera e propria giungla!
Non sono riuscito a trovare un software che con pochi click mette insieme tutti i pezzi e crea un file video completo, quindi fino ad oggi ho usato l'onnipotente FFMPEG con l'ausilio di MP4 BOX. Questi sono software a riga di comando, il primo in particolare riesce a leggere qualsiasi formato e convertirlo in qualsiasi altro formato, il secondo serve per attaccare o tagliare singoli file MP4. Per arrivare al risultato finale è necessario eseguire vari comandi, tanti FFMPEG quanti sono i pezzi di video, e un MP4 BOX per attaccarli. Ogni singolo comando è particolarmente complesso perchè richiede l'utilizzo di parametri (filtri) per mettere insieme le varie componenti di ogni singolo pezzo, cioè una traccia video e 2 tracce audio.
Stanco di dover scrivere ogni volta un file BAT che richiedeva molto tempo, ho sviluppato una semplicissima GUI (interfaccia grafica) che con 2 click fa tutto il lavoro. Scegliendo infatti la cartella contenente i file della scheda P2 (o il drive della scheda) il programmino scrive ed esegue automaticamente il file BAT. Ovviamente ci sono tutte le opzioni necessarie per configurare l'output (dimensione, bitrate, ecc...).
La chicca è che questa interfaccia non è esclusivamente utilizzabile per le schede P2, ma può essere usata per caricare uno o piú file audio/video per creare un unico file MP4
Chi fosse interessato può contattarmi al mio indirizzo email [email protected] per una dimostrazione o maggiori informazioni. Per il momento chiedo un consiglio sul nome da dargli :)
At work we have the HD digital camcorders that save audio/video contents on P2 cards in MXF format.
After each shot performed by our operators the content of P2 is usually fed to the video editing software, such as Avid, or Premiere. But sometimes it happens to have to "pack" all in a short time and deliver it to a customer, even without the editor. In these cases my help is needed, but not having familiarity with the editing software I use other software that allow to convert MXF files and create an audio/video file that is readable on any computer or device.
You can easily find software on the net with simple graphical user interfaces that read and convert MXF files (maybe even paying them a few tens of euros), the problem is that in these P2 card MXF files are saved in a special way: an MXF file containing the video is in a folder, files that contain audio are located in other folders. Even the individual audio channels (left and right) are recorded in different files, furthermore the files can not be more than 2GB, then the individual scenes are divided into more files. In short, a real jungle!
I could not find a software that allows to puts all the pieces together and build a complete video file, and so far I have used the powerful FFMPEG and MP4 BOX. These are command line software, the first in particular is able to read any format and convert it to any other format, the second attaches or cuts individual MP4 files. To get the final result you need to execute various commands and each single command is especially complex because it requires the use of parameters (filters) to put together the various components of each piece, ie one video track and two audio tracks.
Tired of writing each time a BAT file that required a long time, I have developed a very simple GUI (graphical user interface) that with 2 clicks does all the work. In fact, choosing the folder containing all the MXF structure the small software writes and runs the BAT file. Of course there are all the necessary options to configure the output (size, bitrate, etc ...).
Another good thing is that this interface is not only used for the P2 cards, but it can be used to load any audio/video files to create a single MP4 file
Anyone interested can contact me at my email address [email protected] for a demonstration or more information. For now I ask for a name to give to it :)
0 notes
michelewebdev · 8 years
Text
Etichette coi fiocchi per i nostri blocchi con i CSS3
Per spiegare l'obiettivo di questo post vado subito a mostrare il risultato finale, visto che a parole sarebbe piú difficile
ETICHETTA
Blocco con testi e contenuti che voglio
In pratica abbiamo messo sotto alla semplice etichetta un triangolino piú scuro che dà l'effetto fiocco usando solamente i CSS3, senza scomodare photoshop. In questo modo possiamo cambiare forma, colore e dimensione alle nostre etichette e fiocchi in un batter d'occhio.
Passiamo subito al codice, iniziamo con l'HTML
<div class="blocco"> <div class="etichetta"> <label>ETICHETTA</label> </div> <p class="contenuto"><b>Blocco con testi<br></b>e contenuti che voglio</p> </div>
E infine i CSS
<style> .blocco { position: relative; width: 200px; height: 200px; background: #ddd; padding: 10px; } .etichetta { display: block; position: absolute; top: 5px; left: -5px; background: #607a9b; padding: 3px 5px; } .etichetta label { color: #fff; } .etichetta:before { content: ""; line-height: 0; display: block; width: 0; height: 0; border-top: 6px solid #405a7b; border-left: 6px solid transparent; position: absolute; top: 100%; left: 0; } .blocco .contenuto { margin-top: 30px; } </style>
FATTO!
Da notare la position:relative al blocco, importantissima per posizionare l'etichetta nel modo corretto. All'occorrenza va bene anche absolute o fixed, l'importante è che ci sia.
Trucco per fare il triangolo è usando esclusivamente i bordi, mentre width e height sono a zero. Per modificare le dimensioni e la forma basta giocare un po' con i parametri dei bordi.
Se non si vuole usare il :before possiamo mettere un DIV all'interno dell'etichetta con una classe, ad esempio triangolo, ed impostare tutto lo stile alla classe. In tal modo rendiamo il tutto compatibile con CSS2, ma il triangolino non sarà piú una caratteristica intrinseca della nostra etichetta ;)
0 notes
michelewebdev · 9 years
Text
Personalizziamo le scrollbar come Facebook con nanoscroller... e un piccolo fix
Il modo migliore per inserire un testo (o ipertesto) di lunghezza variabile in un riquadro di dimensioni fisse, o comunque non molto grandi, è certamente quello di utilizzare i blocchi con lo scroll:
<style> #blocco { width: 300px; height: 300px; overflow: auto; } </style> <div id="blocco"> <p>Questo è il blocco di testo con le scrollbars (se necessarie)</p> </div>
L'unico inconveniente è che le scrollbar non sono configurabili nell'estetica, quindi ogni browser ci mette del suo e di solito il risultato non è dei migliori.
Ecco che ci viene in soccorso un plugin di jQuery: nanoscroller, semplice da usare, versatile, personalizzabile, leggero.
Una volta scaricato abbiamo solamente 2 file da aggiungere alle nostre pagine web, il js e il css
<script src="jquery/jquery.nanoscroller.min.js" type="text/javascript"></script> <link rel="stylesheet" href="jquery/nanoscroller.css" type="text/css" charset="utf-8">
Per utilizzarlo basta racchiudere il nostro testo in un doppio contenitore con le apposite classi nano e nano-content
<style> .nano { width: 300px; height: 300px; } </style> <div class="nano"> <div class="nano-content">Questo è il nostro testo</div> </div>
quindi attivare il plugin nell'evento ready
<script> $(document).ready(function(){ $('.nano').nanoScroller({preventPageScrolling: true, alwaysVisible: true}); }); </script>
Ecco il risultato:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
In questo caso ho utilizzato due opzioni, quella per evitare lo scrolling della pagina quando quello del blocco è terminato (indispensabile per i touch-screen) e quello per lasciarla sempre visibile (altrimenti apparirebbe quando si passa col mouse sul blocco). Comunque ce ne sono molte altre di opzioni e vi rimando alla pagina ufficiale per vederle.
Piccolo Fix per Explorer e Firefox
Su alcune versioni di Internet Explorer e Firefox potete incontrare un piccolo bug per cui si vede un pezzo della scrollbar originale del browser. Per correggerlo basta una modifica al file css, aggiungendo gli attributi margin e padding alla classe .nano .nano-content
.nano .nano-content { position : absolute; overflow : scroll; overflow-x : hidden; top : 0; right : 0; bottom : 0; left : 0; margin: 0px; padding: 0px 15px 0px 0px; }
Potete scaricare il file corretto a questo link: File css corretto per nanoscroller
0 notes
michelewebdev · 9 years
Text
Tema approvato!
Il tema che sto utilizzando in questo blog è stato approvato dallo staff Tumblr, quindi vi terrò aggiornati sulla sua evoluzione.
Potete trovarlo a questo indirizzo: https://www.tumblr.com/theme/39597
Giusto stamattina ho apportato un paio di modifiche per la corretta visualizzazione con l'opzione "Place timestamp in left column" (che tengo attivata attualmente). Ho inviato le modifiche e credo che entro domani sera verrà aggiornato.
Ho sviluppato questo tema per evitare l'opzione "Usa tema mobile di default". Infatti come potete verificare è completamente responsive grazie ad una media-query.
Inoltre è installata e configurata la lightbox magnific-popup, di cui ho parlato nel post precedente.
Sto cercando un modo per inserire una tag cloud senza utilizzare script esterni, accetto suggerimenti!
0 notes
michelewebdev · 9 years
Text
Un paio di trucchi per Magnific-Popup, una magnifica lightbox, ovviamente, per jQuery
Uno strumento che non può mancare in qualsiasi sito web è certamente la lightbox, utile per mostrare in modo elegante non solo le foto e i video, ma qualsiasi tipo di contenuto, come un'intera pagina html. Inoltre ormai sono anche responsive, quindi fanno bene il loro lavoro sugli smartphone, permettendo ad esempio di mostrare gallerie di foto rimanendo nella pagina principale.
Magnific-Popup è una jQuery lightbox, che ha come punti di forza le performance (solo JS e CSS, niente immagini), la versatilità, l'eleganza, e l'alto grado di adattabilità a tutti i tipi di schermi.
Visitando il sito ufficiale si nota subito la molteplicità dei modi in cui possiamo usarla: adatta per foto, video (ottimizzata per YouTube e Vimeo ma supporta qualsiasi tipo di player), codice HTML in linea, contenuto Ajax, iFrame...
Download e configurazione
Per prima cosa dobbiamo scricare i file necessari, consiglio di cliccare su Build Tool nel menu della Home page del sito ufficiale, quindi scaricare il file CSS (o il SASS per chi lo preferisce), selezionare le varie funzionalità che ci servono e cliccare Generate build. Salviamo tutto il contenuto generato in un file js. Mettiamo tutti i file a disposizione della nostra pagina HTML e iniziamo a scrivere i tag necessari nell'HEAD:
<link rel="stylesheet" href="jquery/magnific-popup.css" type="text/css" charset="utf-8"> <script src="jquery/jquery-1.7.2.min.js" type="text/javascript"></script> <script src="jquery/magnific-popup.js" type="text/javascript" charset="utf-8"></script>
Notate che nel mio caso ho posizionato i file nella cartella jquery. Fondamentale è richiamare prima il file js di jQuery poiché i caricamenti degli script sono sincroni.
Altro codice fondamentale è quello per inizializzare l'oggetto
<script type="text/javascript"> $(document).ready(function(){ $('.mfp-image').magnificPopup({type:'image'}); $('.photogallery').each(function() { $(this).magnificPopup({ delegate: 'a' ,type: 'image' ,gallery: {enabled:true} ,preload: [2,2] }); }); $('.mfp-video').magnificPopup({type:'iframe'}); $('.mfp-iframe').magnificPopup({type:'iframe'}); }); </script>
In genere viene messo in fondo alla pagina, ma, grazie all'evento ready è possibile posizionarlo ovunque.
Questa è la mia configurazione preferita, molto semplice ed efficace. Vediamo quindi qualche esempio di elementi HTML per metterla in funzione.
Esempi di ulitizzo
Iniziamo con l'ingrandimento di singole foto
<a href="foto/mia-foto.jpg" class="mfp-image">Clicca per mostrare la foto</a> <a href="foto/altra-foto.jpg" class="mfp-image"><img src="foto/altra-foto.jpg" style="width:50px" alt="Clicca per ingrandire"></a>
Ora se avessimo qualche foto da assegnare ad una galleria:
<ul class="photogallery"> <li><a href="galleria/foto01.jpg">foto 01</a></li> <li><a href="galleria/foto02.jpg">foto 02</a></li> <li><a href="galleria/foto03.jpg">foto 03</a></li> <li><a href="galleria/foto04.jpg">foto 04</a></li> <li><a href="galleria/foto05.jpg">foto 05</a></li> </ul>
Tutte le foto nel blocco fanno parte della stessa galleria, quando clicchiamo su una si apre la lightbox e possiamo andare avanti o indietro. Inoltre, se osserviamo la nostra configurazione, abbiamo anche attivato la funzione di preload, in particolare vengono precaricate le 2 foto precedenti e le 2 successive a quella che sto visualizzando. Ecco un test
Andiamo avanti con un video
<a href="https://www.youtube.com/watch?v=w1f6o1HQBvg" class="mfp-video">Guarda il video</a>
Magnific-Popup riconosce il link di YouTube e mostra immediatamente il player in embed, niente di piú facile, testiamolo subito: Guarda il video
Ma arriviamo alla parte piú interessante
Gli iFrame
Gli iFrame sono una modalità che utilizzo molto spesso con le lightbox, il funzionamento è banale
<a href="altra-pagina.html" class="mfp-iframe">Mostra altra pagina</a>
La pagina html specificata nel link verrà mostrata allo stesso modo. Qui c'è il primo problema da affrontare: a differenza dei contenuti in linea (invito a vedere la documentazione, non sto qui a spiegare tutte le modalità) dove posso specificare le dimensioni del blocco a cui Magnific-Popup si adeguerà, per gli iFrame non posso impostare le dimensioni attraverso la configurazione o gli attributi dei vari tag usati. Per ottenere le dimensioni desiderate devo andare a modificare a mano gli stili.
Ridimensionare la lightbox
Magnific-Popup genera vari layer nei quali inserisce le foto, video o iframe da visualizzare. Quello su cui bisogna agire ha la classe mfp-content e dobbiamo modificare height e max-width. Possiamo farlo con un semplice comando jQuery:
<script type="text/javascript"> $('.mfp-content').css({maxWidth:'700px',height:'180px'}); </script>
Il comando può essere eseguito subito dopo l'apertura della lightbox, per questo io preferisco metterlo nella stessa pagina che viene mostrata al suo interno (nel nostro esempio il file altra-pagina.html). Questo mi offre 2 vantaggi: il primo è che il comando verrà eseguito senza dover impostare altri eventi, inoltre in questo modo posso impostare le dimensioni in base alla pagina, e se dovessi navigare sempre all'interno della lightbox le dimensioni cambierebbero al cambio di ogni pagina.
Per fare questo il comando va cosí modificato
<script type="text/javascript"> if(parent && parent.$('.mfp-content').length) { parent.$('.mfp-content').css({maxWidth:'700px',height:'180px'}); } </script>
La lightbox si trova infatti nella finestra parent rispetto alla pagina visualizzata nell'iFrame.
Possiamo applicare anche un'elegante animazione:
<script type="text/javascript"> if(parent && parent.$('.mfp-content').length) { parent.$('.mfp-content').animate({maxWidth:'700px',height:'300px'}, 500); } </script>
Molto utile quando si naviga nell'iFrame: al cambio di pagina la lightbox si ridimensiona con l'animazione che, nel nostro caso, dura mezzo secondo.
Se vogliamo essere pignoli sarebbe meglio tenere nascosto il contenuto della nostra pagina finché l'animazione non è finita:
<script type="text/javascript"> if(parent && parent.$('.mfp-content').length) { parent.$('.mfp-content').animate({maxWidth:'700px',height:'180px'}, 500, function() { document.getElementById('content-wrapper').style.visibility = 'visible'; }); } else { document.getElementById('content-wrapper').style.visibility = 'visible'; } </script>
Dove content-wrapper è l'ID del blocco che dovrà racchiudere tutto il contenuto di altra-pagina.html in questo modo:
<div id="content-wrapper" style="visibility:hidden"> contenuto </div>
Vediamo subito il risulato finale: Apri la pagina!
Last but not least
Un'ultima cosa per cui preferisco Magnific-Popup a molte altre lightbox: si presta molto bene allo zoom sugli smartphone. Quando si apre una foto su uno smartphone spesso si ha bisogno di vederne meglio i dettagli, per fare questo bisogna utilizzare lo zoom del dispositivo. Per permettere che lo zoom funzioni su una foto già ingrandita a tutto schermo nella lightbox bisogna assicurarsi che il tag per la configurazione del viewport sia esente dal max-scale. Ad esempio io uso questo:
<meta name="viewport" content="width=device-width, initial-scale=1" />
se aggiungessimo max-scale=1 lo zoom non funzionerebbe.
Con questo è tutto, buona lightbox a tutti!
0 notes
michelewebdev · 9 years
Text
Inviamo email in modo professionale con PHP e mettiamole in "posta inviata"
Ormai in tutti i siti internet e applicazioni web è indispensabile disporre di un sistema di invio email automatico, ad esempio per il classico form di contatto, oppure per l'iscrizione degli utenti, ecc.
Per semplicità si usa spesso la funzione mail() di PHP che sfrutta Sendmail; in questo caso è il web server stesso che si occupa di consegnare il messaggio al server di posta del destinatario, detto in modo molto semplice. Questo però comporta il rischio che il messaggio venga bloccato da un sistema antispam. Ultimamente infatti molti sistemi antispam (ad esempio quello di Google) segnano come spam la maggior parte dei messaggi inviati tramite web server o smtp anonimi. Sendmail è effettivamente un sistema di invio anonimo.
È bene quindi utilizzare un altro sistema, come il classico SMTP autenticato. E perché non fare in modo che l'email inviata automaticamente con lo script PHP non venga inserita nella nostra cartella della posta inviata?
Requisiti
Possiamo fare tutto ciò disponendo di una casella di posta accessibile senza restrizioni tramite credenziali (user e password) e che supporti il protocollo IMAP. Ad esempio un account GMail va piú che bene, ma vanno bene anche le caselle offerte da un semplice hosting Aruba, giusto per citarne uno. Basta conoscere l'indirizzo del server SMTP (ad esempio quello di GMail è smtp.gmail.com), la username e la password. Inoltre abbiamo bisogno delle classi PHP specifiche per le email, nel nostro caso PHPMailer.
Dopo aver scaricato il pacchetto e sistemati i file delle classi (ne servono solo 2: class.phpmailer.php e class.smtp.php) insieme al nostro script possiamo iniziare l'implementazione.
Implementazione
Per prima cosa richiamiamo la classe e creiamo l'oggetto PHPMailer.
require_once 'class.phpmailer.php'; class PHPMailer_custom extends PHPMailer { public function get_mail_string() { return $this->MIMEHeader.$this->MIMEBody; } } $mail = new PHPMailer_custom();
Notiamo subito che in realtà abbiamo creato una classe estensione dell'originale, poiché piú tardi avremo bisogno di accedere agli attributi MIMEHeader e MIMEBody che sono privati. Comunque quello che conta adesso sta in $mail che racchiude l'istanza di PHPMailer. Definiamo quindi i parametri fondamentali:
$mail->IsSMTP(); $mail->SMTPAuth = true; $mail->SMTPSecure = 'ssl'; $mail->Host = 'smtp.dominio.com'; $mail->Port = 465; $mail->Username = 'la_mia_username'; $mail->Password = 'la_mia_password'; $mail->IsHTML(true); $mail->From = '[email protected]'; $mail->AddReplyTo('[email protected]'); $mail->FromName = 'Michele';
I parametri appena descritti indicano che sto per utilizzare un server SMTP, il quale richiede autenticazione e utilizza una connessione protetta da un certificato SSL (che come porta standard usa la 465). Ho usato come esempio queste impostazioni perché sono le stesse di GMail. Se ad esempio utilizzassimo un server SMTP senza SSL basterebbe lasciare vuoto SMTPSecure e impostare la porta 25 oppure la 587. Gli altri parametri sono semplici, specificano il mittente e se il contenuto del messaggio è in formato HTML, in questo caso sí.
Proseguiamo:
$mail->CharSet = 'UTF-8'; $mail->Subject = 'Oggetto del messaggio' $mail->Hostname = 'dominio.com'; $mail->Body = '<html><head></head><body>Ciao questo è il contenuto del messaggio in <b>HTML</b></body></html>'; $mail->AltBody = $mail->html2text($mail->Body); $mail->AddAttachment('foto.jpg', 'lamiafoto.jpg');
Mai sottovalutare il charset, assicurarsi che sia corrispondente a quello con cui è stato composto il messaggio, come ad esempio quello della pagina HTML dove l'utente compila il form di contatto. Lo standard è ormai UTF-8. Abbiamo aggiunto anche una foto come allegato, molto semplicemente. Finalmente impostiamo il destinatario e inviamo il messaggio
$mail->AddAddress('[email protected]'); $result = $mail->Send();
A questo punto non ci resta che esaminare il risultato e eventualmente inserire il messaggio nella cartella posta inviata della nostra mailbox
if($result) { $mail_string = $mail->get_mail_string(); $ImapStream = imap_open('{imap.dominio.com:143/notls}Sent', 'la_mia_username', 'la_mia_password'); if($ImapStream) imap_append($ImapStream, '{imap.dominio.com:143/notls}Sent', $mail_string, '\\Seen'); } else { // se qualcosa è andato storto scrivo l'errore echo $mail->ErrorInfo; }
Ecco a cosa serviva estendere la classe PHPMailer con il metodo get_mail_string(). Dopo aver stabilito la connessione con il server IMAP della nostra mailbox utilizziamo la funzione imap_append, che necessita della strina che racchiude l'intero messaggio. Infatti una email non è altro che una stringa debitamente formattata, composta da un header e un body. Potete verificare con il vostro client di posta, ad esempio Thunderbird, selezionando un messaggio e cliccando su visualizza -> sorgente del messaggio. Header e body del messaggio inviato sono contenuti negli attributi privati dell'oggetto PHPMailer, MIMEHeader e MIMEBody.
In questo modo ci ritroveremo il messaggio visibile ad esempio nel client di posta che utilizziamo, come thunderbird, o sul nostro smartphone. Comodo!
0 notes
michelewebdev · 9 years
Text
Utilizziamo un file Excel come database
Molto spesso capita di dover elaborare dei file Excel, modificare i record in essi presenti (le righe), in modo massivo. Ad esempio potremmo sistemare il database di un software gestionale che esporta e importa in formato Excel, oppure semplicemente leggere i dati da importare su un database mysql. Tutte operazioni che non possiamo fare manualmente andando ad agire sulle singole celle; in questi casi fa comodo utilizzare un semplice script che utilizza il file come un database, oppure che riesce a leggerne i contenuti, modificarli e quindi riscrivere il file.
Nel primo caso (quello che esaminiamo in questo post) possiamo sfruttare i driver ODBC presenti in tutte le versioni di Windows; purtroppo pochi "eletti" riescono ad installare, configurare ed utilizzare i driver Open ODBC per Linux, quindi dobbiamo lavorare nel sistema di casa Microsoft.
Nel secondo caso ci sono le librerie PHPExcel che sono molto efficaci e permettono di lavorare anche sullo stile del file excel (dimensioni e colori delle celle, font, bordi, ecc.).
Entrambi i metodi presentano pregi e difetti. Se siamo interessati alla pura manipolazione dei dati comunque il primo metodo è sempre preferibile, visto che va a alterare solamente i record interessati, mentre con PHPExcel il file viene comunque riscritto, perdendo eventuali funzionalità particolari utilizzate nel file, come ad esempio i filtri.
Preparazione dell'ambiente di sviluppo
Mettiamo quindi il file Excel (magari una copia) in una cartella che sia raggiungibile dagli script del nostro web server, che potrebbe essere Apache. Per comodità possiamo posizionare il nostro nuovo script PHP e il file Excel nella stessa cartella.
Per assicurarci che la lettura e la scrittura sul file vadano a buon fine dobbiamo:
Assicurarci che il file non sia in sola lettura (tasto destro -> proprietà) e che non sia già aperto da un'applicazione come Microsoft Excel o Libre Office o qualsiasi altro software che lo tenga bloccato
Assicurarci che sul file ci siano i permessi in scrittura per l'utente che esegue il web server. facendo tasto destro -> proprietà -> Protezione possiamo vedere e eventualmente aggiungere il rispettivo utente assegnando "Controllo completo"; spesso Apache è eseguito dall'utente System che ha già i permessi su tutti i file. In ogni caso, se avessimo difficoltà possiamo aggiungere l'utente "everyone"
Impostare la tabella su cui lavorare (o anche piú di una), cioè definire, come in ogni db relazionale che si rispetti, tabelle e campi. Per fare questo dobbiamo aprire il file excel con Microsoft Excel oppure Libre Office o Open Office, inserire come prima riga i nomi dei campi, quindi selezionare tutte le righe con tutti i dati, quindi cliccare sulla dropdown box soprastante, cliccare "gestisci nomi" e quindi cliccare "Nuovo" (o almeno questo è quello che troviamo su Libre Office): Nel nostro caso abbiamo selezionato il range di celle che ci servono e abbiamo dato il nome "prodotti" alla tabella
Fatto questo possiamo iniziare a scrivere il nostro script PHP.
Implementazione dello script
Iniziamo con la connessione al database:
$excelFile = realpath('example.xls'); $excelDir = dirname($excelFile); $conn = odbc_connect("Driver={Microsoft Excel Driver (*.xls)};READONLY=FALSE;DriverId=790;Dbq=$excelFile;DefaultDir=$excelDir" , '', '') or die(odbc_errormsg());
Notiamo che c'è il parametro READONLY, indispensabile per poter anche aggiungere, modificare o eliminare i record. Con questo accorgimento, insieme agli altri nell'elenco sopra, evitiamo il fastidioso quanto misterioso errore: "Per questa operazione è necessario utilizzare una Query aggiornabile".
A questo punto possiamo tranquillamente eseguire semplici query in SQL attraverso la funzione odbc_exec:
$result = odbc_exec($conn, "SELECT DISTINCT(marca) FROM prodotti"); while(odbc_fetch_row($result)) { $marca = trim(odbc_result($result, 1)); if($marca != '') echo $marca,'<br>'; }
Abbiamo scritto l'elenco delle marche. Andiamo ora a modificare qualche valore con un semplice UPDATE, ma prima definiamo una funzione di escaping per le stringhe (ad esempio per MySQL è mysql_real_escape_string).
function odbc_escape($str) { return str_replace(array("'", '\'), array("''", '\\'), $str); }
Quindi:
$descrizione = 'Monitor LCD 22 pollici nero'; odbc_exec($conn, "UPDATE prodotti SET descrizione = '".odbc_escape($descrizione)."' WHERE codice = '6419'");
Ecco fatto, abbiamo letto e modificato il file excel con delle semplici query SQL. Ovviamente la sintassi e i comandi SQL sono proprie del driver ODBC, quindi differiscono da quelle di MySQL sia nelle funzioni che in molti altri particolari.
Alla prossima!
1 note · View note