Добавление определенного для страницы JavaScript к каждому представлению в CakePHP

Кадры HTML, но это не идеальное решение. Вы по существу получили бы доступ к 3 отдельным страницам HTML сразу.

Ваша другая опция состоит в том, чтобы использовать Ajax, я думаю.

12
задан nickf 15 September 2009 в 04:11
поделиться

3 ответа

Как говорит deceze, мы делаем это с использованием макета, хотя я считаю наше решение немного более элегантным :)

В default.ctp:

if(isset($cssIncludes)){
    foreach($cssIncludes as $css){
        echo $html->css($css);
    }
}

if(isset($jsIncludes)){
    foreach($jsIncludes as $js){
        echo $javascript->link($js);
    }
}

Затем в действиях нашего контроллера , мы определяем эти массивы:

$this->set('cssIncludes',array('special')); // this will link to /css/special.css
$this->set('jsIncludes',array('jquery'));   // this will link to /js/jquery.js

Для файлов, которые необходимо загружать в каждом представлении, мы просто добавляем один и тот же тип ссылки «статически» в верхнюю часть макета, например:

echo $javascript->link('global');
echo $html->css('global');

Это действительно хорошо работает для нас. Удачи!

15
ответ дан 2 December 2019 в 03:14
поделиться

The best way I can think of is to create your own custom AppView and have all your controllers use that:

class myController extends AppController {
  var view = 'AppView';
  ...
}

Then, somewhere in your AppView, you'd want to do something like:

function __construct(&$controller, $register){
  parent::__construct($controller,$register);
  $this->addScript('<script type="text/javascript" src="/path/to/js/' . $this->controller . '/' . $this->action . '.js"></script>');
}

But I'd take a step back and think about a few things, first.

How big are your scripts, on average? Is the overhead of an external script call (before the script is cached by the client) better than adding a few hundred bytes to your main output stream (by just sticking the script into the page, inline)?

Perhaps you'd be better of somewhere in the middle -- split your scripts up by controller, but not action. That way, after the first visit to any action, the client has all scripts for all actions. This way, you avoid a big initial download for all the application's script, but you avoid adding N http round-trips (where N is the number of actions a brand new user visits).

Another way to approach the problem is to do it all in javascript. Just figure out a lazy-loading scheme. So your app just loads a very small loader.js, and that script figures out which other javascript sources to pull in.

Note: I've never tested my extend-the-view hack, but I bet it'll work if you really want to do this.

1
ответ дан 2 December 2019 в 03:14
поделиться

Very easy to do in your default.ctp layout file:

An example to automatically include .css files per controller and/or controller/action (because I had this lying around, easily adaptable to .js files):

<head>
...
<?php
    if (is_file(WWW_ROOT . 'css' . DS . $this->params['controller'] . '.css')) {
        echo $html->css($this->params['controller']);
    }
    if (is_file(WWW_ROOT . 'css' . DS . $this->params['controller'] . DS . $this->params['action'] . '.css')) {
        echo $html->css($this->params['controller'] . '/' . $this->params['action']);
    }
?>
...
</head>
28
ответ дан 2 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: