Вывод списка фотографий пользователя
Вывод списка всех фотографий производится в методе user контроллера photos. Он принимает идентификатор пользователя и страницу для отображения списка постранично. Частичный листинг метода user:
/**
* Вывод списка фотографий пользователя
*/
public function user( $user_id, $page = 1 )
{
...
$user = $this->users_model->get_user(array('id'=>$user_id));
if ( !$user )
{
$this->setError(
"Пользователя с таким номером нет",
"photos"
);
}
...
// Обрабатываем страницу
$count_of_pages = $this->db_model->get_count_of_pages(
PHOTOS_TABLE,
array('user_id' => $user_id),
$this->_photos_per_page
);
// Выбираем фотографии
$this->data['photos'] = $this->photos_model->get_photos(
array("user_id" => $user_id),
$this->_photos_per_page,
( $page - 1 ) * $this->_photos_per_page
);
// Загружаем вид
$this->load->view('view', $this->data);
}
Вид основного блока практически аналогичен выводу по альбому:
Рисунок 31
Просмотр фотографии
Просмотр фотографии и комментариев к ней осуществляется на странице, формируемой методом photo контроллера photos.
Метод принимает два параметра: идентификатор фотографии и текущую страницу. Осуществляется проверка на существование запрашиваемой фотографии, и в зависимости от результата метод либо вызывает ошибку, либо загружает данные и само отображение.
Метод имеет следующий частичный листинг:
/**
* Просмотр фотографии
*/
public function photo( $photo_id, $page = 1 )
{
// Выборка фотографии
$photo = $this->photos_model->get_photo( $photo_id );
if ( ! $photo )
{
$this->setError(
"Фотографии с номером <b>$photo_id</b> нет",
"photos"
);
}
// Получаем оценку пользователя для данной фотографии
$mark = array();
if ( $this->user )
$mark = $this->marks_model->get_mark($photo_id);
// Обрабатываем страницу
...
// Формируем путь
$date = date_parse($photo['date']);
$photo_url = base_url() .
PHOTOS_DIR .
$date['year'] . "/" .
$date['month'] . "/" .
$date['day'] . "/" .
$photo['file_name'];
...
// Загружаем вид
$this->load->view('view', $this->data);
}
Внешний вид основного блока:
Рисунок 32
На данной странице расположены ссылки на добавление комментариев и оценивание фотографии. Обработчики этих действий выходят за рамки контроллера photos, поэтому будут рассмотрены позже.
Также, если фотография не будет найдена, то система перенаправит пользователя по адресу /photos и выдаст следующую ошибку:
Добавление фотографии
Добавление новых фотографий осуществляет метод add контроллера photos. Он загружает форму загрузки фотографии и обрабатывает пришедший запрос. Вызвать метод можно из нескольких мест, различия лишь в том, будет ли установлен альбом, куда загружать фотографию или пользователь сам должен будет его выбрать из списка.
Частичный листинг метода add:
/**
* Добавление фотографии
*/
public function add( $album_id = null )
{
$albums = $this->albums_model->get_albums(
array("user_id" => $this->user['id'])
);
// Проверяем существование альбомов
if ( ! $albums )
{
$this->setError(
"Невозможно добавить фотографию. " .
"Для начала создайте хотя бы один альбом",
"albums/add"
);
}
...
// Принимаем данные формы
if ( $this->input->post("submit") )
{
// Определяем правила проверки
$config = array();
// Устанавливаем правила
// Проверяем данные формы
if ( $this->form_validation->run() == true )
{
// Пытаемся загрузить файл
// Создаем папки, если их еще нет
// Определяем критерии фотографии
$config = array(
"upload_path" => $dir
"encrypt_name" => "true"
...
);
// Загружаем
if ( $this->upload->do_upload() )
{
// Проверка на целостность
$album = $this->albums_model->get_album($photo['album_id']);
if ( ! $album || ($this->user['id'] != $album['user_id']) )
{
$this->setError(
"Загрузка фотографий в чужой альбом недопустима",
"photos/add"
);
}
// Формируем массив
$photo = array();
...
// Заносим информацию в БД
if ( $id = $this->db_model->insert(PHOTOS_TABLE, $photo) )
...
}
else
{
// Выводим ошибку загрузки
}
}
}
// Загружаем отображение
$this->load->view('view', $this->data);
}
Внешний вид формы загрузки:
Рисунок 33
Ошибка при отсутствии категорий:
Ошибка при отсутствии альбомов:
Пример ошибки загрузки файла: