Менеджер MRU (последних открывавшихся документов)

Практически любое приложение с "дружественным интерфейсом" позволяет запоминать несколько последних документов, открывавшихся пользователем, и где-то в меню выводит пункты для их быстрого повторного открытия. В "миру" для этого существует акроним MRU - "Most Recently Used" документы.
PHP модуль mru_manager.php (и class CMRUManager) добавляет эту полезную функцию в WEB приложения. В настоящее время он умеет:

Использование класса

Пример использования
(В данном примере предполагается, что включен механизм сессий, и ИД авторизовавшегося пользователя хранится в $_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)


Copyright © Alexander Selifonov, www.selifan.ru