Авторизация







Регистрация / Забыли пароль?

Регистрация нового пользователя











< Назад

Восстановление пароля





< Назад

Добро пожаловать

Выход


Ежедневное обновление статей и уроков, будь в курсе, держи руку на пульсе событий!

Главная >> PHP

Создаём сайт на PHP, MySQL и jQuery Mobile


Технологии появляются и развиваются очень быстро, ещё недавно мы не думали что будет такая вещь как мобильный телефон, и уж точно что одним прикосновением можно будет им управлять. Но сейчас, когда у нас всё это есть, и мы работаем в сети интернет, мы не должны забывать о том, чем повсеместно пользуемся, и какой выгоды решаемся не используя это. Мобильный телефон тоже должен получить свою долю внимания в наших проектах, ведь он часть всемирной информационной паутины.


  В первой части данной статьи, мы начнём создавать простой сайт с помощью PHP и MySql, используя паттерн программирования Модель-Вид-Контроллер (MVC). С помощью jQuery mobile, мы превратим наш сайт в touch сайт, который будет удобен обладателям мобильных телефонов, и даст возможность с помощью сенсорного экрана путешествовать по нему на любом устройстве и при любом разрешении экрана. 
  В первой части статьи, мы сосредоточимся на основах, создадим базу данных и организацию данных согласно MVC. Во второй части, мы интегрируем jQuery mobile и создадим пользовательский интерфейс.
 

  Файловая Структура
  Так как мы используем паттерн программирования MVC, то структура файлов нашего проекта будет выглядеть как на изображении ниже. Не пугайтесь большому количеству файлов которые мы создадим, ведь код в них является коротким и простым.

Файловая структура сайта MVC

  Схема Базы Данных
  Для работы нашего сайта, понадобятся две таблицы, одна с категориями товара jqm_categories, другая с его описаниями jqm_products. Каждый продукт имеет поле категории, к которой относится.

Структура таблицы категорий

  Таблица имеет следующие поля: ID, название категории и количество продукции которое есть в каждой из категорий.

Структура таблицы продуктов

  Таблица продуктов: ID каждого продукта, номер категории к которой он принадлежит, наименование, производителя, а так же цену.
  SQL код который создаёт обе таблицы, находится в файле tables.sql, скачать его вы можете вместе с готовым сайтом в архиве .ZIP вверху страницы по ссылке «Скачать». Создаём базу данных, заходим во вкладку импорт и загружаем файл, вот и всё. Не забудьте указать название созданной базы данных файле config.php нашего проекта

  Модель
  Модель на нашем сайте будет работать с двумя созданными раннее таблицами продуктов и категорий, с помощью метода find(), который будет асинхронно создавать запросы к базе данных и возвращать массив объектов. Для начала, мы должны установить соединение с базой данных, для этого я буду использовать класс PDO.

  includes/connect.php

/*
    Этот файл создаёт новое подключение к MySQL используя PDO класс.
    Настройки подключения находятся в config.php.
*/

try {
    $db = new PDO(
        "mysql:host=$db_host;dbname=$db_name;charset=UTF-8",
        $db_user,
        $db_pass
    );
    
    $db->query("SET NAMES 'utf8'");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

catch(PDOException $e) {
    error_log($e->getMessage());
    die("Ошибка подключения к базе данных!");
}

  Переменная  $db это объект нашего подключения, находящийся в глобальной области видимости, которую мы будем использовать в файлах модели приведённых ниже, для работы с базой данных.

includes/models/category.model.php

class Category{
    
    /*
        Статический метод выбора категорий
        из базы данных и возврат их как
        массив объектов категорий
    */
    public static function find($arr = array()){
        global $db;
        if(empty($arr)){
            $st = $db->prepare("SELECT * FROM jqm_categories");
        }
        else if($arr['id']){
            $st = $db->prepare("SELECT * FROM jqm_categories WHERE id=:id");
        }
        else{
            throw new Exception("Функция не поддерживается!");
        }
        $st->execute($arr);
        // Возвращаем массив объектов категорий
        return $st->fetchAll(PDO::FETCH_CLASS, "Category");
    }
}

  Данная модель, является простым определением статического класса find(),  в качестве входного параметра для которого необходим запрос в виде массива. 
  Выходным параметром является так же массив с получившимися результатами. Для его формирования, мы используем метод fetchAll, передавая ему константу PDO :: FETCH_CLASS (цикл PDO класса), при этом создаётся новый объект класса, в котором данные о категории отформатированы особым способом.

  Такой же статический класс реализован и для работы с таблицей продуктов.

  includes/models/product.model.php

class Product{
    
    // Статический метод возвращающий результат
    // поиска объекта Продукт в базе данных 
    public static function find($arr){
        global $db;
        
        if($arr['id']){
            $st = $db->prepare("SELECT * FROM jqm_products WHERE id=:id");
        }
        else if($arr['category']){
            $st = $db->prepare("SELECT * FROM jqm_products WHERE category = :category");
        }
        else{
            throw new Exception("Функция не поддерживается!");
        }
        $st->execute($arr);
        return $st->fetchAll(PDO::FETCH_CLASS, "Product");
    }
}

  Конечно можно было объединить эта два класса, но создание отдельных, позволит нам использовать разные стили и шаблоны для каждого из них (те, которые начинаются с символа подчёркивания). Об этом, мы поговорим в следующем уроке. 

  Что ж, настало время переходить к программированию контроллера.

Представление нашего MVC на сайте

  Контроллер

  Для извлечения данных и формирования представления, контроллер использует метод модели find().
  На нашем сайте будет два контроллера – первый для главной страницы, второй для страницы с категориями.

  includes/controllers/home.controller.php

/* Класс отображающий домашнюю страницу */

class HomeController{
    public function handleRequest(){
        
        // Выбор категории:
        $content = Category::find();
        
        render('home',array(
            'title'        => 'Добро пожаловать в наш компьютерный магазин!',
            'content'    => $content
        ));
    }
}

  Каждый контроллер определяет handleRequest() метод. Этот метод вызывается, когда совершен переход  по URL. Мы вернемся к этому через секунду, когда будем обсуждать index.php.

  В случае с HomeController, handleRequest() просто выбирает все категории с помощью модели find(). Используя вспомогательные функции (includes/helpers.php), с помощью render, и передачи в него заголовка выбранных категорий, метод формирует представление домашней странички (includes/views/home.php).

  includes/controllers/category.controller.php

/* Класс возвращающий категорию страницы */

class CategoryController{
    public function handleRequest(){
        $cat = Category::find(array('id'=>$_GET['category']));
        
        if(empty($cat)){
            throw new Exception("Категория не найдена!");
        }
        
        // Показываем все категории:
        $categories = Category::find();
        
        // Показываем все продукты данной категории:
        $products = Product::find(array('category'=>$_GET['category']));
        
        // $categories и $products оба объектных массива
        
        render('category',array(
            'title'            => 'Смотрим '.$cat[0]->name,
            'categories'    => $categories,
            'products'        => $products
        ));        
    }
}

  Первое, что делает этот класс, выбирает категорию по id (передаётся как часть URL с помощью GET). Если всё прошло успешно, то он извлекает список категорий, или список продуктов связанных с выбранной категорией. 

  Теперь давайте посмотрим, как все это работает вместе, разобрав код index.php:

index.php

/*
    Это основная страница нашего сайта.
    Подключаем необходимые для работы файлы
*/

require_once "includes/main.php";

try {

    if($_GET['category']){
        $c = new CategoryController();
    }
    else if(empty($_GET)){
        $c = new HomeController();
    }
    else throw new Exception('Ошибка на странице!');
    
    $c->handleRequest();
}
catch(Exception $e) {
    // render() вспомогательная функция, и может отображать ошибки
    render('error',array('message'=>$e->getMessage()));
}

  Это наш первый файл, который в зависимости от $_GET выполняет то или иное действие. Он создаёт новый объект контроллера и выполнит его handleRequest() метод. В случае неудачи в любом месте приложения, будет сгенерировано исключение, которое с помощью catch выведет ошибку в шаблоне.

  Еще один момент, который стоит отметить, - в первой строке этого файла, мы подключаем main.php. 
  Что это за файл, вы можете увидеть ниже:

main.php

/*
    Основной файл заголовков.
    Используется только в index.php и поддерживает его в актуальном состоянии.
*/

require_once "includes/config.php";
require_once "includes/connect.php";
require_once "includes/helpers.php";
require_once "includes/models/product.model.php";
require_once "includes/models/category.model.php";
require_once "includes/controllers/home.controller.php";
require_once "includes/controllers/category.controller.php";

// Это позволить браузеру кэшировать страницы

header('Cache-Control: max-age=3600, public');
header('Pragma: cache');
header("Last-Modified: ".gmdate("D, d M Y H:i:s",time())." GMT");
header("Expires: ".gmdate("D, d M Y H:i:s",time()+3600)." GMT");

  Этот файл с помощью require_once подключает все необходимые вспомогательные файлы, модели и виды, а так же содержит  несколько заголовков для кэширования в браузере. Такой подход помогает  увеличить производительность jQuery и баз данных (ведь в PHP по умолчанию отключено).

  На этом первая часть данного повествования закончена, впереди ещё одна, последняя, где мы и допишем наш сайт.

  Материал взят из зарубежного источника. И представлен исключительно в ознакомительных целях.


Дата публикации: 23.01.2013
Опубликовал: Сергей Кашурин
Просмотров: 477
Правила перепечатки

Правила перепечатки

Уважаемый посетитель сайта!
Ниже преведены условия использования и перепечатки материалов сайта /
Все материалы данного сайта подготовлены для Вас лично мной.

Большая часть материалов сайта - это авторские уроки, остальные, это переводы уроков с английского языка на русский.
Если Вы решили использовать материалы данного сайта где-то на своих ресурсах или в рассылке, то соблюдайте следующие требования:
1. Урок или статья должны перепечатываться «как есть» с сохранением всех ссылок на источник урока, а если это перевод, то и на сайт, авторы которого подготовили его.
2. Ссылки на сайт источника и переводчика обязательно должны быть работоспособными (при нажатии по ссылке человек должен перейти на сайт автора/переводчика). Если Вы перепечатали какой-либо документ, обязательно проверьте ссылку на работоспособность.
3. Искажение информации об авторе, источнике, переводчике при перепечатке материалов запрещено!
4. Содержание урока или статьи при перепечатке не должно подвергаться модификациям и переделке. Все уроки и статьи, размещенные на сайте, должны перепечатываться как есть. Вы не имеете права урезать, исправлять или иным образом коверкать републикуемый документ.
С уважением, Сергей Кашурин– владелец сайта /


100 бесплатных PSD элементов для веб-дизайна и мобильных устройств.
Всем привет! Давайте сегодняшний день сделаем исключением, и вместо урока, посмотрим очень классные PSD заготовки для веб-сайтов и мобильных приложений которые вы сможете бесплатно скачать!
23 jQuery плагина для организации слайд-шоу и галерей на сайте
Дорогие Друзья! Сегодня, я хочу познакомить вас с подборкой замечательных jQuery плагинов для создания слайд-шоу и галерей. Все они являются бесплатными и очень просты в установке и настройке.
24 классных PHP библиотеки, о которых вы должны знать
Для PHP-разработчика, и времени лучшего не придумаешь чем сейчас. Ведь каждый день, появляются всё новые и новые вспомогательные элементы, такие, как например полезные библиотеки.

Уроки и статьи

«Найден Самый Дешевый и Эффективный Способ Рекламы в Интернете!»

Доказанo: ведение своей почтовой рассылки - это самый действенный и дешевый метод рекламы в Интернете.

Используете ли Вы его?

Если нет, то Вы давно теряете свои деньги! Если да, то пришло время вести Вашу почтовую рассылку на самом эффективном инструменте в Рунете - сервисе рассылок SmartResponder.ru

Узнать об этом подробнее >>

Быть в курсе всех событий: