Javascript & Ajax? eval()!

Oggi dovevo eseguire del codice Javascript nel risultato di una chiamata ajax. Il template è fatto circa così:

1
2
3
4
5
6
<?php echo __('Aggiungi prodotto') ?><input type="button" value="+" onclick="addprod()" />
<?php echo javascript_tag("
  function addprod() { 
    alert('ciao')
  }
") ?>

Se chiamato “direttamente”, questo template funziona e visualizzerà correttamente l’alert. Ciò non si verificherà invece se il template in questione è il risultato di una chiamata Ajax. Come spiega il buon Sergio Pereira, ciò dipende dal fatto che il codice Javascript nel risultato di una chiamata ajax viene valutato (tramite la funzione eval()) per cui il template deve essere riscritto nel seguente modo:

1
2
3
4
5
6
<?php echo __('Aggiungi prodotto') ?><input type="button" value="+" onclick="addprod()" />
<?php echo javascript_tag("
  addprod = function() { 
    alert('alora')
  }
") ?>

in modo che la funzione venga creata.

Calendario nel risultato di una chiamata Ajax

Oggi dovevo utilizzare l’helper input_date_tag all’interno di un template che di fatto era il risultato di una chiamata Ajax.
Dato che normalmente non ho mai avuto problemi con quell’helper mi è risultato strano l’errore Javascript “Calendar is not defined”; dopo un attimo di ricerca ho capito che in tale frangente i Javascript e i css non vengono inclusi automaticamente (come invece avviene di solito), per cui ho dovuto aggiungerli nel file di configurazione del modulo view.yml:

  stylesheets:    [/sf/calendar/skins/aqua/theme.css]
  javascripts:    [/sf/calendar/calendar.js, /sf/calendar/lang/calendar-it.js, /sf/calendar/calendar-setup.js]

et voilà, il calendario funziona di nuovo.

Albero ajax

Ho avuto il problema di creare un albero prendendo categorie e subcategorie dal database; il tutto con una certa user experience, per cui possibilmente ajax. Avevo provato il plugin sfgWidgetsPlugin ma non permette più di un innesto (manca qualcosa tipo evalScript: true nella chiamata ajax), per cui ho dovuto fare a mano.

A seguito la mia soluzione.

Continue reading “Albero ajax”