2010-03-12 43 views
11

Tôi gặp sự cố khi cố gắng nối thêm tệp javascript bằng cách sử dụng headScript()->appendFile('file name') bằng Zend. Tôi đã thiết lập bố trí của tôi như thế này:Zend headScript() và appendFile không hoạt động như mong đợi

<?= $this->headScript() 
    ->prependScript('BASE_URL = "' . $this->baseUrl() . '";') 
    ->appendFile($this->baseUrl('js/lib/jquery/jquery-1.4.2.min.js')) 
    ->appendFile($this->baseUrl('js/admin.js')); 

?> 

Sau đó, trong bộ điều khiển của tôi, tôi đang cố gắng để nối thêm một file js thêm chỉ cho trang này, như:

$this->view->headScript()->appendFile('another/js/file.js'); 

tập tin này cần phải được nối vào những gì đã được thiết lập trong bố cục. Tuy nhiên, tệp này được thêm trước các tệp 'appendFile' khác. Tôi cũng đã thử

$this->headScript()->offsetSetFile(999, '/js/myfuncs.js'); 

Nhưng điều này vẫn thêm tệp trước các tệp khác. Đây không phải là cách tôi mong đợi điều này để làm việc, đặc biệt là khi sử dụng phương pháp offsetSetFile. Làm cách nào để thêm tệp này sau các tệp khác? Cảm ơn.

Trả lời

21

Câu trả lời là sử dụng headScript()->prependFile trong layout.phtml và headScript()->appendFile trong một cái nhìn.

+0

Nhưng không phải từ bộ điều khiển có thể?(thay vì đặt mã trong tệp xem?). – YumYumYum

+1

trong chế độ xem? không ... – JamesHalsall

1

Tôi đã nhận thấy rằng nếu tôi 'thêm' tất cả các tệp trong bố cục, tôi có thể sử dụng appendFile trong bộ điều khiển của mình và nó sẽ xuất hiện sau chúng. Thật không may, sau đó tôi phải liệt kê tất cả các tệp JS của tôi theo thứ tự ngược lại trong bố cục (vì chúng tự thêm vào). Tôi thực sự muốn giữ mọi thứ theo thứ tự và chỉ có thể thêm vào ngăn xếp bố cục của tôi.

0

Nếu việc thêm vào tệp bố cục không đủ tốt, bạn có thể bao gồm các tệp trong bootstrap khi thiết lập chế độ xem hoặc bạn có thể thiết lập plugin bộ điều khiển nếu bạn cần thêm trước dựa trên mô-đun nào đang được tải .

// in your bootstrap 
protected function _initHeadScript() 
{ 
    $this->bootstrap('view'); 
    $view = $this->getResource('view'); 

    $view->headScript()->appendFile('another/js/file.js'); 
} 

// as a plugin 
class My_Plugin_HeadScriptPlugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeStartup(Zend_Controller_Request_Abstract $request) 
    { 
     $view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view; 

     if($request->getModuleName() == 'foo') 
     { 
      $view->headScript()->appendFile('another/js/file.js'); 
     } 
    } 
} 
0

Thực ra, bạn không cần lấy baseUrl vì ZF đã làm điều đó cho bạn. Bạn chỉ cần chú ý đến con đường của bạn. Không sử dụng dấu gạch chéo đầu tiên! nếu không ZF sẽ trả về địa chỉ từ xa.

Chỉ cần sử dụng '$this->_view->headLink()->appendStylesheet('css/main.css'); '

2

Tôi biết đó là một câu trả lời cuối nhưng!

Nếu bạn làm appendFile hoặc appendScript đang sử dụng chỉ mục có sẵn tiếp theo. Như vậy

$this->headScript()->offsetSetFile(50, 'file'); 
$this->headScript()->appendFile('file2'); 

tương đương với

$this->headScript()->offsetSetFile(50, 'file'); 
$this->headScript()->offsetSetFile(51, 'file2'); 

Ngoài ra nó là chìa khóa để lưu ý rằng mã điều khiển được thực hiện đầu tiên trước khi mã view/layout. Vì vậy, trong trường hợp của bạn phụ của bạn đang thực sự sử dụng id của 1000, và 1001. Một sửa chữa nhanh chóng này chỉ là sử dụng rõ ràng offsetSetFile cho tất cả các phụ của bạn. Vì vậy, mã của bạn trong cách bố trí của bạn sẽ trông như thế:

<?= 
    $this->headScript() 
     ->prependScript('BASE_URL = "' . $this->baseUrl() . '";') 
     ->offsetSetFile(500, $this->baseUrl('js/lib/jquery/jquery-1.4.2.min.js')) 
     ->offsetSetFile(501, $this->baseUrl('js/admin.js')); 
?> 

Tôi hy vọng điều này sẽ giúp googler tương lai của

+0

Tôi đã thử điều này, nhưng không thể làm cho nó hoạt động. Bạn có thể đưa ra giải thích chi tiết hơn về những gì bạn đặt trong bố cục và chế độ xem và thứ tự sắp xếp kết quả là gì không? –

Các vấn đề liên quan