mercoledì 30 maggio 2012

Come ho risolto gli errori 1602/1604 durante il ripristino

Volevo effettuare il jailbreak del mio iPhone, dato che era uscita la versione Absinthe compatibile con iOS 5.1.1.
Provando però a ripristinare il telefono con iTunes, durante il processo ricevevo gli errori 1602 e 1604.

Dopo aver perso molto tempo e sudore, sono riuscito a risolvere in questo modo.

Ho rimosso e reinstallato iTunes sul mio Windows XP come descritto nella guida ufficiale.

Dopodiché, con l'iPhone in modalità ripristino, ho fatto un tentativo. Non è andato a buon fine. Allora ho chiuso e riaperto iTunes che ha riconosciuto l'iPhone, sempre in modalità ripristino. Ho fatto un ulteriore tentativo, questa volta andato a buon fine.

Gioia indescrivibile.

domenica 13 maggio 2012

Come gestire le chiamate AJAX lato server con lo Zend Framework

Capita spesso di dover scrivere un controller che contiene una o più azioni AJAX che il più delle volte devono restituire una stringa JSON.

Si possono gestire questi casi singolarmente per ogni action, indicando  al controller di non renderizzare alcuno script di view dopo l'esecuzione, oppure si può facilmente fattorizzare questo processo al fine di semplificarci la vita.

Per fare ciò è sufficiente realizzare una classe che estende Zend_Controller_Action che si occuperà di controllare per ogni richiesta il prefisso dell'action. Ovviamente tutte le action che risponderanno ad una chiamata AJAX dovranno avere un prefisso speciale, per esempio ajax.

Ecco un esempio:

<?php

class Library_Controller_Action_Ajax extends Zend_Controller_Action
{

    const AJAX_ACTION_PREFIX = 'ajax';

    protected function _isAjax()
    {
        $actionName = $this->_request->getActionName();
        $ajaxActionPrefix = Awatag_Controller_Action_Ajax::AJAX_ACTION_PREFIX;
        if (strlen($actionName) < strlen($ajaxActionPrefix)) {
        return false;
        }
        $actionPrefix = substr($actionName, 0, strlen($ajaxActionPrefix));
        $isAjax = strcmp($ajaxActionPrefix, $actionPrefix) === 0;
        return $isAjax;
    }

    public function init()
    {
        if ($this->_isAjax()) {
            $this->_helper->viewRenderer()->setNoRender(true);
        }
    }

    public function ajaxFooAction()
    {
        // azione ajax
        // il risultato delle operazioni è nell'array data
        $response = Zend_Json::encode($data);
        echo $response;
    }

    public function barAction()
    {
        // azione normale
    }
}

In questo modo tutte le azioni ajax non renderizzeranno alcuno script di view.