Domanda

Sto cercando di generare risposte specifiche ajax dai miei controller utilizzando il metodo Richiesta :: Ajax (), che funziona bene.L'unico problema è che il modo in cui ho impostato in questo momento non è davvero una soluzione carina.

Il mio controller:

class HomeController extends BaseController {

protected $layout = 'layouts/main';

public function __construct()
{
    $this->beforeFilter('auth');
}

public function getIndex()
{
    $view = View::make('content.home.index');
    if(Request::ajax()) return $view; //For ajax calls we only want to return the content to be placed inside our container, without the layout
    $this->layout->menu = 'content.menu';
    $this->layout->content = $view;
}

}
.

Così proprio ora, per ogni metodo I Definisca nei miei controller Devo aggiungere lo snippet di codice che controlla una richiesta AJAX e restituisce una singola vista se l'istruzione restituisce true.

Ciò porta alla mia domanda che è probabilmente più php relativa a quella del framework;

C'è un modo per eseguire il mio controllo Ajax su ogni chiamata del metodo, senza effettivamente posizionarlo all'interno del metodo?O c'è qualche altra soluzione per mantenere il mio codice secco?

Grazie in anticipo!

PS: Questo è il mio primo post su Stackoverflow, quindi sentiti libero di correggermi se ho fatto errori

È stato utile?

Soluzione

Creare un nuovo layout barebone denominato "Layouts / Ajax" (o qualsiasi nome che ti piace).

    <?php echo $content ?>
.

Nel controller di base, sovrascrivere questa funzione setupLayout().

protected function setupLayout()
{
    if ( ! is_null($this->layout))
    {
        $layout = Request::ajax() ? 'layouts/ajax' : $this->layout;
        $this->layout = View::make($layout);            
    }
}
.

Cambia la funzione getIndex() a questo.

public function getIndex()
{
    $view = View::make('content.home.index');
    $this->layout->menu = 'content.menu';
    $this->layout->content = $view;
}
.

Ora le richieste non Ajax saranno rese utilizzate utilizzando layout impostato nel controller, dove poiché le richieste di Ajax riceveranno qualsiasi impostazione su $this->layout->content.

Nota: il controller trascinerà la configurazione del layout in setupLayout(), se il metodo chiamato restituisce il valore di Truthy.Quindi questo metodo non funzionerà per le funzioni come di seguito.

public function getIndex()
{
    return View::make('content.home.index');
}
.

Altri suggerimenti

È possibile modificare la proprietà Layout, nel costruttore, se è una richiesta Ajax:

public function __construct()
{
    $this->beforeFilter('auth');

    if(Request::ajax()) {
        $this->layout = '';
    }
}
.

Se non funziona Prova a impostarlo su NULL invece.

Perché dovresti restituire una vista via Ajax?Lo stai usando per creare un centro benessere?Se è così, ci sono modi migliori.Sono generalmente contro il ritorno HTML tramite Ajax.

Il percorso che andrei nella tua posizione è probabilmente opposto di come lo stai facendo.Rendi la vista, indipendentemente da cosa, se la richiesta è Ajax, passare i dati extra indietro e avere JS rendering dei dati sulla pagina.Questo è essenzialmente come funzionano la maggior parte dei framework MVC JavaScript.

Scusa se mi manca totalmente il punto qui, basta andare su un'assunzione del tuo obiettivo finale con le informazioni che hai fornito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top