<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://docs.deansoffice.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kuznetsova</id>
		<title>DOF - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://docs.deansoffice.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kuznetsova"/>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Kuznetsova"/>
		<updated>2026-04-12T22:13:33Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.2</generator>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC&amp;diff=3209</id>
		<title>Разработка:Управление доступом</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC&amp;diff=3209"/>
				<updated>2024-04-25T10:29:27Z</updated>
		
		<summary type="html">&lt;p&gt;Kuznetsova: /* Правила работы с правами доступа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Управление доступом =&lt;br /&gt;
На этой странице содержится вся основная информация по управлению доступом. &amp;quot;Электронный Деканат&amp;quot; имеет собственную систему полномочий, которая дополняет систему полномочий moodle, и позволяет реализовать более гибкое управление правами.&lt;br /&gt;
&lt;br /&gt;
== Общая информация ==&lt;br /&gt;
&lt;br /&gt;
=== Плагины необходимые для системы управления доступом ===&lt;br /&gt;
&lt;br /&gt;
* [[Разработка:storages/acl | acl ]] - список полномочий. Хранит информацию о том в каком плагине какие полномочия существуют.&lt;br /&gt;
* [[Разработка:storages/aclwarrants | aclwarrants ]] - Мандаты и доверенности. &lt;br /&gt;
* [[Разработка:storages/aclwarrantagents | aclwarrantagents ]] - Применение доверенностей. Определяет, каким пользователям какие доверенности выданы.&lt;br /&gt;
&lt;br /&gt;
=== Общие правила и требования ===&lt;br /&gt;
* Сторонние плагины могут зависеть от плагинов прав доступа, а плагины прав доступа не могут зависеть от остальных плагинов, и извлекать информацию из них (за исключением события установки/обновления плагина).&lt;br /&gt;
* Каждый плагин, предоставляющий права доступа должен описывать права в функции acldefault()&lt;br /&gt;
** Формат массива: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
array(&lt;br /&gt;
    'view' =&amp;gt; array('teacher', 'manager'),&lt;br /&gt;
    'edit' =&amp;gt; array('manager')&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В качестве ключей указывается то право, которое назначается, а значением служит массив ролей, которые получают это право. Список стандартных ролей можно посмотреть в плагине [[Разработка:storages/aclwarrants | aclwarrants ]]&lt;br /&gt;
* Все плагины, отвечающие за работу с полномочиями имеют префикс acl.&lt;br /&gt;
* Все функции в сторонних плагинах, которые управляют правами доступа должны иметь префикс acl&lt;br /&gt;
* В плагинах типа im и modlib следует для проверки стандартных прав доступа обращаться к плагинам storage.&lt;br /&gt;
* При построении прав на смену статуса объектов деканата имеет значение лишь то, в какой статус будет осуществлен перевод. Следовательно, необходимо реализовывать только права changestatus:to:СТАТУС. &lt;br /&gt;
** Право changestatus:from:СТАТУС следует устанавливать только для ограничения возможности вывода из спецстатусов. &lt;br /&gt;
** Право changestatus без модификаторов, дает право перевода из любого статуса в любой, кроме специальных (для которых объявлено право changestatus:from:Статус). Право changestatus:to:Статус дает право на перевод в целевой статус из любого другого, кроме специальных, для которых объявлено право changestatus:from:Статус.&lt;br /&gt;
&lt;br /&gt;
=== Как происходит процесс установки прав ===&lt;br /&gt;
При установке, обновлении или удалении любого плагина, если он предоставляет права доступа - то в функциях upgrade(), delete(), и install() нужно вызывать функцию save_roles() плагина [[Разработка:storages/acl | acl ]].&lt;br /&gt;
&lt;br /&gt;
== Правила работы с правами доступа ==&lt;br /&gt;
&lt;br /&gt;
=== Полномочия (acl) ===&lt;br /&gt;
* Полномочия не имеют статусов, поэтому при удалении плагина все полномочия, принадлежащие ему также физически удаляются из таблицы&lt;br /&gt;
* Для хранилищ и рабочих процессов существуют [[ Разработка:storages/acl#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D1.8B.D0.B5_.D0.BF.D0.BE.D0.BB.D0.BD.D0.BE.D0.BC.D0.BE.D1.87.D0.B8.D1.8F_.D0.B4.D0.BB.D1.8F_.D1.85.D1.80.D0.B0.D0.BD.D0.B8.D0.BB.D0.B8.D1.89_.D0.B8_.D1.80.D0.B0.D0.B1.D0.BE.D1.87.D0.B8.D1.85_.D0.BF.D1.80.D0.BE.D1.86.D0.B5.D1.81.D1.81.D0.BE.D0.B2 | стандартные полномочия ]]&lt;br /&gt;
* Полномочия проверяются только тем плагином, в котором они содержатся. То есть - из im/persons можно проверять только права im/persons, из storage/persons только права storage/persons. Нельзя проверять из одного плагина права другого плагина.&lt;br /&gt;
&lt;br /&gt;
=== Мандаты и доверенности (warrants) ===&lt;br /&gt;
* Действия при удалении мандата или доверенности&lt;br /&gt;
** Основным способом удаления мандата следует считать перевод записи в статус &amp;quot;archive&amp;quot;&lt;br /&gt;
** Все дочерние доверенности и мандаты также перестают действовать&lt;br /&gt;
** Прекращают действия все применения полномочий ([[Разработка:storages/aclwarrantagents | aclwarrantagents ]]) которые были назначены указанным мандатом.&lt;br /&gt;
* При установке прав новым плагином все новые права добавляются к стандартным доверенностям&lt;br /&gt;
* Плагины не могут добавлять свои доверенности при установке&lt;br /&gt;
* Стандартные доверенности не могут быть назначены пользователям&lt;br /&gt;
* Если запрещается наследование для доверенности, которую раньше можно было наследовать - то старые дочерние доверенности продолжают свое действие, но новые создать нельзя&lt;br /&gt;
&lt;br /&gt;
==== Синхронизация ====&lt;br /&gt;
Здесь описаны плагины, которые должны синхронизироваться с таблицей доверенностей. &lt;br /&gt;
* [[Разработка:storages/positions | storage/positions]]&lt;br /&gt;
&lt;br /&gt;
=== Применение полномочий (warrantagents) ===&lt;br /&gt;
* При прекращении действия доверенности, применение полномочия прекращает действовать (переводится в статус archive)&lt;br /&gt;
* При истечении срока действия применение полномочия переводится в статус archive&lt;br /&gt;
&lt;br /&gt;
==== Синхронизация ====&lt;br /&gt;
Здесь описаны плагины, которые должны синхронизироваться с таблицей применения полномочий. &lt;br /&gt;
* [[Разработка:storages/appointments | storages/appointments ]]&lt;br /&gt;
&lt;br /&gt;
=== Опасные действия и режим работы в обход стандартной логики (datamanager) ===&lt;br /&gt;
&lt;br /&gt;
Режим datamanager позволяет админам действовать в обход стандартной логики на свой страх и риск. Такие действия могут понадобиться, например, в случае выполнения ошибочных действий сотрудниками, однако не должны быть доступны обычным пользователям во избежание потери данных или консистентности данных. Чтобы для выполнения этих действий не требовалась модификация напрямую через СУБД, реализован опасный режим.&lt;br /&gt;
&lt;br /&gt;
Для перехода в опасный режим персона должна иметь соответствующее право и подтвердить свое согласие с переходом в опасный режим через интерфейс системы.&lt;br /&gt;
&lt;br /&gt;
Проверка опасного режима должна осуществляться через реализованный метод is_datamanager(), который проверит и право и согласие. Проверка режима через инструменты прав доступа в настоящий момент является устаревшей и должна быть заменена на использование выше указанного метода.&lt;br /&gt;
&lt;br /&gt;
==== Принципы реализации проверок для режима datamanager ====&lt;br /&gt;
&lt;br /&gt;
* В обычном режиме пользователю должны быть заблокированы любые изменения, которые могут привести к неочевидному (или не очень очевидному) безвозвратному  уничтожению или порче данных.&lt;br /&gt;
Также могут быть заблокированы изменения, которые способны нарушить консистентность и корректность данных.&lt;br /&gt;
* По возможности необходимо реализовать более полные и глубокие проверки, например, запрещать не любое изменение даты, а только опасное, вызывающее противоречие и могущее повлечь порчу данных (например, дата старта обучения должна быть не позже даты первого результата обучения, оценки, подписки на элемент учебного плана и т.п.). При недостатке ресурсов предпочитаем полное блокирование изменения поля и полагаемся на режим datamanager, где пользователь может выполнить изменения полностью на свой страх и риск, самостоятельно проверив непротиворечивость данных.&lt;br /&gt;
* Режим datamanager разрешает любое редактирование. Опасные ситуации, которые могут привести к порче данных, должны быть доступны только в этом режиме и описаны.&lt;br /&gt;
* datamanage - это право, предназначенное только для игнорирования некоторых (добавленных с целью сохранения консистентности) валидаций данных, она не добавляет и не убирает никаких прав, если их нет, для выполнения опасного действия помимо собственно нужно иметь право для исполнения этого действия и подтвержденное согласие работы в опасном режиме&lt;br /&gt;
&lt;br /&gt;
При принятии технических решений полная блокировка потенциально опасного действия предпочтительна непредсказуемому каскадному обновлению данных после этого действия. Например, если изменение даты начала подписки на программу может привести к пересчету истории обучения и ее порче, предпочитаем заблокировать такое изменение (пока пользователь руками не поправит все объекты, вступающие в противоречие с изменением), а не выполнять в фоне опасное каскадное действие.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Управление доступом]]&lt;/div&gt;</summary>
		<author><name>Kuznetsova</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/orders&amp;diff=3208</id>
		<title>Разработка:storages/orders</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/orders&amp;diff=3208"/>
				<updated>2022-03-28T10:10:25Z</updated>
		
		<summary type="html">&lt;p&gt;Kuznetsova: исправление орфографической ошибки в тексте&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = orders&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Принцип работы =&lt;br /&gt;
Приказы - единоличные, законченные, единовременные распоряжения пользователей системы, на выполнение значимых действий с данными в системе.  Реализуют протоколирование и исполнение как обычных приказов (приказ о зачислении, приказ о переводе), так и подразумеваемые приказы (выставление оценки, изменение статуса объекты).&lt;br /&gt;
Не обязательно все действия в системе должны выполняться через приказы, однако нужно стремится реализовать как приказы все действия, которые необходимо протоколировать и для работы с которыми в будущем предполагается использовать индивидуальную цифровую подпись. При последующей реализации индивидуальной цифровой подписи, ею можно будет заверять только действия, оформленные в качестве приказов. Сейчас при обработки приказов вычисляются контрольные суммы данных (сигнатуры sha1), для затруднения несанкционированного изменения данных (требуется ключ, сохраненный в конфигурационном файле).&lt;br /&gt;
&lt;br /&gt;
С программной точки зрения работа с приказами построена следующим образом:&lt;br /&gt;
* Плагин, &amp;quot;желающий&amp;quot; реализовать собственный приказ наследует родительский класс приказа (dof_storage_orders_baseorder), объявленный в справочнике &amp;quot;приказ&amp;quot;. Базовый класс содержит методы для наполнения приказа данными, исполнения приказа, получение из БД данных о ранее исполненном приказе. В дочернем классе эти методы переопределяются, в соответствии с логикой работы данного приказа.&lt;br /&gt;
* Для унификации, плагин, использующий приказы, должен реализовать метод order($code,$id=null), который возвращает объект нового или существующего приказа.&lt;br /&gt;
* При сохранении приказа, данные сохраняются в справочник orders в сериализованном виде, или в другие справочники (для этого можно использовать методы load_data() и save_data() либо в классе приказа переопределяются методы load() и save(), которые сохраняют/читают часть данных в других справочниках и убирают/добавляют их в поле data). При сохранении указывается ответственный сотрудник (подготовивший приказ) и отдел, к которому приказ относится.&lt;br /&gt;
* До исполнения приказа его необходимо подписать с помощью метода sign(), при этом формируется хешь от всех данных приказа (включая отсутствующие в sdata) и записывается в поле signature. Подпись приказа рассчитывается с учетом id подписанта. Если данные из других справочников будут возвращены в другой последовательности, либо данные будут измененыв в других справочниках в обход приказа, цифровая подпись станет недействительной.&lt;br /&gt;
* Подписанный приказ можно один раз исполнить методом execute(). При этом выполняются все действия, сопутствующие исполнению приказа. При необходимости, часть данных из sdata в другие справочники может переноситься именно на этом этапе, тогда переопределенная функция load() должна уметь их получить. Исполненный приказ помечается как исполненный. Это конечное состояние, удалить исполненный приказ нельзя, его действие можно отменить только другим, противоположным по эффекту приказом (если такой предусмотрен). Повторно исполнить приказ нельзя.&lt;br /&gt;
* Справочник &amp;quot;приказы&amp;quot; содержит метод, для получения записанного в БД приказа, при этом на основании информации из БД инициализируется соотествующий объект, который загружает собственные данные любым способом. Для этого используются методы order() в плагинах, реализовавших соответствующие типы приказов.&lt;br /&gt;
&lt;br /&gt;
Данные приказа представляют собой сложно-структурированный объект (тип object), элементами которого могут быть скалярные значение, другие объекты и массивы. После исполнения приказа эти данные могут протоколироваться как в сериализованном виде, так и в реляционном, в виде составных частей записей в БД. Следует стремится к тому, чтобы формат этого объекта соответствовал формату входных данных для шаблона, отображающего приказ в виде документа ODF и в других форматах. Для этого формат объекта планируется совместимым с шаблонизатором [[Разработка:modlibs/templater]], с тем, чтобы приказы можно было распечатывать без дополнительной обработки.&lt;br /&gt;
&lt;br /&gt;
=Таблица в базе данных=&lt;br /&gt;
''orders'' - список зарегистрированных и исполненных приказов, с информацией о плагине, реализующем объект приказа, исполнителе, дате исполнения.&lt;br /&gt;
&lt;br /&gt;
===Подробный формат полей в таблице:===&lt;br /&gt;
* plugintype - тип плагина, в котором реализован приказ&lt;br /&gt;
* plugincode - код плагина, в котором реализован приказ&lt;br /&gt;
* pluginversion - версия плагина, в котором реализован приказ&lt;br /&gt;
* code - код типа приказа (уникален внутри одного плагина)&lt;br /&gt;
* departmentid - id отдела в таблице [[Разработка:storages/departments | departments ]], внутри которого издан приказ&lt;br /&gt;
* ownerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подготовившей приказ&lt;br /&gt;
* signerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подписавшей приказ&lt;br /&gt;
* date - дата приказа (которой он пройдет по документам)&lt;br /&gt;
* signdate - дата подписания приказа в системе&lt;br /&gt;
* exdate - дата исполнения приказа в системе&lt;br /&gt;
* crondate - дата исполнения приказа по крону&lt;br /&gt;
* changedate - дата последнего изменения приказа&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/orders | orders ]]&lt;br /&gt;
* sdata - сериализованные данные приказа. Вынесены в отдельный справочник для хранения [[Разработка:storages/orderdata | даных приказа ]]&lt;br /&gt;
* signature - сигнатура приказа (sha от signerid, ключевого слова из конфига,signdate,date и сериализованной data)&lt;br /&gt;
* notes - заметки&lt;br /&gt;
&lt;br /&gt;
=Дополнительные методы:=&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_code($plugintype,$plogincode,$code,$departmentid=null,$ownerid=null,$signerid=null,$status=null,$limitfrom=&amp;quot;&amp;quot;,$limitnum=&amp;quot;&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Выдает список приказов по параметрам&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (str) $plugintype - тип плагина, в котором реализован приказ&lt;br /&gt;
* (str) $plogincode - код плагина, в котором реализован приказ&lt;br /&gt;
* (str) $code - код типа приказа (уникален внутри одного плагина)&lt;br /&gt;
* (int) $departmentid - id отдела в таблице departments , внутри которого издан приказ, по умолчанию null&lt;br /&gt;
* (int) $ownerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подготовившей приказ, по умолчанию null&lt;br /&gt;
* (int) $signerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подписавшей приказ, по умолчанию null&lt;br /&gt;
* (str) $status - статус приказа, по умолчанию null&lt;br /&gt;
* (int) $limitfrom - id, начиная с которого надо искать, по умолчанию пусто&lt;br /&gt;
* (int) $limitnum максимальное количество записей, которое надо вернуть, по умолчанию пусто&lt;br /&gt;
''Возвращает значение:''&lt;br /&gt;
* (mixed) массив объектов если что-то нашлось или false&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
=== dof_storage_orders_baseorder ===&lt;br /&gt;
Класс является базовым классом для типов приказов, объявляемых в плагинах. Дочерние классы должны именоваться по шаблону dof_типплагина_кодплагина_order_кодприказа и располагаться в папке orders/кодприказа/init.php внутри объявляющего их плагина.&lt;br /&gt;
* plugintype(),plugincode(),code() - получить идентификационную информацию о типе документа (должны быть объявлены в дочерних классах и возвращать строки).&lt;br /&gt;
* baseptype(), basepcode() - идентификация плагина storages/orders, если объекту понадобиться обратиться к справочнику orders.&lt;br /&gt;
* get_id() - получить id текущего объекта&lt;br /&gt;
* set_id() - установить id. Не может вызываться напрямую, только через методы save() и load()&lt;br /&gt;
* load($id,$withoutdata=false) - проверить наличие объекта совместимого типа в БД и сопоставиться с ним. Если требуется - собрать и вернуть данные объекта. Возвращается объект из справочника orders, с убранными полями sdata, plugintype, plugincode, code и добавленным полем data, куда помещены десериализованные данные из sdata, если они были запрошены.  Если данные необходимо сохранять в других справочниках, в дочернем классе переопределяется метод load_date() либо сам метод load(), а родительский метод вызывается через parent::. При загрузке к объекту в поле $order-&amp;gt;data добавляются копии служебных полей, с префиксом из символа подчеркивания, чтобы эти данные сразу можно было использовать в шаблонах.&lt;br /&gt;
* save(object $data) - сохранить данные приказа в БД. Перед сохранением убираются поля, которые нельзя изменять напрямую (plugintype, plugincode, code, exdate, changedate, status, sdata, signerid, signature, signdate, data). Данные из data сериализуются в sdata. Если часть данных после сохранения или исполнения хранится в других справочниках, можно переопределить метод save_data(), либо сам метод save() должен быть переопределен, а родительский вызывать через parent::. При этом, для корректности цифровой подписи необходимо обеспечить получение полей в той же последовательности, в которой они были сохранены. Кроме того, при сохранении удаляются копии служебных полей из поля $order-&amp;gt;data, чтобы избежать дублирования при сохранении.&lt;br /&gt;
* execute() - исполнить текущий приказ и пометить его как исполненный, если он был корректно подписан. Как правило переопределять не требуется, так как все сопутсвующие действия можно поместить в execute_actions(). &lt;br /&gt;
* execute_actions() - исполнить действия, сопутствующие выполнению приказа (вызывается после проверки подписи в execute()).  Если данные переписываются в другие справочники, они должны быть записаны так, чтобы функция load() прочитала все поля в точности в той же последовательности, как они были в сериализованном виде, иначе подпись не сойдется.&lt;br /&gt;
* notes() - сохранить заметки о приказе (не считается изменением приказа и не влияет на подпись)&lt;br /&gt;
* sign() - подписать объект по id&lt;br /&gt;
* is_signed() - проверить подпись по id&lt;br /&gt;
* make_sign() - сфоормировать строку подпись по объекту, возвращенному load(), при этом подпись зависит от порядка полей и чувствительна к любым изменениям данных. Несущественные и часто-меняющиеся данные необходимо выносить за пределы приказа и подгружать уже непосредственно перед их использованием.&lt;br /&gt;
* check_signature() - проверить корректность подписи по объекту, возвращенному load()&lt;br /&gt;
&lt;br /&gt;
=== Пример объявления нового приказа ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Инициализируем работу с приказами&lt;br /&gt;
 $DOF-&amp;gt;storage('orders');&lt;br /&gt;
 // Объявляем класс&lt;br /&gt;
 class dof_im_exampleim_order_delete extends  dof_storage_orders_baseorder&lt;br /&gt;
 {&lt;br /&gt;
    /**&lt;br /&gt;
     * Тип плагина, объявившего тип приказа&lt;br /&gt;
     */&lt;br /&gt;
    public function plugintype()&lt;br /&gt;
    {&lt;br /&gt;
        return 'im';&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Код плагина, объявившего тип приказа&lt;br /&gt;
     */&lt;br /&gt;
    public  function plugincode()&lt;br /&gt;
    {&lt;br /&gt;
        return 'exampleim';&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Код типа приказа&lt;br /&gt;
     */&lt;br /&gt;
    public  function code()&lt;br /&gt;
    {&lt;br /&gt;
        return 'delete';&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Исполнить действия, сопутствующие исполнению приказа &lt;br /&gt;
     *&lt;br /&gt;
     * @param object $order&lt;br /&gt;
     * @return bool&lt;br /&gt;
     */&lt;br /&gt;
    protected function execute_actions($order)&lt;br /&gt;
    {&lt;br /&gt;
        // Удаляем объект, который потребовали удалить в приказе&lt;br /&gt;
        return $this-&amp;gt;dof-&amp;gt;storage('examplest')-&amp;gt;delete($order-&amp;gt;data-&amp;gt;id);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример использования ===&lt;br /&gt;
В базовый класс плагина добавляется метод&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Возвращает объект приказа&lt;br /&gt;
     *&lt;br /&gt;
     * @param string $code&lt;br /&gt;
     * @param integer  $id&lt;br /&gt;
     * @return dof_storage_orders_baseorder&lt;br /&gt;
     */&lt;br /&gt;
    public function order($code,$id=NULL)&lt;br /&gt;
    {&lt;br /&gt;
        switch ($code)&lt;br /&gt;
        {&lt;br /&gt;
            case 'delete':&lt;br /&gt;
                // Хорошей мыслью будет сделать сдесь кеширование&lt;br /&gt;
                $order = new dof_im_exampleim_order_delete($this-&amp;gt;dof);&lt;br /&gt;
                if (!is_null($id))&lt;br /&gt;
                {&lt;br /&gt;
                    if (!$order-&amp;gt;load($id))&lt;br /&gt;
                    {&lt;br /&gt;
                        // Не найден&lt;br /&gt;
                        return false;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                // Возвращаем объект&lt;br /&gt;
                return $order;&lt;br /&gt;
            break;&lt;br /&gt;
            default:&lt;br /&gt;
                // Ошибка&lt;br /&gt;
                return false;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
        // Создаем экземпляр приказа напрямую&lt;br /&gt;
        // $order = new dof_im_exampleim_order_delete($DOF);&lt;br /&gt;
        // Или через плагин&lt;br /&gt;
        $order = $DOF-&amp;gt;im('exampleim')-&amp;gt;order('delete');&lt;br /&gt;
        // Вводим данные (id, отдел, ответственный, время в приказе)&lt;br /&gt;
        $orderobj = new object();&lt;br /&gt;
        $orderobj-&amp;gt;departmentid = 1;&lt;br /&gt;
        $orderobj-&amp;gt;ownerid = 2;&lt;br /&gt;
        $orderobj-&amp;gt;date = time();&lt;br /&gt;
        $orderobj-&amp;gt;data-&amp;gt;id = $id;&lt;br /&gt;
        // Сохраняем приказ в БД и привязываем экземпляр приказа к id&lt;br /&gt;
        $order-&amp;gt;save($orderobj);&lt;br /&gt;
        // Подписываем от имени персоны 2&lt;br /&gt;
        $order-&amp;gt;sign(3)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=События=&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |orders&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу orders.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |orders&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице orders.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |orders&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы orders.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица заданий, которые выполняет этот плагин&lt;br /&gt;
 ! Код задания&lt;br /&gt;
 ! Дополнительный параметр&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |orders_on_orderdata&lt;br /&gt;
 |Необязателен&lt;br /&gt;
 |Находит все приказы, в которых хранятся данные в виде сериализованного объекта, после чего записывает эти данные в таблицу [[Разработка:storages/orderdata | orderdata ]] в виде скалярных значений.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Плагины обработки todo | storages/orders]]&lt;/div&gt;</summary>
		<author><name>Kuznetsova</name></author>	</entry>

	</feed>