Менеджер MRU (последних открывавшихся документов)
Практически любое приложение с "дружественным интерфейсом" позволяет запоминать несколько последних документов, открывавшихся пользователем,
и где-то в меню выводит пункты для их быстрого повторного открытия. В "миру" для этого существует акроним MRU -
"Most Recently Used" документы.
PHP модуль mru_manager.php (и class CMRUManager) добавляет эту полезную функцию в WEB приложения.
В настоящее время он умеет:
- Регистрировать событие "открытия документа", сохраняя его в MRU-памяти (реализованной в виде таблицы в БД MySQL)
- Автоматически создавать служебную таблицу MRU, если ее еще нет, при первом вызове метода регистрации операции работы с документом - RegisterEvent()
- Управлять порядком вывода открывавшихся документов, сортируя их по времени последнего доступа, и удаляя (вытесняя) из MRU-данных записи, вышедшие за пределы
установленной "емкости" списка
- Сохранять (если указан) код/логин пользователя, (у каждого пользователя WEB-приложения будет свой список MRU)
- Сохранять списки MRU раздельно для разных "типов документов", так что пользователь может иметь независимые списки последних документов XML, текстовых, и т.д.
- Удалять программно ненужные записи из MRU-данных (например, если некий документ удаляется из системы, MRU-ссылку на него тоже лучше удалить, чтобы не избежать вывода у пользователя ошибок "Указанный файл не найден")
Использование класса
Пример использования
(В данном примере предполагается, что включен механизм сессий, и ИД авторизовавшегося пользователя хранится в $_SESSION['user_id'])
$as_dbparam = array(
'server'=>'localhost
'dbname'=>'test'
'username'=>'',
'password'=>'',
); # параметры используются в as_dbutils.php для установлдения соединения с MySQL БД
require_once('as_dbutils.php'); # class for working with MySQL data, used by mru_manager
require_once('mru_manager.php');
$mru_params = array(
'mrulength' => 8
,'userid' => $_SESSION['user_id']
);
$mru = new CMRUManager($mru_params);
# или простой вариант вызова с тем же результатом : $mru = new CMRUManager($_SESSION['user_id'], 8);
# ...
# Регистрация открытия пользователем документа/файла
$mru->RegisterEvent('My favorite films.txt', 'text-file');
# ... Получение списка MRU, для генерации пунктов меню:
# (Допустим, у нас есть скрипт edit-text-file.php для просмотра/редактирования txt-файлов)
$mruList = $mru->GetMRUList('text-file', 'edit-text-file.php?file={id}');
print_r($mruList);
Здесь мы эмулировали событие открытия пользователем файла 'My favorite films.txt';
понятно, что в реальном приложении вы вставляете этот оператор в скрипт редактирования документа, передавая в качестве $itemid
уникальный номер (ИД) или имя открываемого документа/файла.
Где-то в блоке формирования меню вы должны снова создать объект класса CMRUManager, получить с его помощью список MRU (GetMRUList())
и построить из него HTML-код для подменю "последние открывавшиеся документы", либо в другом месте HTML страницы.
Описание методов класса
CMRUManager([$options]) - в конструктор класса можно передать ассоциативный массив со всеми необходимыми параметрами:
'tablename' => 'MRU_table_name' : по умолчанию для хранения MRU-данных используется таблица mru_data, создаваемая в текущей базе данных.
Здесь можно указать свое имя.
'mrulength' => максимальная длина одного списка MRU (общая для всех типов документов). По умолчанию это 4 записи (запоминается четыре последних документа).
'mrulengths' => $array , ассоциативный массив максимальных длин списков, для каждого указанного типа документов.
Например: мы хотим запоминать в MRU последние 8 тектовых файлов (тип 'text files'), и десять XML файлов ('xml files').
В этом случае следует передать массив : array('text files'=>8, 'xml files'=>10).
'userid' => user_id, уникальный код или логин авторизовавшегося пользователя. Все последующие вызовы методов будут использовать его для идентификации списка MRU.
Вместо передачи массива в конструкторе можно использовать "скалярные" параметры : если в первом параметре передать не массив,
то он будет интерпретироваться как ИД пользователя, а второй параметр - длина (емкость) одного MRU списка.
Т.е. два вызова будут идентичны:
$mru = new CMRUManager(array('userid'=>'test_user', 'mrulength'=>8);
# ИЛИ ТАК :
$mru = new CMRUManager('test_user', 8);
RegisterEvent($itemid, $itemtype='', $userid='') - Регистрация открытия документа пользователем. ИД (имя) документа заносится в таблицу MRU data,
с указанным типом документа.
Здесь же происходит автоматическое вытеснение (удаление) устаревших записей, выходящих за пределы заданной емкости MRU-списка.
GetMRUList($itemtype='', $uri_pattern=false, $userid='') - возвращает текущий список последних открытых документов указанного типа.
Если указан необязательный второй параметр $uri_pattern, то он должен содержать фрагмент "{id}" для замены на реальное значение ИД документа
В таком случае в возвращаемом массиве будет еще один элемент - сгенерированный uri для открытия документа.
Результат - пустой массив или ассоц.массив, где каждая строка содержит данные об одном объекте (документе):
Элемент массива |
Описание |
$result[$row]['itemid'] |
Item id - ИД документа (или имя файла, как оно было передано в RegisterEvent(), например: "My favorite films.txt" |
$result[$row]['itemtype'] |
Тип документа/объекта. Если был передан непустой параметр $itemtype, то очевидно, все строки массива будут иметь здесь одно и то же значение. |
$result[$row]['eventdate'] |
Дата/время последнего доступа к документу. Формат строки зависит от верcии базы MySQL (TIMESTAMP поле в MySQL 3.x имеет вид "20101229102713",
а в 4.x он совпадает с DATETIME полями - "2010-12-29 10:27:13")
|
$result[$row]['uri'] |
Этот элемент создается если был передан параметр $uri_pattern. Строка "{id}" в нем заменяется на "url-encoded" значение $result[$row]['itemid'],
Такая строка может использоваться как HREF-адрес в строках подменю "последние открытые...".
|
ClearMRUData($itemtype=false, $itemid=false, $userid=false) - удаляет данные из MRU. Любой параметр может быть пустым, делая
возможным "групповое" удаление.
Например, чтобы очистить весь MRU-список для текcтовых файлов (у текущего польтзователя), можно вызвать ClearMRUData('txt-files').
ВНИМАНИЕ: Создаваемая автоматически таблица для хранения MRU списков иммет 80-символьное поле под item id - CHAR(80).
Если в вашей системе предполагается работа с документами, имеющими имена длиннее 80 символов, не забудьте вручную модифицировать
структуру таблицы ("mru_data" по умолчанию).
Также имеет смысл проверить длины других полей ( userid и itemtype имеют тип CHAR(20) ).
Распространяется по лицензии: BSD License
История версий
История изменений
1.00.001 (30.12.2010)