
- •Хранилище фотоальбомов
- •Введение
- •Постановка задачи
- •Описание инструментов субд
- •Язык программирования
- •Структура базы данных Диаграмма
- •Описание таблиц
- •Структура web-приложения Определение основных страниц
- •Определение реализации страниц
- •Контроллеры
- •Просмотр списка пользователей
- •Просмотр профиля пользователя
- •Вход пользователя в систему
- •Выход пользователя из системы
- •Регистрация нового пользователя
- •Редактирование профиля
- •Удаление профиля
- •Восстановление пароля
- •Категории
- •Просмотр категорий пользователя
- •Добавление новой категории
- •Редактирование категории
- •Удаление категории
- •Альбомы
- •Вывод списка альбомов
- •Отображение списка альбомов в категории
- •Отображение альбомов конкретного пользователя
- •Добавление альбома
- •Изменение альбома
- •Удаление альбома
- •Фотографии
- •Вывод списка фотографий
- •Вывод списка фотографий в альбоме
- •Вывод списка фотографий пользователя
- •Просмотр фотографии
- •Добавление фотографии
- •Редактирование фотографии
- •Удаление фотографии
- •Поиск фотографии
- •Комментарии
- •Добавление комментариев
- •Просмотр комментариев
- •Оценивание фотографии
- •Просмотр средней оценки
- •Просмотр друзей пользователя
- •Добавление в друзья
- •Запросы в мои друзья
- •Принятие заявки
- •Отклонение заявки
- •Просмотр отправленных мной заявок
- •Удаление пользователя из списка друзей
- •Сообщения
- •Отправка сообщения
- •Просмотр списка диалогов
- •Просмотр диалога
- •Заключение
Просмотр комментариев
Просмотр комментариев осуществляется на странице просмотра фотографии. Комментарии разбиты на страницы по значению, определенному в свойстве контроллера photos $_comments_per_page.
Внешний вид панели комментариев:
Рисунок 37
Оценки
Каждая фотография может быть оценена пользователем по 5-тибальной шкале и притом единожды. За управление оценками отвечает контроллер marks и модель marks_model. В контроллере определены следующие действия:
Действие |
Метод |
Оценить фотографию |
evaluate |
Следовательно, структура контроллера marks будет следующей:
/**
* Контроллер оценок
*/
class Marks extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
/**
* Оценивание фотографии
*/
public function evaluate( $photo_id ) {}
}
Также модель marks_model определяет следующие методы по выборке данных об оценках:
/**
* Получение средней оценки фотографии
*/
public function get_avg_mark( $photo_id )
{
$this->db->where("photo_id", $photo_id);
$this->db->select_avg('mark');
$res = $this->db->get(MARKS_TABLE);
$mark = $res->result_array();
return $mark[0]['mark'] ? $mark[0]['mark'] : 0;
}
/**
* Получение оценки пользователя
*/
public function get_mark( $photo_id, $user_id )
{
$where = array(
'user_id' => $user_id,
'photo_id' => $photo_id
);
$this->db->where($where);
$res = $this->db->get(MARKS_TABLE);
$mark = $res->result_array();
return $mark ? $mark[0] : 0;
}
Оценивание фотографии
Форма оценивания располагается на странице просмотра фотографии. Ее внешний вид:
Рисунок 38
После отправки формы система оповещает о результате:
Просмотр средней оценки
После оценивания хотя бы одним человеком доступна статистика в виде прогрессбара:
Рисунок 39
Пользователь, поставивший оценку, теперь будет видеть ее на месте формы.
Друзья
Для связывания пользователей служит связь «друг». Каждый пользователь может добавить к себе в список друзей интересных ему людей. Список друзей контролируется контроллером friends и моделью friends_model.
Для того, чтобы пользователю добавиться в друзья необходимо для начала отправить заявку, которую другой пользователь должен подтвердить.
Контроллер предоставляет следующие интерфейсы для управления друзьями:
Действие |
Метод |
Просмотр друзей пользователя |
user |
Запросы в мои друзья |
requests |
Отправленные мной заявки |
my_requests |
Добавление в друзья |
add |
Удаление из друзей |
delete |
Принятие заявки |
accept |
Отвержение заявки |
decline |
Отменна заявки |
abort |
Тогда, структура контроллера будет иметь вид:
/**
* Контроллер друзей
*/
class Friends extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
/**
* Вывод списка друзей
*/
public function index() {}
/**
* Просмотр друзей пользователя
*/
public function user( $id = null ) {}
/**
* Запросы в друзья
*/
public function requests() {}
/**
* Отправленные мной заявки
*/
public function my_requests() {}
/**
* Добавление в друзья
*/
public function add( $user_id ) {}
/**
* Удаление из друзей
*/
public function delete( $user_id ) {}
/**
* Принятие заявки
*/
public function accept( $request_id ) {}
/**
* Отвержение заявки
*/
public function decline( $request_id ) {}
/**
* Отмена заявки
*/
public function abort( $request_id ) {}
}
Модель friends_model имеет следующие методы по выборке данных о друзьях:
/**
* Получение информации о связи
*/
public function get_friend($where)
{
$res = $this->db->get_where(FRIENDS_TABLE, $where)->result_array();
return $res ? $res[0] : array();
}
/**
* Получение списка друзей пользователя
*/
public function get_friends( $id = null )
{
$friends = FRIENDS_TABLE;
$users = USERS_TABLE;
$q1 = $this->db
->select(" F.friend2 AS friend,
F.confirmed,
U.name")
->from("$friends F")
->join("$users U", "F.friend2 = U.id")
->where("F.friend1 = $id")
->where("F.confirmed = 1")
->get()->result_array();
$q2 = $this->db
->select(" F.friend1 AS friend,
F.confirmed,
U.name")
->from("$friends F")
->join("$users U", "F.friend1 = U.id")
->where("F.friend2 = $id")
->where("F.confirmed = 1")
->get()->result_array();
$res = array_merge($q1, $q2);
$friends = array();
// Преобразовываем результат
foreach ( $res as $value )
{
$tmp = array();
foreach ( $value as $k => $v )
{
$tmp[$k] = $v;
}
$friends[$value['friend']] = $tmp;
}
return $friends;
}
/**
* Проверка дружбы
*/
public function is_friend( $user_id, $friend_id )
{
$friends = FRIENDS_TABLE;
$res = $this->db
->select("id")
->from("$friends")
->where(
"(friend1 = $user_id AND
friend2 = $friend_id AND
confirmed = 1)"
)
->or_where(
"(friend1 = $friend_id AND
friend2 = $user_id AND
confirmed = 1)"
)->get()->result_array();
return $res ? true : false;
}
/**
* Количество друзей
*/
public function get_friends_count( $user_id )
{
$friends = FRIENDS_TABLE;
$res = $this->db
->select("COUNT(id) AS friends_count")
->from("$friends")
->where(
"( friend1 = $user_id OR friend2 = $user_id ) AND confirmed = 1")
->get()->result_array();
return $res ? $res[0]['friends_count'] : 0;
}
/**
* Заявки в друзья к пользователю
*/
public function get_requests( $user_id )
{
$friends = FRIENDS_TABLE;
$users = USERS_TABLE;
$res = $this->db
->select(" F.id AS request_id,
F.friend1 AS user_id,
U.name AS user_name,
F.date")
->from("$friends F")
->join("$users U", "F.friend1 = U.id")
->where(array(
"confirmed" => "0",
"friend2" => $user_id
))
->get()->result_array();
return $res;
}
/**
* Отправленные пользователем заявки
*/
public function get_my_requests( $user_id )
{
$friends = FRIENDS_TABLE;
$users = USERS_TABLE;
$res = $this->db
->select(" F.id AS request_id,
F.friend2 as user_id,
U.nam as user_name,
F.date")
->from("$friends F")
->join("$users U", "F.friend2 = U.id")
->where(array(
"confirmed" => "0",
"friend1" => $user_id
))
->get()->result_array();
return $res;
}
Эти методы вызываются не только из контроллера friends, но и из других контроллеров.