Comments 15
Я у себя использую чуть чуть расширенную версию.
private $_assetsUrl;
/**
* @return string the base URL that contains all published asset files of app.
*/
public function getAssetsUrl()
{
if($this->_assetsUrl !== null)
{
return $this->_assetsUrl;
}
else
{
$assetsPath=Yii::getPathOfAlias(($this->module !== null) ? $this->module->name.'.assets':'application.assets');
$this->setAssetsUrl($assetsPath);
return $this->_assetsUrl;
}
}
/**
* @param string $value the base URL that contains all published asset files of app.
*/
public function setAssetsUrl($path)
{
if(($assetsPath=realpath($path))===false || !is_dir($assetsPath) || !is_writable($assetsPath))
throw new CException(Yii::t('app','Assets path "{path}" is not valid. Please make sure it is a directory writable by the Web server process.',
array('{path}'=>$path)));
$assetsUrl=Yii::app()->assetManager->publish($path,false,-1,YII_DEBUG);
$this->_assetsUrl=$assetsUrl;
}
возможно я не очень понял, не могли бы вы пояснить пару моментов:
1. для чего делать touch? Ведь если я поменял скрипты, то дата модификации изменится и assets обновится. Если я ничего не поменял, то и не нужно обновлять assets
2. что включает в себя перенос всей статики в protected/assets? Extension's тоже? это ведь неудобно: приятней когда расширения хранят assets в своих папках.
1. для чего делать touch? Ведь если я поменял скрипты, то дата модификации изменится и assets обновится. Если я ничего не поменял, то и не нужно обновлять assets
2. что включает в себя перенос всей статики в protected/assets? Extension's тоже? это ведь неудобно: приятней когда расширения хранят assets в своих папках.
Отвечаю:
1. touch нужен для изменения даты модификации папочки /protected/assets. Только в этом случае изменится её хешированное название в папочке assets в корне сайта. При изменении самих файлов — этого не произойдет, если только вы не публикуете каждый файл по отдельности.
2. Раширения можно оставить — у них должны быть свои ассеты.
1. touch нужен для изменения даты модификации папочки /protected/assets. Только в этом случае изменится её хешированное название в папочке assets в корне сайта. При изменении самих файлов — этого не произойдет, если только вы не публикуете каждый файл по отдельности.
2. Раширения можно оставить — у них должны быть свои ассеты.
А не проще ли выставить в конфиге ассет менеджера параметр linkAssets в true? Мне кажется это решает все проблемы, начиная от обновления файлов статики, заканчивая правами на файлы.
мне под Виндой не удалось заставить его работать(
Да, команда линуксовая. В Windows нет стандартного способа изменения даты папки из командной строки.
Есть некоторые обходные пути, о которых можно почитать в интернете, например, здесь
Но поскольку php сайты как правило разворачивают на линуксовых хостингах — я рассмотрел именно это вариант. Вечером добавлю уточнение в статью.
Есть некоторые обходные пути, о которых можно почитать в интернете, например, здесь
Но поскольку php сайты как правило разворачивают на линуксовых хостингах — я рассмотрел именно это вариант. Вечером добавлю уточнение в статью.
Функция symlink в PHP работает под виндой начиная с 5.3.
В PHP 5.3+ на Windows Vista+ работает само. Чтобы работало в Windows XP или при PHP < 5.3:
if (!function_exists('symlink')) {
function symlink($target, $link)
{
`junction -accepteula "$link" "$target"`;
}
}
if (!function_exists('unlink')) {
function unlink($link)
{
`junction -accepteula -d "$link"`;
}
}<source>
Программа junction берётся из WinInternals и кладётся в PATH.
linkAssets не всегда возможно использовать, об этом написано и в документации по yii
Ну и даже если использовать linkAssets — я так понимаю путь к файлу при обновлении его содержимого меняться не будет, а это значит браузер будет брать его из своего кеша.
Ну и даже если использовать linkAssets — я так понимаю путь к файлу при обновлении его содержимого меняться не будет, а это значит браузер будет брать его из своего кеша.
путь к файлу меняться не будет, да, но дата изменения файла будет другой. Так что тут уже настройки сервера виноваты. У меня никогда небыло никаких проблем с симлинками.
Единственный минус — у меня dev сервер для некоторых случаев развернут на виртуальной машине с шаред фолдерами в Windows. В таком случае я не могу создать симлинку. Если использовать Samba и т.д. то вроде бы таких проблем нету, но мне так лень настроить сеть…
Единственный минус — у меня dev сервер для некоторых случаев развернут на виртуальной машине с шаред фолдерами в Windows. В таком случае я не могу создать симлинку. Если использовать Samba и т.д. то вроде бы таких проблем нету, но мне так лень настроить сеть…
Использую такой велосипед:
class Y
{
public static function asset($path)
{
return Yii::app()->assetManager->publish($path,false,-1,defined('YII_DEBUG') && YII_DEBUG);
}
}
Тот принцип что вы описали в статье использую в модулях и виджетах. В контроллерах такое делать как то не возникало нужды. Обычно ресурсы либо виджеты, либо глобально модули контролируют.
class Y
{
public static function asset($path)
{
return Yii::app()->assetManager->publish($path,false,-1,defined('YII_DEBUG') && YII_DEBUG);
}
}
Тот принцип что вы описали в статье использую в модулях и виджетах. В контроллерах такое делать как то не возникало нужды. Обычно ресурсы либо виджеты, либо глобально модули контролируют.
А ресурсы для аппликейшена вы храните в папках css/js глобально? Я даже ресурсы тем в ассеты складываю- так удобнее…
Нет, все в ресурсах данного компонента, можете глянуть мои расширения на github е в качестве примера. P.S.: Почему меня минусуют? Ребят, вы чего? По-моему, это слишком.
Sign up to leave a comment.
AssetManager: как форсировать получение пользователем обновленной статики