CodeIgniter son adımda görünümü yüklemek zorunda mı?

3 Cevap php

Ben bir işlevi var

function do_something() {
    // process
    $this->load->view('some_view', $data);
    exec('mv /path/to/folder1/*.mp3 /path/to/folder2/');
}

Benim niyetim görünümü çıktısı sonra dosyaları taşımaktır. Ama görünüşe göre bu görünümü render önce yapılır. Benim sorum, $this->load->view(); bir işlevi son adım olmak zorunda mı?

Ben biraz araştırma yaptım ve benim soru this topic benzer gibi görünüyor. Düzeltin?

3 Cevap

Neden sadece bir post_system kanca kullanmak değil mi? Son sayfa onları yankılanan olmadan, tarayıcı, normalde görüşlerini yükleyebilirsiniz bu şekilde gönderildikten sonra deniyor.

İşte bir örnek denetleyici bulunuyor:

class Home extends Controller {

    function index()
    {
        $this->move_audio = TRUE;
        $this->old_folder = "/path/to/folder/";
        $this->new_folder = "/path/to/folder2/";

        $this->load->view("some_view");
    }

}

Ve bir örnek kanca:

function post_system()
{
    $CI =& get_instance();

    if( isset($CI->move_audio) && $CI->move_audio === TRUE)
    {
        // Trim, then add trailing slash for consitency
        $old_folder = rtrim($CI->old_folder, "/")."/*.mp3";
        $new_folder = rtrim($CI->new_folder, "/")."/";

        exec("mv {$old_folder} {$new_folder}");
    }
}

Onları ayarlama hakkında bilgi için hooks user guide göz atın. Onlar arkadaş oldular!

EDIT: Something I just thought of...

Eğer sadece tek bir denetleyici yöntemi içinde bu iş için gidiyoruz ... muhtemelen Phil yaklaşımını kullanmak daha iyi olacaktır. Bu sadece bir kez ihtiyacınız varsa gereksiz olacağını her istek için bir kanca çağrı sahip önleyeceğini.

Yapabileceğin başka bir şey, sadece bir kez ihtiyacınız varsa, Kontrolörleri için CI _output() işleyicisi kullanmaktır (info here). İşte bu şekilde çalışacak:

class Home extends Controller {

    // Initalize the var to avoid having to
    // check if it's set or not

    var $move_audio = FALSE;

    // CONTROLLER METHOD    
    function index()
    {
        $this->move_audio = TRUE;
        $this->old_folder = "/path/to/folder/";
        $this->new_folder = "/path/to/folder2/";

        $this->load->view("some_view");
    }

    // OUTPUT HANDLER
    function _output($output = "")
    {
        echo $output;

        if($this->move_audio === TRUE)
        {
            // Trim, then add trailing slash for consitency
            $old_folder = rtrim($this->old_folder, "/")."/*.mp3";
            $new_folder = rtrim($this->new_folder, "/")."/";

            exec("mv {$old_folder} {$new_folder}");
        }
    }
}

Eğer komutu çalıştırmadan önce tarayıcıya çıktı gönder:

function do_something()
{
    // process
    echo $this->load->view('some_view', $data, TRUE);
    exec('mv /path/to/folder1/*.mp3 /path/to/folder2/');
}

Aksi takdirde sadece o kısa sürede Kontrolörü bitmiş olarak çalışacak Çıktı sınıfa veri veriyoruz.

No. Actually for some web services I have just used something like this:

function get_json_search() {
    $results = $this->My_model->get_stuffs();
    echo json_encode($results);
}

Ayrıca web tamamen şahsidir denetleyici işlevleri olabilir. Sadece '_' ile öneki. Sen sayfaları gibi bu görebilmek asla.

function _upload_photo($filepath) { //resize it and so on

Belki MVC yanlış anlama vardır. Kontrolör modeli ve görünümü arasında bir aracı olduğunu. Aynı şekilde ya modelleri kullanmak gerekmez. Kontrolör sadece modellerinden şeyler almak ve bunu yazdırmak için görünümünü kullanarak. Hiçbir sebep (kötü tarzı olurdu rağmen) kontrolör içinde veya diğer kaynaklardan gelen verileri kullanabilir veya denetleyici sayfanızı dışarı yazamıyor var.

O iş olmaz neden ilk görünümü yük eğer ben görmüyorum. Ben bunu başka bir yol yapmak olsa da bu yüzden çevresinde kullanıcıya geri bildirim sunabilir. Dosyaları taşımak için başarısız eğer onlara bir hata göstermesi gerekir. Bu performans yoğun ise bir kuyruk veya cron işleri kullanmayı düşünün.