Редактирование фотографии
Редактирование фотографии производится аналогично добавлению, за исключением того, что новые данные не заносятся в базу, а обновляются. Редактирование фотографий осуществляет метод edit контроллера photos.
Удаление фотографии
Удаление фотографии происходит в два этапа:
1. Удаление физического файла с диска
2. Удаление записи о файле из БД
Удаление фотографии осуществляет метод delete контроллера photos. Он получает в качестве параметра идентификатор фотографии, проверяет ее авторство, и, если у пользователя достаточно прав для удаления, удаляет фотографию.
Частичный листинг метода delete:
/**
* Удаление фотографии
*/
public function delete( $photo_id )
{
// Проверяем существование фотографии
$photo = $this->photos_model->get_photo( $photo_id );
if ( ! $photo )
$this->setError(
"Фотография с номером $photo_id не найдена",
"photos/user/{$this->user['id']}"
);
// Проверка авторства фотографии
if ( $this->user['id'] != $photo['user_id'] )
$this->setError(
"Вы не можете удалять чужие фотографии",
"photos/user/{$this->user['id']}"
);
// Удаляем запись о фтографии из БД
if ( $this->db_model->delete(PHOTOS_TABLE, array('id' => $photo_id)) )
{
// Удаляем файл с диска
$date = date_parse($photo['date']);
$photo_url = "./" .
PHOTOS_DIR .
$date['year'] . "/" .
$date['month'] . "/" .
$date['day'] . "/" .
$photo['file_name'];
@unlink($photo_url);
$this->setMessage("Фотография <b>{$photo['title']}</b> удалена");
}
else
$this->setError("Фотография <b>{$photo['title']}</b> удалена");
redirect("photos/album/{$photo['album_id']}");
}
При удачном удалении фотографии система выдает сообщение:
Поиск фотографии
На сайте определен поиск фотографии, как по названию самой фотографии, так и по названию альбома. Поиск осуществляется методом search модели photos_model, а загрузка результатов производится методом search контроллераphotos, который имеет следующий листинг:
/**
* Поиск фотографии
*/
public function search()
{
$photos = array();
$q = "";
// Пинимаем строку поиска
if ( $this->input->post("submit") )
{
$q = $this->input->post("q");
if ( ! $q )
$this->setMessage("Введите строку поиска");
else
$photos = $this->photos_model->search($q);
}
// Загружаем вид
$this->load->view('view', $this->data);
}
Листинг метода search модели photos_model:
/**
* Поиск фотографии
*/
public function search( $q = "" )
{
$photos = PHOTOS_TABLE;
$albums = ALBUMS_TABLE;
$users = USERS_TABLE;
return $this->db
->select(" P.*,
U.name AS user_name,
A.title AS album_title")
->from("$photos P")
->join("$users U", "P.user_id = U.id")
->join("$albums A", "P.album_id = A.id")
->like("P.title", $q)
->or_like("A.title", $q)
->order_by("P.id DESC")
->get()
->result_array();
}
Внешний вид страницы поиска:
Рисунок 34
Комментарии
Комментарии - это мнения о фотографиях, оставляемые пользователями. В данном случае комментарии могут быть от зарегистрированных пользователей и от гостей. При оставлении комментария зарегистрированным пользователем, авторство комментария определяется полем user_id в таблице comments. Если пользователь не авторизован, то ему необходимо указать свой E-mail, чтобы добавить комментарий.
Комментарии управляются контроллером comments. Он предоставляет доступ к следующим действиям:
Действие | Метод |
Добавление комментария | add |
Контроллер имеет следующую структуру:
class Comments extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
/**
* Добавление комментария
*/
public function add( $photo_id ) {}
}
Также модель comments_model содержит метод get_comments, который возвращает список комментариев в зависимости от условий:
/**
* Получение комментариев
*/
public function get_comments( $where = array(), $limit = 1000, $offset = 0 )
{
$users = USERS_TABLE;
$comments = COMMENTS_TABLE;
return $this->db
->select(" C.*,
U.name AS user_name")
->from("$comments C")
->join("$users U", "C.user_id = U.id", "LEFT")
->having($where)
->limit($limit, $offset)
->order_by("C.id DESC")
->get()
->result_array();
}