Ну что же, серверная часть готова, самое время взяться за клиентскую.
Пользовательский интерфейс мы создадим используя js фреймворк angelarjs (функционал) и css фреймворк twitter bootstrap (интерфейс).
Одностраничное приложение
Вся работа с клиентской частью приложения будет осуществляться через уже созданный нами файл client/index.html, который нам и отдает веб-сервер при открытии http://client.local.
Описание приложения AngularJS
Добавим атрибут ng-app тегу html. Назовем наше приложение yii2AngApp.
<!DOCTYPE html> <!-- Описание приложения AngularJS --> <html ng-app="yii2AngApp"> <head> ...
Контроллер AngularJS по-умолчанию
Добавим атрибут ng-controller тегу body . Сам контроллер назовем index .
... </head> <!-- Описание контроллера AngularJS по-умолчанию --> <body ng-controller="index"> ...
Главное меню
Добавим основную разметку интерфейса приложения внутри тега body:
... <body ng-controller="index"> <nav class="navbar navbar-default"> <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="#/">Одностраничное приложение</a> </div> <ul class="nav navbar-nav navbar-right"> <li><a href="#/"><i class="glyphicon glyphicon-home"></i> Главная</a></li> <li><a href="#/site/about"><i class="glyphicon glyphicon-tag"></i> О приложении</a></li> <li><a href="#/site/contact"><i class="glyphicon glyphicon-envelope"></i> Обратная связь</a></li> </ul> </div> </nav> <div id="main" class="container"> <!-- Здесь будет динамическое содержимое --> <div ng-view></div> </div> <footer class="text-center"> <p>Работает на Yii 2.0.4 и AngularJs 1.3.15</p> </footer> ...
Класс navbar используется для отображения главного меню. Блок <div id=»main» class=»container»> будет контейнером для динамического содержимого. А footer , как мы можете догадаться, это просто футер.
Основной модуль
В основном модуле мы опишем настройки и компоненты приложения. Назовем новый файл client/app.js и наполним его:
'use strict'; // Ссылка на серверную часть приложения var serviceBase = 'http://server.client'; // Основной модуль приложения и его компоненты var yii2AngApp = angular.module('yii2AngApp', [ 'ngRoute', 'yii2AngApp.site' ]); // рабочий модуль var yii2AngApp_site = angular.module('yii2AngApp.site', ['ngRoute']); yii2AngApp.config(['$routeProvider', function($routeProvider) { // Маршрут по-умолчанию $routeProvider.otherwise({redirectTo: '/site/index'}); }]);
Теперь маршрут по-умолчанию /site/index будет обрабатываться модулем yii2AngApp.site .
Модуль yii2AngApp.site
Создадим новый файл client/controllers/site.js и опишем в нем контроллер модуля yii2AngApp.site .
'use strict'; yii2AngApp_site.config(['$routeProvider', function($routeProvider) { $routeProvider .when('/site/index', { templateUrl: 'views/site/index.html', controller: 'index' }) .when('/site/about', { templateUrl: 'views/site/about.html', controller: 'about' }) .when('/site/contact', { templateUrl: 'views/site/contact.html', controller: 'contact' }) .otherwise({ redirectTo: '/site/index' }); }]) .controller('index', ['$scope', '$http', function($scope,$http) { // Сообщение для отображения представлением $scope.message = 'Вы читаете главную страницу приложения. '; }]) .controller('about', ['$scope', '$http', function($scope,$http) { // Сообщение для отображения представлением $scope.message = 'Это страница с информацией о приложении.'; }]) .controller('contact', ['$scope', '$http', function($scope,$http) { // Сообщение для отображения представлением $scope.message = 'Пишите письма. Мы будем рады!.'; }]);
Получился контроллер, очень похожий на SiteController из yii2 приложения:
yii2AngApp_site.config(['$routeProvider', function($routeProvider) { $routeProvider .when('/site/index', { templateUrl: 'views/site/index.html', controller: 'index' }) ... .otherwise({ redirectTo: '/site/index' }); }])
Мы описали маршруты, их контроллеры и шаблоны отображения.
- templateUrl — внешний html файл, использующийся для отображения содержимого, аналогичен представлениям в Yii 2.0;
- controller — контроллер, который подготовит данные для отображения, аналогично yii контроллеру.
Последний блок .otherwise указывает на действие при отсутствии маршрута.
Рассмотрим еще один фрагмент нашего контроллера:
.controller('index', ['$scope', '$http', function($scope,$http) { // Сообщение для отображения представлением $scope.message = 'Вы читаете главную страницу приложения. '; }])
Объект $scope — область видимости в angularjs приложении, в данном случае, это все теги внутри тега с атрибутом ng-app .
$scope.message — переменная, которая содержит сообщение для отображения представлением views/site/index.html.
Подключаем готовые модули
Свеже созданные модули подключаются в файле client/index.html как простые js скрипты:
<!-- Подключаем AngularJS --> <script src="assets/angular/angular.min.js"></script> <script src="assets/angular/angular-route.min.js"></script> <!-- Подключаем модули приложения --> <script src="app.js"></script> <script src="controllers/site.js"></script> </body>
Шаблоны отображения данных
Создадим файлы шаблонов, используемых контроллером.
client/views/site/index.html
<div class="jumbotron text-center"> <h1>Главная страница</h1> <p>{{ message }}</p> </div>
client/views/site/about.html
<div class="jumbotron text-center"> <h1>О приложении</h1> <p>{{ message }}</p> </div>
client/views/site/contact.html
<div class="jumbotron text-center"> <h1>Обратная связь</h1> <p>{{ message }}</p> </div>
Мы сделали наброски представлений, простые болванки для соответствующих страниц. Настало время проверить в действии магию angularjs.
Контроль
Откроем в браузере адрес http://client.local. Как мы можем убедиться, простое фронтенд angularjs приложение уже работает:
Введение;
Подготовка;
Серверная часть;
Клиентская часть 1;
Клиентская часть 2.
thumbs up