папка картинок при темизации рессурса yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
oughtem2
Сообщения: 34
Зарегистрирован: 2019.10.26, 20:50

папка картинок при темизации рессурса yii2

Сообщение oughtem2 »

делаю тему в проекте yii2 advanced. В документации указывается возможность задать папку темы через public $sourcePath = '@app/themes/neat/web'; Подключил css и Js, всё ок.

в конфиге переопределил

Код: Выделить всё

        'view' => [           
            'theme' => [               
                'class'=> yii\base\Theme::className(),               
                'basePath'=>'@app/themes/neat',    
                'baseUrl' => '@web/themes/neat',               
                'pathMap' => [                   
                    '@app/views'    => '@app/themes/neat/views',               
                    '@app/web'      => '@app/themes/neat/web',               
                    '@app/web/js'   => '@app/themes/neat/web/js',               
                    '@app/web/css'  => '@app/themes/neat/web/css',               
                    '@app/web/img'  => '@app/themes/neat/web/img',               
                ],           
            ],      
        ],
Но строка

Код: Выделить всё

 '@app/web/img'  => '@app/themes/neat/web/img', 
не работает. Yii ищет картинки в корневой web/img, при этом все остальные строки из pathMap работают исправно. В чём я не прав и как настроить переопределение категории для картинок?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: папка картинок при темизации рессурса yii2

Сообщение yiiliveext »

Потому что url картики в представлении задавать надо так

Код: Выделить всё

<img src="<?=$this->theme->getUrl('img/logo.gif')?>">
oughtem2
Сообщения: 34
Зарегистрирован: 2019.10.26, 20:50

Re: папка картинок при темизации рессурса yii2

Сообщение oughtem2 »

не, не то. Штука в том, что картинки публикуются в папку asset. Предложенный вами способ формирует ссылку типа
/themes/neat/img/0fbbcb8a01-dress-3.png
а мне надо
/assets/dbe155c8/img/0fbbcb8a01-dress-3.png
Есть не очень изящное решение - это

Код: Выделить всё

$img_path = NeatAsset::register($this)->baseUrl;
$img_path.'img/0fbbcb8a01-dress-3.png';
Просто в таком случае придётся прокидывать $img_path из шаблона в виды, что не очень красиво.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: папка картинок при темизации рессурса yii2

Сообщение yiiliveext »

Если речь идет о ресурсах приложения, то вам нужно для темы Neat в frontend/web создать папку neat с подпапками css, js, img и т.д., как в папке web, и в представлениях изображения выводить как "neat/img/logo.png"
Набор ресурсов будет выглядеть так

Код: Выделить всё

<?php

namespace frontend\themes\neat\assets;

use yii\web\AssetBundle;

/**
 * The asset bundle for the Neat Theme.
*/
class NeatAsset extends AssetBundle
{
    public $basePath = '@webroot/neat';
    public $baseUrl = '@web/neat';
    public $css = [
        'css/site.css',
    ];
    public $js = [
        'js/main.js',
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}
oughtem2
Сообщения: 34
Зарегистрирован: 2019.10.26, 20:50

Re: папка картинок при темизации рессурса yii2

Сообщение oughtem2 »

Не пойму, толи вы ошиблись со структурой папок то ли я ошибся. Моё дерево таково

Код: Выделить всё

frontend
	assets
	components
	config
	controllers
	helpers
	messages
	models
	runtime
	tests
	themes
		neat
			views
				layouts
				site
			web
				css
				icon
				img
				js
	views
	web
однако вы пишете
создать папку neat с подпапками css, js, img и т.д.
. У меня как видите создана подпапка web, а в ней уже подпапки css, js, img. Неправильно я сделал или вы неточно написали?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: папка картинок при темизации рессурса yii2

Сообщение yiiliveext »

oughtem2 писал(а): 2019.12.11, 00:11 Не пойму, толи вы ошиблись со структурой папок то ли я ошибся. Моё дерево таково
однако вы пишете
создать папку neat с подпапками css, js, img и т.д.
. У меня как видите создана подпапка web, а в ней уже подпапки css, js, img. Неправильно я сделал или вы неточно написали?
Неправильно сделали. Публикацию в @app/web/assets придумали для расширений, которые не могут опубликовать ресурсы в webroot.
В случае с ресурсами основного приложения нет смысла публиковать их в assets, структура должна быть такой.

Код: Выделить всё

frontend
	assets
	components
	config
	controllers
	helpers
	messages
	models
	runtime
	tests
	themes
		neat
		    views
			layouts
		        site
		nexttheme
		    views
			layouts
		        site
       views
       web
	    neat
	        css
	        icon
	        img
                js
            nexttheme     
           	css
	        icon
	        img
                js
            css
	    icon
	    img
            js
                
	

Здесь neat и nexttheme - это темы.
oughtem2
Сообщения: 34
Зарегистрирован: 2019.10.26, 20:50

Re: папка картинок при темизации рессурса yii2

Сообщение oughtem2 »

я понял, исправлю, но как же тогда

Код: Выделить всё

<img src="<?=$this->theme->getUrl('img/logo.gif')?>">
$this->theme-> тогда ж ни при чём, не в теме ж хранятся картинки, а в @webroot/neat
Как мне правильно указать путь к картинкам без создания какой-то отдельно перменной $img_path?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: папка картинок при темизации рессурса yii2

Сообщение yiiliveext »

oughtem2 писал(а): 2019.12.11, 16:14 я понял, исправлю, но как же тогда

Код: Выделить всё

<img src="<?=$this->theme->getUrl('img/logo.gif')?>">
$this->theme-> тогда ж ни при чём, не в теме ж хранятся картинки, а в @webroot/neat
Как мне правильно указать путь к картинкам без создания какой-то отдельно перменной $img_path?
Смотрите выше я приводил код NeatAsset, там мы задаем public $baseUrl = '@web/neat';
Поэтому $this->theme->getUrl('img/logo.gif') вернет нам @web/neat/img/logo.gif
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: папка картинок при темизации рессурса yii2

Сообщение yiiliveext »

А если вы все же хотите публиковать ресурсы, то решается этот так

Код: Выделить всё

class NeatAsset extends AssetBundle
{
    public $sourcePath = '@app/themes/neat/web';
    public $css = [
        'css/site.css',
    ];
    public $js = [
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}
Конфиг компонента представления

Код: Выделить всё

'view' => [
            'theme' => [
                'class'=> yii\base\Theme::className(),
                'basePath'=>'@app/themes/neat/web',
                'baseUrl' => '@web/themes/neat/web',
                'pathMap' => [
                    '@app/views'    => '@app/themes/neat/views',
                ],
            ],
        ],
Событие в конфиге приложения

Код: Выделить всё

'on beforeAction' => function ($event) {
        $themeBasePath =  Yii::$app->view->theme->getBasePath();
        Yii::$app->view->theme->setBaseUrl(Yii::$app->assetManager->getPublishedUrl($themeBasePath));
    },

Структура папок такая

Код: Выделить всё

themes
    neat
        views
        web
            css
            js
            img 
И к изображению доступ будет так же <img src="<?=$this->theme->getUrl('img/logo.gif')?>">
oughtem2
Сообщения: 34
Зарегистрирован: 2019.10.26, 20:50

Re: папка картинок при темизации рессурса yii2

Сообщение oughtem2 »

То, что доктор прописал! Респект и уважуха! Всё работает как написано.

Если можно, в двух словах объясните, пожалуйста, процесс создания папок frontend\web\assets\72ad9e9f... В документации и форумах этой инфы нет. Мне надо знать, в каких случаях создаются эти папки и когда перезаписываются. Как влияет система кеширования на них. Также интересны все плюсы понятия "публикация", т.к. кроме одного "скрыть расположение своих рессурсов" я не вижу, хотя такой минус как "время на копирование рессурсов" перед загрузкой страницы очевиден.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: папка картинок при темизации рессурса yii2

Сообщение yiiliveext »

https://www.yiiframework.com/doc/guide/ ... ure-assets
https://www.yiiframework.com/doc/api/2. ... setmanager
Смотрите код методов AssetBundle::publish() и AssetManager::publish(), AssetManager::publishFile(), AssetManager::publishDirectory()
oughtem2 писал(а): 2019.12.13, 04:46 Также интересны все плюсы понятия "публикация", т.к. кроме одного "скрыть расположение своих рессурсов" я не вижу, хотя такой минус как "время на копирование рессурсов" перед загрузкой страницы очевиден.
Расширения устанавливаются в папку vendor, она недоступна из веб и соответственно недоступны их ресурсы. Чтобы они были видны их нужно опубликовать, этим и занимается AssetManager, который копирует директории/файлы в папку assets по пути assets/{hash(bundle sourcePath)}.
Если время исходного файла изменилось, то он заменяется. Для того, чтобы браузер не брал устаревшую версию файла из кеша можно использовать версионирование, установив 'appendTimestamp' => true, тогда к файлу будет добавляться версия с меткой времени.
Как видите, плюсов никаких, просто насущная необходимость. Именно поэтому рекомендуется избегать публикации и размещать ресурсы напрямую в папке @web, если есть такая возможность, что я вам и писал в самом начале.
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: папка картинок при темизации рессурса yii2

Сообщение dmg »

oughtem2 писал(а): 2019.12.13, 04:46 хотя такой минус как "время на копирование ресурсов" перед загрузкой страницы очевиден.
Можно не копировать.
https://www.yiiframework.com/doc/api/2. ... ets-detail
oughtem2
Сообщения: 34
Зарегистрирован: 2019.10.26, 20:50

Re: папка картинок при темизации рессурса yii2

Сообщение oughtem2 »

ну я правильно понимаю, что папки при первом заходе первого юзера скопировались и если файлы не изменяются, то любому другому зашедшему юзеру показываются рессурсы уже из frontend/asset/... и процесса копирования, который увеличивает время загрузки страницы не происходит? Т.е. если я как первый юзер пройдусь по страницам, на которых задействован AssetManager, то для других юзеров страница будет открываться быстро. Я правильно понял?
Ответить