Скрипт фотогалереи. Том 1. Глава 2

Monday, 08 February 2010 | Автор: programmer

Продолжаем создание нашей фотогалереи. Как и говорилось раньше, эту статью назовем "Скрипт фотогалереи. Том 1. Глава 2". В этой статье мы попробуем создать backend сайта (админку), где будет реализован функционал добавления категорий и фотографий в фотогалерею. Для этого нам понадобятся следующие материалы из следующих статей: Графика в PHP. Работа с библиотекой GD, Скрипт фотогалереи. Том 1. Глава 1, MVC для начинающих.
Объединив все эти 3 статьи мы сможем создать тот функционал админки, который на данный момент запланирован.

Представим следующим видом структуру каталогов и файлов нашего проекта:

/admin
    class
        admin.php
        images.php
        gallery.php
        template.php
    img
        bg.png
        check.png
        clock.png
        columnBg.png
        columnTop.gif
        del.png
        del_disabled.png
        down.gif
        down_disabled.gif
        edit.png
        email.png
        logo_1programmer.gif
        new.png
        nocheck.png
        syte.gif
        topnav_active.gif
        topnav_stretch.gif
        up.gif
        up_disabled.gif
        www.png
    .htaccess
    admin.php
    gallery.php
    style.css
/images
    gallery
        1.jpg
        1b.jpg
        18.jpg
        18b.jpg
        19.jpg
        19b.jpg
    gallery_logo.png
/class
    js
        jquery.js
    mysql.php
    var.php

/.htaccess
/index.php


Папка "admin" как раз и будет нашей админкой. В админке у нас будет 2 раздела. Первый - настройки фотогалереи, этот раздел представлен двумя файлами admin.php и class/admin.php. Второй раздел - это создание разделов фотогалереи и загрузки в них фотографий, состоит тоже из двух файлов gallery.php и class/gallery.php. Также есть класс работы с изображениями class/images.php, который мы создали в предыдущих статьях. С папкой img все понятно, тут храним изображения для админки.

Рассмотрим для начала файлы gallery.php и class/gallery.php (admin.php не инетересен для изучения, там всего 2 операции: вывод параметров фотогалереи и запись новых в БД, изучите его сами)

        include "../class/var.php";
        include "class/template.php";
        echo viewTemplate::header();
        include "class/gallery.php";
        $calculate = new calculate($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME, false);
        echo viewTemplate::footer();


Тут собственно ничего сложного. Первой строкой мы подцепляем файл var.php, который готовит изначальные настройки фотогалерии. Второй строкой идет подключение tamplate.php, который является графическим представлением (MVC) backend'a. viewTemplate::header() производит вывод шапки админки, далее подцепляем и создаем класс работы с данными фотогалереи: категориями и изображениями. И последней строкой мы выводим подвал админки.

Сам класс работы с фотогалереей разбит на 2 части: модель и представление. На представлении останавливаться не буду, ведь это просто вывод информации исходя из данных, переданных на вход. А вот на реализации модели мы остановимся немного подробнее.

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

        class calculate extends sql_db {
                var $sqlserver;
                var $sqluser;
                var $sqlpassword;
                var $database;

                function calculate($sqlserver, $sqluser, $sqlpassword, $database) {
                        $this->sqlserver        = $sqlserver;
                        $this->sqluser          = $sqluser;
                        $this->sqlpassword      = $sqlpassword;
                        $this->database         = $database;

                        $db = parent::sql_db($sqlserver, $sqluser, $sqlpassword, $database, false); // подключение к БД

                        view::header();

                        if ($_GET['act']=="edit" || $_GET['act']=="add")  // Изменение или создание новой категории
                                view::edit($this->edit($_GET['id']));
                        else if ($_POST['act']=="save") { // Сохранение параметров категории
                                $ok = $this->validate();
                                if ($ok == "")
                                        $this->save();
                                else
                                        view::edit($this->edit($_GET['id']), $ok);
                        }
                        else if ($_GET['act']=="up") // перемещение категории вверх
                                $this->up($_GET['id'], $_GET['pid']);
                        else if ($_GET['act']=="down") // перемещение категории вниз
                                $this->down($_GET['id'], $_GET['pid']);
                        else if ($_GET['act']=="del") // запрос на удаление категории
                                view::del($_GET['id']);
                        else if ($_POST['act']=="del_confirm") // удаление категории
                                $this->del_confirm();
                        else if ($_GET['act']=="photos") // вывод списка фотографий
                                view::viewPhotosList($this->viewPhotosList((isset($_GET['pid'])? $_GET['pid']: (isset($_POST['pid'])? $_POST['pid']: 0))));
                        else if ($_GET['act']=="editPhotos" || $_GET['act']=="addPhotos") // изменение и добавление новой фотографии
                            view::editPhotos($this->editPhotos($_GET['id']));
                        else if ($_POST['act']=="savePhotos") { // сохранение фото
                                $ok = $this->validatePhotos();
                                if ($ok == "")
                                        $this->savePhotos();
                                else
                                        view::editPhotos($this->editPhotos($_GET['id']), $ok);
                        }
                        else if ($_GET['act']=="delPhotos") // запрос на удаление фотографии
                                view::delPhotos($_GET['id']);
                        else if ($_POST['act']=="del_confirmPhotos") // удаление фотографии
                                $this->del_confirmPhotos();

                        else
                                view::viewList($this->viewList()); // вывод списка категорий

                        view::footer();
                }
    }


Думаю в конструкторе не должно возникнуть вопросов, все строки с комментариями.

                function viewList() {
                        parent::sql_query("SELECT *  FROM tbl_cat order by position asc");
                        return parent::sql_fetchrowset();
                }


viewList() выбирает все категории из базы и делает сортировку по полю position.

                function edit($id) {
                        if ($id>0) { // Если в метод передается $id, то это изменение данных
                                parent::sql_query("SELECT * FROM `tbl_cat` where id={$id}");
                                $result = parent::sql_fetchrow();
                        }
                        else { // Если $id не передается, то это новая запись
                                if (!empty($_POST)) { // если $_POST не пустой, значит была какая-то ошибка при сохранении
                                        foreach ($_POST as $key=>$value) {
                                                $result[$key] = $value;
                                        }
                                }
                                else
                                        $result = array();
                        }
                        return $result;
                }

edit() - данный метод предназначен как для изменения уже существующей записи, так и добавления новой.

                function validate() {
                        $result = "";
                        if (trim($_POST['name'])=="") $result.="Вы не ввели наименование";

                        return $result;
                }

validate() - валидация формы. Тут нам интересно только наименование категории, если наименования нет, то это ошибка


                function save() {
                        global $STATIC;
                        $id                     = $_POST['id'];
                        $name                   = addslashes($_POST['name']);

                        if ($id=="") { // добавить новую позицию
                                $sql = "select max(position) as max from tbl_cat";
                                parent::sql_query($sql);
                                $max = parent::sql_fetchrow();
                                $max = $max['max']+1;

                                $sql = "insert into tbl_cat (name, position) VALUES ('{$name}', '{$max}')";
                                parent::sql_query($sql);
                                $id = parent::sql_nextid();
                        }
                        else { // изменить параметры
                                $sql = "update tbl_cat set name='{$name}' where id=".$_POST['id'];
                                parent::sql_query($sql);
                                $id = $_POST['id'];
                        }

                        view::viewList($this->viewList());
                }

Собственно само сохранение данных о категориях фотогалереи в БД. Делится на 2 части, когда изменяются данные уже существующей категории и когда создается новая. Вот интересен момент, когда создается новая. Тут у нас получается 2 запроса - первый берет максимальное значение поля position из таблицы tbl_cat - это поле поможет нам осуществлять сортировку. Вторым запросом мы сохраняем данные в БД.

                function del_confirm() {
                        if (isset($_POST['no']))
                                view::viewList($this->viewList());
                        else {
                                parent::sql_query("delete from tbl_cat where id=".$_POST['id']);
                                parent::sql_query("SELECT id FROM tbl_gallery where cid={$_POST['id']}");
                                $rowset = parent::sql_fetchrowset();
                                if (!empty($rowset) and count($rowset)>0)
                                    foreach ($rowset as $row) {
                                        unlink("../images/gallery/{$row['id']}.jpg");
                                        unlink("../images/gallery/{$row['id']}b.jpg");
                                    }
                                parent::sql_query("delete from tbl_gallery where cid=".$_POST['id']);

                                view::viewList($this->viewList());
                        }
                }

Если удаляется категория, то надо удалить все фотографии этой категории.

                function up($id) {
                    $sql = "SELECT position from tbl_cat where id=$id";
                    parent::sql_query($sql);
                    $f=parent::sql_fetchrow();
                    $pos1 = $f['position'];
                    $id1 = $id;

                    $sql = "SELECT position, id from tbl_cat where position < $pos1 order by position desc limit 0, 1 ";
                    parent::sql_query($sql);
                    $f=parent::sql_fetchrow();
                    $pos2 = $f['position'];
                    $id2 = $f['id'];

                    $sql = "UPDATE tbl_cat SET position=$pos2 where 1 and id=$id1";
                    parent::sql_query($sql);

                    $sql = "UPDATE tbl_cat SET position=$pos1 where 1 and id=$id2";
                    parent::sql_query($sql);

                    view::viewList($this->viewList());
                }

                function down($id) {
                    $sql = "SELECT position from tbl_cat where 1 and id=$id";
                    parent::sql_query($sql);
                    $f=parent::sql_fetchrow();
                    $pos1 = $f['position'];
                    $id1 = $id;

                    $sql = "SELECT position, id from tbl_cat where position > $pos1 order by position asc limit 0, 1 ";
                    parent::sql_query($sql);
                    $f=parent::sql_fetchrow();
                    $pos2 = $f['position'];
                    $id2 = $f['id'];

                    $sql = "UPDATE tbl_cat SET position=$pos2 where 1 and id=$id1";
                    parent::sql_query($sql);

                    $sql = "UPDATE tbl_cat SET position=$pos1 where 1 and id=$id2";
                    parent::sql_query($sql);

                    view::viewList($this->viewList());
                }
    


Эти 2 функции дают возможность менять позицию категории в общем списке категорий.

Думаю с этим кодов у Вас проблем не возникнет. Далее добавить в этот класс обработку событий работы с изображениями, в принципе они будут практически повторять блок работы с категориями.

 

               function viewPhotosList($cid) {
                        parent::sql_query("SELECT * FROM tbl_gallery where cid={$cid} order by datetime desc");
                        return parent::sql_fetchrowset();
                }

 

Вывод всех фотографий какой-то категории, заданной параметром $cid, в обратном хронологическом порядке.

 

                function editPhotos($id) {
                        if ($id>0) {
                                parent::sql_query("SELECT * FROM `tbl_gallery` where id={$id}");
                                $result = parent::sql_fetchrow();
                        }
                        else {
                                if (!empty($_POST)) {
                                        foreach ($_POST as $key=>$value) {
                                                $result[$key] = $value;
                                        }
                                }
                                else
                                        $result = array();
                        }
                        return $result;
                }


                // проверка данных на валидность данных
                function validatePhotos() {
                        $result = "";
                        if ($_POST['id'] == "") {
                            if ($_FILES['file']['error'] !== 0)
                                $result.="Изображение не загруженo";
                            else {
                                require "class/images.php";

                                $image = new Image($_FILES['file']['tmp_name']);
                                if (!is_resource($image->im))
                                    $result.="Тип изображения не поддерживается";
                            }
                        }

                        else if ($_FILES['file']['error'] !== 0) {
                            require "class/images.php";

                            $image = new Image($_FILES['file']['tmp_name']);
                            if (!is_resource($image->im))
                                $result.="Тип изображения не поддерживается";
                        }

                        return $result;
                }

 

Вот тут смотрите как происходит валидация загружаемых данных. Если мы создаем новую запись, то загрузка фотографии обязательна, если фотография загружается и она корректна (проверяем с помощью нашего класса Image), то отдаем положительный результат. Тоже самое делаем если это изменение данных записи и фото грузится.


                function savePhotos() {
                        global $STATIC;
                        $id                     = $_POST['id'];
                        $hint                   = addslashes($_POST['hint']);

                        if ($id=="") { // добавить новую позицию
                                $sql = "insert into tbl_gallery (cid, datetime, hint) VALUES ('{$_POST['pid']}', '".time()."', '{$hint}')";
                                parent::sql_query($sql);
                                $id = parent::sql_nextid();
                        }
                        else {
                                $sql = "update tbl_gallery datetime=".time().", hint='{$hint}' where id={$id}";
                                parent::sql_query($sql);
                        }

                        if ($_FILES['file']['error'] === 0) {
                                require "class/images.php";
                                $image = new Image($_FILES['file']['tmp_name']);
                                $image->waterMark("../images/gallery_logo.png", array("alpha"=>40));
                                $image->saveJpg("../images/gallery/{$id}b.jpg");
                                $image->load($_FILES['file']['tmp_name']);
                                $image->resize($STATIC['img_x'], $STATIC['img_y'], true, "#FFFFFF");
                                $image->saveJpg("../images/gallery/{$id}.jpg");
                        }

                        view::viewPhotosList($this->viewPhotosList((isset($_GET['pid'])? $_GET['pid']: (isset($_POST['pid'])? $_POST['pid']: 0))));
                }

Сохранение данных происходит в 2 этапа. Сначала сохраняются данные в базе, если была новая фотография, то берется последняя добавленная запись методом sql_nextid() класса sql_db, если же происходит изменение, то берется ID из передаваемых данных. Далее если при сохранении была выбрана фотография, то методами класса Images на большую фотографию накладываем водяной знак + из большой фотографии делаем превью.

                function del_confirmPhotos() {
                        if (isset($_POST['no']))
                                view::viewPhotosList($this->viewPhotosList((isset($_GET['pid'])? $_GET['pid']: (isset($_POST['pid'])? $_POST['pid']: 0))));
                        else {
                                parent::sql_query("delete from tbl_gallery where id=".$_POST['id']);
                                unlink("../images/gallery/{$_POST['id']}b.jpg");
                                unlink("../images/gallery/{$_POST['id']}.jpg");

                                view::viewPhotosList($this->viewPhotosList((isset($_GET['pid'])? $_GET['pid']: (isset($_POST['pid'])? $_POST['pid']: 0))));
                        }

                }

 

И собственно удаление фотографии.

 

Кода не так много, весь структурирован. Понять что и где очень легко.

 

Так... В конечно итоге мы имеем backend фотогалереи с возможность добавлять категории и фотографии в эти категории. Все фотографии складываются в папку /images/gallery.

Попробовать проект Вы можете по ссылке http://phpprogs.ru/test/photogallery/

Скачать проект Вы можете по ссылке: http://phpprogs.ru/uploads/photogallery0.1.zip

Обсуждение скрипта: http://phpprogs.ru/forum

 

Просьба не закачивать фотки большого размера. Сервер просто не будет отрабатывать такие запросы. Лучше грузить фотографии размером не больше 500x500.


 
Tweet


Категория(и): Изучаем PHP, Скрипты, MySQL

Комментарии


Tuesday, 03 May 2011 | 19:27:45 | Автор: megan

Parse error: parse error, unexpected T_STATIC, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in ...template.php on line 4    

что за ошибка? перевод я знаю а вот как устранить? в коде ничего не менял, в чем может быть проблема?

Добавить комментарий
Чтобы оставить комментарий, Вам необходимо зарегистрироваться или авторизироваться