Pull to refresh

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 нужен для изменения даты модификации папочки /protected/assets. Только в этом случае изменится её хешированное название в папочке assets в корне сайта. При изменении самих файлов — этого не произойдет, если только вы не публикуете каждый файл по отдельности.

2. Раширения можно оставить — у них должны быть свои ассеты.
А не проще ли выставить в конфиге ассет менеджера параметр linkAssets в true? Мне кажется это решает все проблемы, начиная от обновления файлов статики, заканчивая правами на файлы.
мне под Виндой не удалось заставить его работать(
Да, команда линуксовая. В Windows нет стандартного способа изменения даты папки из командной строки.
Есть некоторые обходные пути, о которых можно почитать в интернете, например, здесь
Но поскольку 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 — я так понимаю путь к файлу при обновлении его содержимого меняться не будет, а это значит браузер будет брать его из своего кеша.
путь к файлу меняться не будет, да, но дата изменения файла будет другой. Так что тут уже настройки сервера виноваты. У меня никогда небыло никаких проблем с симлинками.

Единственный минус — у меня dev сервер для некоторых случаев развернут на виртуальной машине с шаред фолдерами в Windows. В таком случае я не могу создать симлинку. Если использовать Samba и т.д. то вроде бы таких проблем нету, но мне так лень настроить сеть…
Использую такой велосипед:

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.

Articles