Skip to content

Commit

Permalink
Улучшение кода класса администраторского модуля
Browse files Browse the repository at this point in the history
— Неиспользуемый код удалён
— Избавление от повторяющегося кода (Как пример — продление или
отклонение заявки — это теперь одна функция — обработать заявку)
— Работа с префиксами базы данны�
— Переменными теперь можно что-то немного сконфигурировать
— Документация
— Немного изменён тестс посылаемого письма
— Изменён лимит выводимых по умолчанию строк, в связи со стандартами
джумлы
— Функции из файла модуля перенесены сюда
— Добавлена функция класса для подсчёта заявок
  • Loading branch information
polyskalov committed Jul 25, 2013
1 parent 1ce5d04 commit 462493e
Showing 1 changed file with 91 additions and 91 deletions.
182 changes: 91 additions & 91 deletions manager/mod_books_extension_class.php
Original file line number Diff line number Diff line change
@@ -1,153 +1,153 @@
<?php

class Book_extension extends JObject {
/**
* Объект для взаимодействия с базой данных
* @var Object
*/
protected $_db;

// Уведомлять ли по электропочте
/**
* Уведомлять ли пользователя по электропочте
* @var boolean
*/
private static $notificateByEmail = true;

// Если пользователь — редактор, (переменная = true)
public static $isEditor;

// Группа администраторов
public static $allowedUserGroup = 9;


function __construct() {
jimport('joomla.access.access');
/**
* Подпись в уведомительном письме электропочты
* @var string
*/
private static $email_signature = '<br><p>-- <br>Качканарская городская библиотека им. Ф. Т. Селянина<br>Адрес: 5а мкр.&nbsp;7а&nbsp;дом. Тел: (+7 34341)&nbsp;6–02–99.<br>Сайт: <a href="http://gorbib.org.ru">http://gorbib.org.ru</a></p>';

$user = JFactory::getUser();
/**
* Имя таблицы с данными модуля в базе данных
* @var string
*/
private $_db_tablename = 'booksextension';

$userGroup = JAccess::getGroupsByUser($user->id);
/**
* Удалять ли заявку из базы данных после обработки
* (При отключёнии, записи в базе данных можно использовать как логи)
* @var boolean
*/
private static $removeOnProcessed = false;

$this-> isEditor = true;
//($_SERVER['REMOTE_ADDR'] == '192.168.0.107');

/**
* Инициализация модуля
*/
function __construct() {
$this->_db = JFactory::getDbo();
}

// Отправка уведомления на почту
public function notificate($requestID, $status, $reason = '') {
$headers = "From: gorbib@yandex.ru\r\n";
$headers .= "Content-type: text/html;charset=utf-8\r\n";

$data = $this-> getRequest($requestID);

if ( empty($data) ) return false;
/**
* Отправка уведомления пользователю на электропочту
* @param array $requestData Информация заявки
* @param boolean $accepted Статус обработки (продления)
* @param string $comment Комментарий администратора
* @return boolean Статус отправки сообщения
*/
public function notificate($requestData, $accepted, $comment = '') {

$email = $data['email'];
$name = $data['name'];
if( !self::$notificateByEmail ) return;

$email = $requestData['email'];
$name = $requestData['name'];

if ( empty($email) ) return false;

if ( empty($name) ) $name = 'Дорогой читатель';

// Сообщения, отправляемые пользователю
$Messages = array(
// Продлено
'accepted' => array(
'subject' => 'Книга продлена',
'text' => "<p>Здравствуйте, $name. </p><br><p>Мы обработали Вашу заявку и продлили книгу <i>{$data['book']}</i>. Приятного чтения.</p> <br> -- <br> С уважением, Качканарская городская бибилиотека им. Ф. Т. Селянина."
'text' => "<p>Здравствуйте, $name. </p><br><p>Мы обработали Вашу заявку и продлили книгу <i>{$requestData['book']}</i>. Приятного чтения.</p>"
),
// Не продлено
'rejected' => array(
'subject' => 'Книга НЕ продлена',
'text' => "<p>Здравствуйте, $name. </p><br><p>К сожалению, не удалось продлить книгу <i>{$data['book']}</i>. </p><p>Вы можете узнать причину и продлить книгу, позвонив по номеру 6-02-99</p><br> -- \n<br> С уважением, Качканарская городская бибилиотека им. Ф. Т. Селянина."
'text' => "<p>Здравствуйте, $name. </p><br><p>К сожалению, мы не продлили книгу <i>{$requestData['book']}</i>. Для получения подробной информации свяжитесь с библиотекой.</p>"
));

$statusAsText = ( $status? 'accepted' :'rejected' );
$statusAsText = ( $accepted? 'accepted' :'rejected' );

return mail($email, $Messages[$statusAsText]['subject'].'. Качканарская городская библиотека им. Ф. Т. Селянина', $Messages[$statusAsText]['text'], $headers);
}

// Добавить новую заявку
public function addRequest($name, $email, $book) {
$name = htmlspecialchars($name);
$email = htmlspecialchars($email);
$book = htmlspecialchars($book);
// Заголовки письма
$headers = "From: gorbib@yandex.ru\r\n";
$headers .= "Content-type: text/html;charset=utf-8\r\n";

if(!empty($name) && !empty($email) && !empty($book)) {
$this->_db->setQuery("INSERT INTO `booksextension` (`name`, `email`, `book`) VALUES ('$name', '$email', '$book');");
return $this->_db->execute();
} else throw new Book_extension_exception('Не все поля были заполнены! Повторите снова.');
// Собственно, отправка
return mail(
$email,
'['.$Messages[$statusAsText]['subject'].'] Качканарская городская библиотека им. Ф. Т. Селянина',
$Messages[$statusAsText]['text'].(!empty($comment)? "<blockquote><p>Комментарий библиотекаря:</p><p><cite>$comment</cite></p></blockquote>": '').(!empty(self::$email_signature)? self::$email_signature: ''),
$headers
);
}

/**
* @desc Одобрить заявку (продлить книгу)
*
* @param <int> $requestID Уникальный номер запроса в базе данных
*
* @return <boolean> Статус одобрения (удалось или нет)
* Обработать заявку
* @param integer $requestID Номер заявки в базе данных
* @param boolean $accepted Статус обработки (продления)
* @return boolean Статус исполнения запроса
*/
public function acceptRequest($requestID) {
$requestID = intval($requestID);
public function processRequest($requestID, $accepted = true) {

if ( empty($requestID) ) return false;
$requestID = intval($requestID);

if (self::$removeOnProcessed) {
$this->_db->setQuery("DELETE FROM `#__{$this->_db_tablename}` WHERE `id` = '$requestID';");
} else {
$this->_db->setQuery("UPDATE `#__{$this->_db_tablename}` SET `processed` = '1', `accepted` = '$accepted' WHERE `id` = '$requestID';");
}

$this->_db->setQuery("UPDATE `booksextension` SET `processed` = '1' WHERE `id` = '$requestID';");
return $this->_db->execute();

}

/**
* @desc Одобрить заявку (продлить книгу)
*
* @param <int> $requestID Уникальный номер запроса в базе данных
*
* @return <boolean> Статус одобрения (удалось или нет)
* Вывести из базы данных одну заявку на продление
* @param integer $requestID Номер заявки в базе данных
* @return array Массив с данными заявки
*/
public function discardRequest($requestID) {
public function getRequest($requestID) {

$requestID = intval($requestID);

if ( empty($requestID) ) return false;
$this->_db->setQuery("SELECT * FROM `#__{$this->_db_tablename}` WHERE `id` = '$requestID' LIMIT 1;");

$this->_db->setQuery("UPDATE `booksextension` SET `processed` = '1' WHERE `id` = '$requestID';");
return $this->_db->execute();
return $this->_db->loadAssoc();
}

/**
* @desc Получить запрос на продление (один) из базы данных
*
* @param <int> $requestID Уникальный номер запроса в базе данных
*
* @return <array/boolean> Поля с данными запроса/false в случае неудачи
* Вывести из базы данных список заявок на продление
* @param integer $limit Ограничение на количество доставаемых из базы данных записей
* @param boolean $withProcessed Если «true» — выводит все заявки, в том числе обработанные
* @return array Массив с данными заявок или false в случае ошибки
*/
public function getRequest($requestID) {
if ( empty($requestID) ) return false;
public function getRequests($limit = 5, $withProcessed = false) {

$this->_db->setQuery("SELECT * FROM `booksextension` WHERE `id` = '$requestID' LIMIT 1;");
$requestInfo = $this->_db->loadAssoc();
$this->_db->setQuery("SELECT * FROM `#__{$this->_db_tablename}` ".(!$withProcessed? "WHERE `processed` = '0'": '').($limit? " LIMIT $limit": '').';');


if ( $requestInfo ) {
return $requestInfo;
} else return false;
return $this->_db->loadAssocList();
}

/**
* @desc Получить запрос на продление (один) из базы данных
*
* @param <int> $limit Ограничение на количество выводимых записей
* @param <boolean> $all Если true, то выводит все, даже обработанные заявки
*
* @return <array/boolean> Поля с данными запроса/false в случае неудачи
* Получить количество всех заявок в базе данных
* @param boolean $withProcessed Если «true» — считать все заявки, в том числе обработанные
* @return integer Количество записей
*/
public function getRequests($limit = 10, $all = false) {
if (! $this-> isEditor ) return false;

$this->_db->setQuery("SELECT * FROM `booksextension` ".(!$all? "WHERE `processed` = '0'": '').($limit? " LIMIT $limit": '').';');

$response = $this->_db->loadAssocList();
//$count = $this->_db->getNumRows();

if ( !empty($response) ) return array('list'=>$response);
}

public function test($value='') {

public function getRequestsCount($withProcessed = false) {
$this->_db->setQuery("SELECT * FROM `#__{$this->_db_tablename}` ".(!$withProcessed? "WHERE `processed` = '0'": ''));
$this->_db->query();
return $this->_db->getNumRows();
}
}


class Book_extension_exception extends Exception { }


function declOfNum($number, $titles) {
$cases = array (2, 0, 1, 1, 1, 2);
return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ];
}

0 comments on commit 462493e

Please sign in to comment.