Специални теми Теми и кожи, Окончателното ръководство за Yii 1
Темите са традиционният начин за персонализиране на външния вид и усещането на страниците на уеб приложенията. Прилагайки нова тема, можем да променим облика и усещането на цялото приложение за секунди.
Съвет: Папката по подразбиране, в която се съхраняват темите - WebRoot/themes - може лесно да бъде променена чрез задаване на свойствата basePath и baseUrl на themeManager на каквото искате.
1. Използване на тема ¶
За да активирате тема, задайте стойността на темата на името на съответната тема. Това може да стане чрез конфигуриране на приложението или директно по време на изпълнение в действията на контролера.
Забележка: Името на темата е чувствително към главни и малки букви и ако се опитате да активирате тема, която не съществува, свойството Yii::app()->theme ще върне null.
2. Създайте тема ¶
Съдържанието на папката с теми трябва да бъде организирано точно като съдържанието на основната директория на приложението, т.е. всички файлове с изглед трябва да са в папката с изгледи, оформленията на изгледите в папката с изгледи/оформления, а файловете с изглед на системата в папката с изгледи/система. Например, ако искате да замените изгледа за създаване на PostController с изглед на класическа тема, ще запазите новия файл с изглед като WebRoot/themes/classic/views/post/create.php.
За изгледи на контролери в модули, съответните стилизирани файлове за изгледи също трябва да бъдат поставени в папката с изгледи. Например, ако PostController, споменат по-горе, е включен в модула на форума, ще запазите файла за създаване на изглед като WebRoot/themes/classic/views/forum/post/create.php. Ако модулът за форум е част от друг модул за поддръжка, тогава файлът за изглед трябва да бъде записан като WebRoot/themes/classic/views/support/forum/post/create.php.
Забележка: Папката с изгледи може да съдържа чувствителни за сигурността данни, така че трябва да ограничите достъпа до папката извън сървъра.
Когато методът render или renderPartial бъде извикан за изобразяване на изглед, се осъществява достъп до съответния изглед и файлове с оформление на активната тема. Ако файловете бъдат намерени, страницата ще бъде генерирана, в противен случай ще се използват файловете за дизайн по подразбиране, чието местоположение се задава от свойствата viewPath и layoutPath.
Съвет: Изгледите на дадена тема често трябва да препращат към други файлове на тема, например, за да покажат изображение в подпапка с изображения на тема. Като използвате свойството baseUrl на активната тема, можете да генерирате валидна връзка към изображението, както следва:
По-долу е даден пример за организиране на директории с приложения с две основни и фантастични теми:
В настройките на приложението, ако използваме:
тогава ще се приложи основната тема. Тоест основното оформление (оформление) ще бъде взето от themes/basic/views/layouts, а индексният изглед от themes/basic/views/site. Ако файлът за преглед не бъде намерен в темата, ще се използва файлът от protected/views.
3. Тема на джаджа ¶
От версия 1.1.5 дисплеите, използвани в джаджи, могат да бъдат тематизирани. Когато извиква CWidget::render() за изобразяване на изглед, Yii ще се опита да го намери в темите, преди да го зареди от директорията на widget.
За да тематизирате дисплея на xyz уиджет с името на класа Foo, трябва да създадете директория Foo (със същото име като класа) в директорията за показване на активната тема. Ако класът на джаджа е в пространство от имена (от PHP 5.3.0) като \app\widgets\Foo, тогава трябва да създадетеapp_widgets_Foo директория. В името заместваме разделителите на пространството от имена с долна черта.
След това създаваме файла за картографиране xyz.php в новодобавената директория. В този момент имаме файла themes/basic/views/Foo/xyz.php, който ще се използва от джаджата вместо нейния собствен дисплей, ако активната тема е основна.
4. Глобална конфигурация на Widget ¶
Забележка: тази функция е налична от версия 1.1.3.
Когато използвате джаджа, както стандартна, така и на трета страна, тя често изисква персонализиране. Например, може да искате да промените стойността на CLinkPager::maxButtonCount от 10 (по подразбиране) на 5. Можем да направим това, като предадем първоначални стойности, когато извикваме CBaseController::widget, за да създадем приспособлението. Въпреки това, да правим това навсякъде, където използваме CLinkPager, е доста неудобно.
Когато използвате глобална настройка, трябва само да посочите първоначалните стойности на едно място - в конфигурационния файл на приложението. За да направите това, настройте widgetFactory, както следва:
По-горе посочихме глобалните настройки за приспособленията CLinkPager и CJuiDatePicker, като използвахме съответните свойства CWidgetFactory::widgets. Струва си да се отбележи, че глобалните настройки са посочени като двойки масиви ключ-стойност, където ключът съответства на класа на джаджата, а масивът със стойност задава първоначалните стойности на свойствата на този клас.
Сега, когато използваме изпълнимия модул CLinkPager в изглед, неговите свойства ще бъдат зададени на горните първоначални стойности. По този начин, за да използвате джаджата, ще бъде достатъчен следният код:
Можем да заменим първоначалните стойности, ако е необходимо. Например, ако в някакъв изглед искаме да зададем maxButtonCount на 2, можем да направим следното:
Въпреки че можем бързо да променим външния вид на изгледите, когато използваме тема, можем също да използваме кожи, за да персонализираме външния вид на изгледите, използвани в изгледите.
Кожата е масив от двойки име-стойност, които могат да се използват за инициализиране на свойствата на модула. Кожата принадлежи към клас джаджа, а класът джаджа може да има множество кожи, идентифицирани по име. Например, може да имаме класическа кожа за джаджа CLinkPager.
За да използваме тази функция, първо трябва да променим конфигурационния файл на приложението, като зададем свойството CWidgetFactory::enableSkin на компонента widgetFactory на true:
Във версии на Yii преди 1.1.3 трябва да се използва следната конфигурация:
След това създаваме необходимите кожи. Скинове, принадлежащи към един и същ клас на джаджа, се съхраняват в един PHP файл със същото име като името на класа на джаджа. Всички файлове на кожата се съхраняват в директорията protected/views/skins по подразбиране. За да промените директорията, трябва да зададете свойството skinPath на компонента widgetFactory. Например, можем да създадем файл CLinkPager.php в директорията protected/views/skins, чийто код е показан по-долу:
В кода по-горе създаваме две кожи за изпълнимия модул CLinkPager: по подразбиране и класически. Първата кожа ще бъде приложена към всяка джаджа CLinkPager, която не указва изрично свойството на кожата, а втората кожа ще се приложи към всяка джаджа, чието свойство на кожата е зададено на classic. Например, в следния код на изглед, първата джаджа ще използва кожата по подразбиране, а втората джаджа ще използва класическата кожа:
Ако създадем джаджа с набор от първоначални стойности, те ще имат предимство и ще бъдат обединени с всички приложени кожи. Например, следният код на изглед ще създаде пагинация, чиито начални стойности саarray('header'=>'', 'maxButtonCount'=>6, 'cssFile'=>false) , което е резултат от обединяването на оригиналните стойности, посочени в изгледа и класическата кожа.
Имайте предвид, че скинирането НЕ изисква използването на тема. Въпреки това, ако дадена тема е активна, Yii също ще търси кожи в директорията за кожи на изгледите на темата (например WebRoot/themes/classic/views/skins). В случай че съществува кожа със същото име както в директорията за изглед на тема, така и в директорията за изглед на основното приложение, кожата на темата ще има предимство.
Ако джаджа използва кожа, която не съществува, Yii все пак ще създаде джаджата нормално без никакви грешки.
Информация: Използването на кожа може да доведе до влошаване на производителността, тъй като Yii трябва да намери файла на кожата, когато джаджата е създадена за първи път.
Използването на кожи е много подобно на глобалната конфигурация на джаджи. Основните разлики са:
- Кожите са повече за промяна на свойствата, които са отговорни за външния вид на джаджата;
- Една джаджа може да има множество кожи;
- Кожата може да бъде тематична;
- Използването на кожи е по-скъпо от използването на глобалната конфигурация.