Archive for Coding

#1548 – Cannot load from mysql.proc. The table is probably corrupted. – EasyPHP

La soluzione è semplice.

Start -> run -> cmd.exe

cd c:\EasyPHP\MySql\bin
mysql_upgrade.exe -u root -pPASSWORD

exception ‘Engine_Api_Exception’ with message ‘Unknown item type: ‘ in [...]

Primi passi con Social Engine 4 e primi problemi nello sviluppo dei plugin..

Questo errore che mi ha occupato diversi giorni, l’ho finalmente risolto e spero possa essere d’aiuto anche a voi.

exception 'Engine_Api_Exception' with message 'Unknown item type: ' in [...]

Lo causava il ->delete() di un metodo, perché la classe della tabella (documentatevi sull’uso delle tabelle con Zend Framework) l’avevo creata così:

(nella cartella: PluginName/Model/)

Nometabella.php

SBAGLIATO:
class Pluginname_Model_Nometabella extends Core_Model_Item_Collection {

CORRETTO:
class Pluginname_Model_Nometabella extends Core_Model_Item_Abstract {

Hope this helps.

Classi in JavaScript

E’ ormai indispensabile usare la programmazione orientata ad oggetti (OOP). Questo anche in JavaScript. Nonostante sia stato usato nell’antichità (ai tempi di IE6) solo per piccoli controlli, ora come ora, non possiamo fare nulla senza utilizzarlo. Ogni sito che si rispetti, infatti, utilizza ormai AJAX. Benvenuti in WEB2 =)

In realtà quelle che siamo abituati a chiamare classi negli altri linguaggi, per JS sono degli oggetti, di tipo Object

  1. var a = new Object()

Vediamo dunque come poter utilizzare gli oggetti in JS. La struttura degli oggetti, è identica a quella di un file JSON. Supponiamo, dunque, di avere un set di funzioni che abbiamo scritto. Queste funzioni le vogliamo inserire in un nostro oggetto, così da poterle facilmente distinguere nel codice che scriviamo e che andremo a leggere da qui a tot mesi per magari porvi modifiche.

Ecco le nostre funzioni di esempio:

  1. function check(val) {
  2.     return val == true;
  3. }
  4. function flip(val) {
  5.     return !val;
  6. }

A puro titolo informativo, le seguenti funzioni, potevano essere dichiarate anche così:

  1. check = function(val) {
  2.     return val == true;
  3. }
  4. flip = function(val) {
  5.     return !val;
  6. }

Proprio da questo, prendiamo spunto per creare il nostro oggetto:

  1. var nomeOggetto = {
  2.     var1 : false,
  3.     check : function (val) {
  4.         return val == true;
  5.     },
  6.     flip : function (val) {
  7.         return !val;
  8.     },
  9.     setValue : function(val) {
  10.         this.var1 = val;
  11.     }
  12. };

State attenti a separare ogni elemento dell’oggetto con una virgola ed alla fine della dichiarazione, mettere il punto e virgola.

Se prima, per utilizzarle le chiamavamo semplicemente da codice, ora le utilizzeremo così:

  1. alert("Variabile prima: "+nomeOggetto.var1);
  2. if (!nomeOggetto.check(nomeOggetto.var1)) {
  3.     nomeOggetto.setValue(nomeOggetto.flip(var1));    
  4. }
  5. alert("Variabile dopo: "+nomeOggetto.var1);

Enjoy :)

Cache con i file MANIFEST – Offline contents

Un buon modo per velocizzare il nostro sito, è quello di puntare molto sulla cache. Questa, come sappiamo, è la rottura di palle per eccellenza se si sta sviluppando, ma per l’utente finale che naviga il sito, è essenziale.

Un modo ottimo per usare la cache, è puntare sul file manifest. Questo file, è facilmente creabile con un editor di testo e la sintassi è decisamente semplice. Ci permette di salvare i files sul browser permettendo l’esecuzione del sito o parte di esso anche offline.

File: cache.manifest

  1. CACHE MANIFEST
  2. # version 2.21
  3. NETWORK:
  4. service.php
  5. CACHE:
  6. jquery.min.js
  7. jquery.tmpl.min.js
  8. tmpload.min.js
  9. FALLBACK:
  10. search.html errore.html

Vediamo di capirci qualcosa.
La nostra pagina web (esempio index.php) includerà il file manifest così:

  1. <html manifest="cache.manifest">

Il browser, quando leggerà la pagina, andrà a vedere se in locale ha i files specificati nel file. Se li ha già, non li riscarica. Se il file manifest, è cambiato dall’ultimo accesso, il browser scaricherà tutti i files. Ora il browser ha tutti i files pronti per l’esecuzione direttamente in locale.

I files elencati sotto la sezione

  • CACHE: verranno salvati.
  • NETWORK: verranno SEMPRE scaricati, quindi non saranno MAI accessibili se offline.
  • FALLBACK: in caso di accesso alla pagina search.html, verrà caricata la pagina error.html.

Per poter usare questo metodo di cache, dovrete settare un file .htaccess che imposti il mimetype del file, ovvero:

  1. RewriteEngine On
  2. AddType text/cache-manifest manifest

Questo vi permette di utilizzare un’estensione diversa, a vostra scelta. E’ importante impostare l’AddType, altrimenti avrete un errore sul browser:

Prestate, inoltre, attenzione al fatto che avrete un limite di 5mb per sito.

Da quanto ho capito, non è possibile specificare cartelle, per il caching, quindi niente *. Potrete, invece, usarli nella direttiva network.

Comprimere file JavaScript

Beh, se come me avete avuto la necessità di comprimere i JS, in specialmodo prototype 1.7, dovete assolutamente usare questo tool di google:

http://code.google.com/intl/it-IT/closure/compiler/

(file ZIP)

Tutti i tool online, portano a generare un JS non funzionante perchè cambiano nomi alle variabili. Questo, si limita a comprimere al meglio.
Da 170kb, prototype.js è ora 85kb.

Usarlo è semplice, ricordate che necessita Java 6+ installato.

Apriamo una console DOS, piuttosto che una shell linux, entrate nella cartella dove avete decompresso l’archivio e digitate:

java -jar compiler.jar --js=nostro_file.js --js_output_file=file_compresso.js

Se volete comprimere più di un file in UNO solo, allora vi sarà comodo fare

java -jar compiler.jar --js=file1.js --js=file2.js --js=file3.js --js_output_file=file_compresso.js

Buona compressione 8)

__PHP_Incomplete_Class Error

Oggi sono inciampato in questo errore.
Fortunatamente è facilmente risolvibile.

per prima cosa, facciamo una print_r del nostro oggetto:

  1. session_start();
  2. $obj = unserialize($_SESSION["oggetto"]);
  3. echo "<pre>";
  4. print_r($obj);

ottenendo un risultato simile a questo:

__PHP_Incomplete_Class Object
(
[__PHP_Incomplete_Class_Name] => NomeOggetto
[...]

Dovremo dunque includere il file contenente la dichiarazione della classe NomeOggetto.
Quindi:

  1. include("NomeOggetto.class.php");
  2. session_start();
  3. $obj = unserialize($_SESSION["oggetto"]);
  4. echo "<pre>";
  5. print_r($obj);

Risolvendo dunque il problema.

Hope this helps.
D.

Template EJS

Un’ottima soluzione, per separare il codice dall’HTML, è l’uso dei template.
Recentemente ho imparato ad usarli sempre. Creo un service lato server, in PHP che ritorna un oggeto JSON. Tale oggetto lato client, con JavaScript, è facilmente interpretabile ed usabile per completare la nostra pagina.
Prendiamo in esempio tabella. Vogliamo completarla con dei valori che otteniamo da un service chiamato con AJAX.

Nell’esempio uso prototype, ma potrebbe essere anche jQuery.

Chiamata AJAX:

  1. var url = "mioService.php";
  2. var params = {
  3.     parametro1 : "valore",
  4.     parametro2: 10
  5.     };
  6. new Ajax.Request(url, {
  7.     method : 'get',
  8.     parameters  : params,
  9.     onSuccess : function(transport) {
  10.         html = elaboraFlusso(transport);
  11.         $('window_container').update(html);            
  12.     },
  13.     onFailure : function(transport) {
  14.         alert('Errore!');
  15.     }
  16. });

Funzione elabora flusso:

  1. function elaboraFlusso(transport) {
  2.     try {
  3.         /*
  4.          * Conversione risposta primo tentativo come application/json
  5.          * E' importante che l'header del service PHP sia di tipo application/json. Comunque gestiamo anche il caso che arrivasse come testo.
  6.          */
  7.         jsonObj = transport.responseJSON;
  8.         if (!jsonObj) {
  9.             /*
  10.              * secondo tentativo come text/html
  11.              */
  12.             if (transport.responseText) {
  13.                 jsonObj = transport.responseText.evalJSON(true);
  14.             }
  15.         }
  16.         if (!jsonObj || transport.responseText.length < 1) {
  17.             return;
  18.         }
  19.         //Render EJS
  20.         var myejs = new EJS({
  21.             url : 'fileTemplate.ejs'
  22.         });
  23.         return myejs.render(jsonObj);
  24.     } catch (e) {
  25.         /* Dettagli errore:
  26.          * e.message, e.fileName, e.lineNumber, e.stack, e.name
  27.          */
  28.         alert('ex in ' + '\nmessage: ' + e.message + "\n\nfile: " + e.fileName + "\n\nline: " + e.lineNumber + "\n\nname: " + e.name);        
  29.     }
  30. }

Gestione ottimale del render EJS:

  1. try {
  2.     var myejs = new EJS({
  3.         url : 'fileTemplate.ejs'
  4.     });                                                                
  5.     html = myejs.render();
  6. } catch (e) {
  7.     alert('exception: ' + e.message);
  8. }
  9. //aggiorno DIV.
  10. $("DIV_container").update(html);

Esempio fileTemplate.ejs

  1. <table>
  2. <%
  3. for (i=0;i<jsonObj.menu.length;i++) {
  4. %>
  5.     <tr>
  6.         <td><%=jsonObj.menu[i].voce%></td><td><img src='<%=jsonObj.menu[i].img%>'/></td>
  7.     </tr>
  8. <%
  9. }
  10. %>
  11. </table>

Questo EJS, produrrà in output una tabella con tante voci quante ne arrivano dal service.
Ecco un JSON di esempio:

  1. {
  2.     "menu": {
  3.         "0": {
  4.             "voce": "Elemento 1",
  5.             "img": "image_1.jpg"
  6.         },
  7.         "1": {
  8.             "voce": "Elemento 2",
  9.             "img": "image_2.png"
  10.         }
  11.     }
  12. }

I tag per scrivere con EJS, sono <% e %>. Gli stessi di ASP. Fra quei tag, possiamo usare del codice JavaScript, che verrà eseguito quando faremo EJS.render().
Il vero problema degli EJS è l’assenza di un tool per verificarne la sintassi. A breve pubblicherò un piccolo tool online per validarli con visualizzazione del numero riga riportante l’errore.

Link di riferimento:
Validatore JSON
Embedded JS (EJS homepage)