Создание get_module

Содержание

Создание get_module

Это специальная функция для всех динамически загружаемых модулей. Посмотрим сначала на создание через макрос ZEND_GET_MODULE :

Реализация функции окружена оператором условной компиляции. Это необходимо, поскольку функция get_module() требуется только тогда, когда ваш модуль построен как динамическое расширение. Специфицируя определение COMPILE_DL_FIRSTMOD в команде компилятору (см. ранее обсуждение инструкций компилятора, необходимых для построения динамического расширения), вы можете инструктировать ваш модуль, намереваетесь вы построить его как динамическое расширение или как встроенный модуль. Если вам нужен встроенный модуль, реализация get_module() просто будет не нужна.

get_module() вызывается Zend во время загрузки модуля. Вы можете представлять её как вызываемую с помощью вызова dl() в вашем скрипте. Её назначение в том, чтобы передать блок информации модуля обратно Zend, чтобы информировать машину о содержимом модуля.

Если вы не реализуете функцию get_module() в вашем динамически загружаемом модуле, Zend выдаст вам сообщение об ошибке при попытке доступа к ней.

Использование модуля Active Directory for PowerShell для администрирования домена

Модуль Active Directory для Windows PowerShell сегодня является одним из основных средств администрирования домена, управления объектами в Active Directory, получения различной информации о компьютерах, пользователях, группах. Любой системный администратор Windows должен уметь пользоваться не только графическими оснастками AD (чаще всего это ADUC – Active Directory Users & Computer), но и командлетами этого модуля PowerShell для выполнения повседневных задач администрирования Active Directory. В этой статье мы рассмотрим, как установить модуль RSAT-AD-PowerShell, его базовый функционал и популярные командлеты, которые должны быть полезными при управлении и работе с AD.

Установка модуля Active Directory для PowerShell в Windows Server

Модуль Active Directory для Windows PowerShell уже встроен в операционные системы Windows Server (начиная с Windows Server 2008 R2), но по умолчанию не активирован.

В Windows Server 2020 вы можете включить модуль AD для PoSh в Windows Server 2020 из панели управления Server Manager (Add Roles and Features -> Features -> Remote Server Administration tools -> Role Administration Tools -> AD DS and AD LDS Tools -> Active Directory module for Windows PowerShell).

Также вы можете установить модуль из командной строки с помощью PowerShell команды:

Install-WindowsFeature -Name «RSAT-AD-PowerShell» –IncludeAllSubFeature

Вы можете установить модуль RSAT-AD-PowerShell не только на контроллере домена. Подойдет любой рядовой сервер или даже рабочая станция. На контроллерах домена AD модуль устанавливается автоматически при развертывании роли ADDS (при повышении сервера до DC).

Взаимодействие модуля с AD выполняется через служба Active Directory Web Services, которая должна быть установлена на котроллере домена (взаимодействие по порту TCP 9389).

Установка модуля RSAT-AD-PowerShell в Windows 10

Вы можете установить модуль RSAT-AD-PowerShell не только на серверах, но и на рабочих станциях. Этот модуль входит в состав пакета RSAT (Remote Server Administration Tools), который можно скачать и установить вручную в Window 7, Windows 8.1. После установки RSAT модуль AD дл PowerShell ставится из панели управления (Control Panel -> Programs and Features -> Turn Windows features on or off -> Remote Server Administration Tools-> Role Administration Tools -> AD DS and AD LDS Tools).

В Windows 10 1809 и выше пакет RSAT уже встроен в дистрибутив (как Features on Demand), поэтому для установки модуля можно воспользоваться командой:

Add-WindowsCapability –online –Name “Rsat.ActiveDirectory.DS-LDS.Tools

Командлеты модуля AD для PowerShell

В модуле Active Directory для Windows PowerShell имеется большое командлетов для взаимодействия с AD. В каждой новой версии RSAT их количество увеличивается (в Windows Server 2020 доступно 147 командлетов для AD).

Перед использованием командлетов модуля, его нужно импортировать в сессию PowerShell (в Windows Server 2012 R2/ Windows 8.1 модуль импортируется автоматически):

$rs = New-PSSession -ComputerName DC_or_Comp_with_ADPosh
Import-Module -PSsession $rs -Name ActiveDirectory

Вы можете вывести полный список доступных командлетов с помощью команды:

Get-Command –module activedirectory

Общее количество команд в модуле:

Get-Command –module activedirectory |measure-object

Большинство командлетов модуля RSAT-AD-PowerShell начинаются с префикса Get-, Set-или New-.

  • Командлеты класса Get- используются для получения различной информации из AD (Get-ADUser — свойства пользователей, Get-ADComputer – параметры компьютеров, Get-ADGroupMember — состав групп и т.д.). Для их выполнения не нужно быть администратором домена, любой пользователь домена может выполнять скрипты PowerShell для получения значений большинства атрибутов объектов AD (кроме защищенных, как в примере с LAPS).
  • Командлеты класса Set- служат для изменения параметров объектов в AD, например, вы можете изменить свойства пользователя (Set-ADUser), компьютера (Set-ADComputer), добавить пользователя в группу и т.д. Для выполнения этих операций у вашей учетной записи должны быть права на объекты, которые вы хотите изменить (см. статью Делегирование прав администратора в AD).
  • Команды, начинающиеся с New- позволяют создать объекты AD (создать пользователя — New-ADUser, группу — New-ADGroup).
  • Командлеты Remove- служат для удаления объектов AD.

Получить справку о любом командлете можно так:

Примеры использования командлетов Active Directory можно вывести так:

В PowerShell ISE при наборе параметров командлетов модуля удобно использовать всплывающие подсказки.

Использование модуля RSAT-AD-PowerShell для администрирования AD

Рассмотрим несколько типовых задач администратора, которые можно выполнить с помощью команд модуля AD для PowerShell.

New-ADUser: Создание пользователя в AD

Для создания нового пользователя в AD можно использовать командлет New-ADUser. Создать пользователя можно командой:

New-ADUser -Name «Andrey Petrov» -GivenName «Andrey» -Surname «Petrov» -SamAccountName «apetrov» -UserPrincipalName «apetrov@winitpro.ru » -Path «OU=Users,OU=Ufa,DC=winitpro,DC=loc» -AccountPassword(Read-Host -AsSecureString «Input Password») -Enabled $true

Более подробно о команде New-ADUser (в том числе пример массового создания учетных записей в домене) читайте в статье .

Get-ADComputer: Получить информацию о компьютерах домена

Чтобы вывести информацию о компьютерах в определённом OU (имя компьютера и дата последней регистрации в сети) используйте командлет Get-ADComputer:

Get-ADComputer -SearchBase ‘OU=Russia,DC=winitpro,DC=ru’ -Filter * -Properties * | FT Name, LastLogonDate -Autosize

Add-AdGroupMember: Добавить пользователя в группу AD

Чтобы добавить пользователей в существующую группу безопасности в домене AD, выполните команду:

Add-AdGroupMember -Identity MskSales -Members apterov, divanov

Вывести список пользователей в группе AD и выгрузить его в файл:

Get-ADGroupMember MskSales -recursive| ft samaccountname| Out-File c:\script\export_users.csv

Set-ADAccountPassword: Сброс пароля пользователя в AD

Set-ADAccountPassword apterov -Reset -NewPassword (ConvertTo-SecureString -AsPlainText “P@ssw0rd1” -Force -Verbose) –PassThru

Блокировка/разблокировка пользователя

Отключить учетную запись:

Включить учетную запись:

Разблокировать аккаунт после блокировки парольной политикой:

Search-ADAccount: Поиск неактивных компьютеров в домене

Чтобы найти и заблокировать в домене все компьютеры, которые не регистрировались в сети более 100 дней, воспользуйтесь командлетом Search-ADAccount:

$timespan = New-Timespan –Days 100
Search-ADAccount -AccountInactive -ComputersOnly –TimeSpan $timespan | Disable-ADAccount

New-ADOrganizationalUnit: Создать структуру OU в AD

Чтобы быстро создать типовую структуры Organizational Unit в AD, можно воспользоваться скриптом PowerShell. Допустим, нам нужно создать несколько OU с городами, в которых создать типовые контейнеры. Вручную через графическую консоль ADUC такую структуру создавать довольно долго, а модуль AD для PowerShell позволяет решить такую задачу за несколько секунд (не считая время на написание скрипта):

$fqdn = Get-ADDomain
$fulldomain = $fqdn.DNSRoot
$domain = $fulldomain.split(«.»)
$Dom = $domain[0]
$Ext = $domain[1]
$Sites = («SPB»,»MSK»,»Sochi»)
$Services = («Users»,»Admins»,»Computers»,»Servers»,»Contacts»)
$FirstOU =»Russia»
New-ADOrganizationalUnit -Name $FirstOU -Description $FirstOU -Path «DC=$Dom,DC=$EXT» -ProtectedFromAccidentalDeletion $false
foreach ($S in $Sites)
<
New-ADOrganizationalUnit -Name $S -Description «$S» -Path «OU=$FirstOU,DC=$Dom,DC=$EXT» -ProtectedFromAccidentalDeletion $false
foreach ($Serv in $Services)
<
New-ADOrganizationalUnit -Name $Serv -Description «$S $Serv» -Path «OU=$S,OU=$FirstOU,DC=$Dom,DC=$EXT» -ProtectedFromAccidentalDeletion $false
>
>
После выполнения скрипта у нас в AD появилась такая структура OU.

Для переноса объектов между контейнерами AD можно использовать командлет Move-ADObject:

$TargetOU = «OU=Buhgalteriya,OU=Computers,DC=corp,DC=winitpro,DC=ru»
Get-ADComputer -Filter ‘Name -like «BuhPC*»‘ | Move-ADObject -TargetPath $TargetOU

Get-ADReplicationFailure: Проверка репликации в AD

С помощью командлета Get-ADReplicationFailure можно проверить состояние репликации между контроллерами домена AD:

Get-ADReplicationFailure -Target DC01,DC02

Получить информацию обо всех DC в домене с помощью командлета Get-AdDomainController:

Get-ADDomainController –filter * | select hostname,IPv4Address,IsGlobalCatalog,IsReadOnly,OperatingSystem | format-table –auto

Итак, в этой статье мы рассмотрели базовые возможности и особенности использования модуля AD для PowerShell для администрирования AD. Надеюсь, эта статья подтолкнет вас к дальнейшему исследованию возможностей этого модуля и автоматизации большинства задач управления AD.

Атомная энергетика. Ядерные реакторы АЭС. Атомный флот. Ядерное оружие

Высшая математика

Это специальная функция для всех динамически загружаемых модулей. Посмотрим сначала на создание через макрос ZEND_GET_MODULE :

Реализация функции окружена оператором условной компиляции. Это необходимо, поскольку функция get_module() требуется только тогда, когда ваш модуль построен как динамическое расширение. Специфицируя определение COMPILE_DL_FIRSTMOD в команде компилятору (см. ранее обсуждение инструкций компилятора, необходимых для построения динамического расширения), вы можете инструктировать ваш модуль, намереваетесь вы построить его как динамическое расширение или как встроенный модуль. Если вам нужен встроенный модуль, реализация get_module() просто будет не нужна.

get_module() вызывается Zend во время загрузки модуля. Вы можете представлять её как вызываемую с помощью вызова dl() в вашем скрипте. Её назначение в том, чтобы передать блок информации модуля обратно Zend, чтобы информировать машину о содержимом модуля.

Если вы не реализуете функцию get_module() в вашем динамически загружаемом модуле, Zend выдаст вам сообщение об ошибке при попытке доступа к ней.

Создание модулей обработчиков

Содержание

Общая информация

Для выполнения всех операций с услугами в BILLmanager архитектурой предусмотрено использование специализированных модулей обработки. В стандартной поставке предусмотрены как модули отвечающие за выполнение операций над определенными типами услуг в конкретных панелях управления, так и специализированные и вспомогательные модули, способные обрабатывать любые типы услуг. К таким обработчикам относятся модуль ручной обработки услуги и модуль перепродажи услуг из BILLmanager в BILLmanager. В данной статье рассматривается вариант написания собственного модуля обработки либо для собственного типа услуг либо для встроенного типа услуг

Все функции в статье вызываются согласно стандартными механизмам работы с API

Вызов всех функций необходимо осуществлять с возвратом результата в XML или JSON — по желанию разработчика. В случае использования JSON формата ответов от BILLmanager результат будет иметь туже структуру, что и описанная в статье, с поправкой на формат

Назначение модулей обработчиков

Основной функций модуля обработки является выполнение каких либо операций с услугами на стороне панели управления либо провайдера данных услуг. Так же дополнительно модуль может выполнять проверки при изменении параметров услуг, сообщать BILLmanager доступные на стороне панели управления или провайдера конфигурации услуг, а так же изменять формы настроек обработчика, услуги или профиля услуги (реализовано для доменных имен и сертификатов). По желанию, разработчик может добавить выполнение других действий с ручным запуском, с запуском по расписанию, либо с запуском из плагина к BILLmanager

Архитектура модуля

Стандартный модуль для BILLmanager состоит из двух файлов:

  • billmgr_mod_pmxxx.xml — xml описание модуля обработки, с привязкой к типу услуги, наименованием модуля и описанием параметров указываемых при добавлении обработчика в BILLmanager. Пример такого файла можно найти ниже в статье. Файл должен быть расположен в каталоге /usr/local/mgr5/etc/xml/ и иметь имя вида billmgr_mod_pmxxx.xml. Здесь и далее xxx — уникальное имя модуля обработчика
  • pmxxx — исполняемый файл модуля, вызываемый BILLmanager напрямую или через фоновое задание, при выполнении операций с услугами или по необходимости. Файл должен быть расположен в каталоге /usr/local/mgr5/processing/ и иметь имя вида pmxxx. У файла должны стоять права на исполнение от имени root

Так же по необходимости в поставку модуля обработчика могут быть включены другие файлы — cgi скрипты, выполняющие переадресацию пользователей в панель управления, вспомогательные исполняемые файлы, файлы плагинов BILLmanager, вносящих изменения в интерфейс и логику BILLmanager

Структура XML файла обработчика

После внесения изменений в XML описание обработчика необходим перезапуск BILLmanager для перестроения XML кеша

Структура исполняемого файла обработчика

Исполняемый файл обработчика должен уметь работать по следующему сценарию:

  • Получение и анализ параметров командной строки, с которыми вызван обработчик
  • Выбор внутренней функции в зависимости от значения полученного для параметра —command
  • Получение входных данных из потока ввода, при необходимости
  • Выполнение действий в панели управления или по API провайдера услуг
  • Изменение статус/параметров услуги в BILLmanager, при необходимости
  • Вывод в стандартный поток результата в формате XML

В качестве входных параметров модулю обработки передаются следующие значения:

  • —command — тип операции, которую необходимо выполнить. Возможные значения:
    • features — запрос XML описания поддерживаемых возможностей
    • open — фоновое задание открытия услуги на стороне панели управления или провайдера услуг
    • resume — фоновое задание включения услуги на стороне панели управления или провайдера услуг
    • suspend — фоновое задание выключения услуги на стороне панели управления или провайдера услуг
    • start — фоновое задание запуска услуги со стороны клиента при почасовой тарификации
    • stop — фоновое задание остановки услуги со стороны клиента при почасовой тарификации
    • cancel_prolong — фоновое задание отмены автоматического продления услуги на стороне панели управления или провайдера услуг
    • close — фоновое задание удаления услуги на стороне панели управления или провайдера услуг
    • setparam — фоновое задание на изменение параметров услуги в панели управления или на стороне провайдера услуг. Изменится могут как параметры услуги в BILLmanager, так и дополнения к услуге
    • get_suitable_module — запрос списка доступных модулей обработки для услуги с параметрами переданными во входящем XML документе
    • check_connection — проверка возможности подключения к панели управления или провайдеру услуги с переданными во входящем XML документе параметрами
    • tune_connection — изменение формы редактирования параметров подключения к панели управления или провайдеру услуг. На вход подается XML исходной формы настройки параметров, на выход модуль должен передать измененный XML документ описывающий форму настройки параметров
    • tuning_param — изменение формы настройки дополнительных параметров модуля обработки
    • usercreate — изменение формы регистрации нового пользователя на стороне провайдера услуг. Может понадобится только при условии дистрибьюции разрабатываемого модуля
    • tune_changepassword — изменение формы смены пароля для услуги
    • sync_pricelist — фоновое задание синхронизации тарифного плана в BILLmanager с пресетов в панели управления
    • get_server_config — фоновое задание получения конфигурации пресетов на стороне панели управления или провайдера услуг
    • sync_server — фоновое задание синхронизации данных в панели управления или провайдера услуг и в BILLmanager
    • prolong — фоновое задание продления срока действия услуги в панели управления или у провайдера услуг
    • stat — фоновое задание сбора статистики по использованию услугами ресурсов сервера или провайдера услуг
    • reboot — перезагрузка услуги (выделенного или виртуального сервера, любой другой услуги поддерживающей данный функционал)
    • import_pricelist — запрос данных тарифного плана для создания в BILLmanager. В ответ модуль должен вернуть XML с описание параметров тарифа
    • check_param — запуск проверки возможности изменения параметра услуги. На вход подается XML документ со старыми и новыми значениями параметров, в ответ либо возвращается XML документ с ok, либо XML описание ошибки
    • check_addon — запуск проверки возможности изменения дополнения к услуге. На вход подается XML документ со старыми и новыми значениями параметров, в ответ либо возвращается XML документ с ok, либо XML описание ошибки
    • changepassword — фоновое задание смены пароля для услуги в панели управления или у провайдера услуг
    • addip — фоновое задание добавления к услуге IP адреса в панели управления или у провайдера услуг
    • editip — фоновое задание изменения IP адреса услуги в панели управления или у провайдера услуг
    • delip — фоновое задание удаления IP адреса в панели управления или у провайдера услуг
    • transition_controlpanel — запрос XML документа с описанием доступных для перехода панелей управления
    • pingip — получения информация о занятости IP адреса из панели управления или от провайдера услуг
    • cleanup — фоновое задание для выполнения дополнительных действий после пометки в BILLmanager услуги как удаленной
    • cloneitem — фоновое задание для выполнения дополнительных действий после переноса услуги от клиента к клиенту
    • в будущем могут добавится другие значения. В случае если разрабатываемый модуль не способен обработать полученную команду, он должен завершиться с кодом 0, для того чтобы избежать вывода непредвиденных ошибок и зависания текущих операций
  • —subcommand — параметр уточняющий необходимое к выполнению действие. Передается при —command равном tuning_param и import_pricelist
  • —id — код тарифного плана на стороне панели управления или провайдера услуг при выполнении import_pricelist
  • —item — код услуги, для которой требуется выполнение операции
  • —module — код модуля обработки, для которого требуется выполнение операции
  • —param — наименование дополнительного параметра
  • —value — значение дополнительного параметра
  • —runningoperation — код текущей операции, связанной с вызванной командой. Используется для регистрации задачи в случае ошибки обработки услуги
  • —level — уровень доступа, для которого вызвана команда модуля обработчика, передается при выполнении transition_controlpanel
  • —password — новое значение пароля услуги, передается при выполнении changepassword
  • —userid — код пользователя, из-под которого запущено выполнение операции, передается при выполнении setparam
  • —panelkey — идентификатор панели управления, переход в которую необходимо осуществить, передается при выполнении transition_controlpanel
  • —ip — код IP адреса, который необходимо обработать

Разработчику модуля нет необходимости обрабатывать весь набор возможных команд и параметров, большая часть из них вызывается только при поддержке модулем необходимых возможностей. Далее приведено более полное описание вызываемых команд:

features

Запрос функций и параметров модуля обработки. Вызывается после запуска BILLmanager при первой необходимости.

Требуется поддержка функции:

XML документ, содержащий описание параметров модуля обработки и поддерживаемых функций, следующего формата

  • Атрибут name у ноды itemtype указывается по внутреннему имени типа продукта/услуги
  • Атрибут name у ноды param должен соответствовать имени поля ввода формы настроек модуля обработки. Атрибут crypted сигнализирует о необходимости хранения параметра в базе данных в зашифрованном виде
  • Атрибут name у customparam будет отображен в списке выбора при добавлении дополнительного параметра. Атрибут unique со значением yes указывает на то, что параметр с указанным внутренним именем может быть только один. Атрибут defval не обязателен и определяется значение параметра по умолчанию
  • Атрибут name у ноды feature указывает на поддерживаемую функцию модуля обработки. Доступные значения:
    • changepassword — модуль поддерживает смену пароля для услуги. В интерфейсе BILLmanager для услуг будет доступна соответствующая кнопка в списках
    • tune_changepassword — модуль поддерживает изменение формы смены пароля
    • check_addon — модуль поддерживает проверку возможности изменения дополнения к услуге
    • check_connection — модуль поддерживает проверку корректности введенных на форме настройки обработчика параметров
    • check_param — модуль поддерживает проверку параметров услуги при их изменении
    • cleanup — модуль поддерживает обработку дополнительной очистки после завершения удаления услуги
    • cloneitem — модуль поддерживает обработку переноса услуги от клиента к клиенту
    • tune_connection — модуль поддерживает изменение формы настройки обработчика в BILLmanager
    • datacenter — модуль поддерживает распределение услуг по дата-центрам
    • get_server_config — модуль поддерживает получение конфигурации
    • get_suitable_module — модуль поддерживает самостоятельное определение списка доступных для открытия услуг обработчиков
    • ipmgr — модуль поддерживает работу с IPmanager. Только добавляет выбор IPmanager на форму настроек обработчика
    • need_ipmgr — делает выбор IPmanager обязательным
    • licserver — модуль поддерживает работу с внешними BILLmanager в качестве серверов лицензий. Только добавляет выбор BILLmanager на форму настроек обработчика
    • pingip — модуль поддерживает проверку недоступности IP адреса перед удалением
    • prolong — модуль поддерживает продление услуг на стороне панели управления или провайдера услуг
    • reboot — модуль поддерживает выполнение перезагрузки услуги
    • stat — модуль поддерживает сбор статистики по услугам
    • stop_by_panel >open

    Обработка открытия (создания) услуги на стороне панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка
    • —runningoperation — код текущей операции на открытие услуги. Передается при наличии

    По завершению обработки открытия услуги необходимо вызвать функцию itemtype.open, где itemtype — внутреннее имя типа услуги, с параметрами:

    • elid — код услуги
    • Все параметры указываемые при открытии услуги (перечислены в настройках параметров типа продукта)
    • sok — со значение ok

    После чего услугу перейдет в активное состояние, а клиенту, в случае наличия настройки, уйдет уведомление об обработке услуги

    resume

    Обработка включения услуги на стороне панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка
    • —runningoperation — код текущей операции на включение услуги. Передается при наличии

    По завершению обработки включения услуги необходимо вызвать функцию service.postresume с параметрами:

    Обработка выключения услуги на стороне панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка
    • —runningoperation — код текущей операции на выключение услуги. Передается при наличии

    По завершению обработки выключения услуги необходимо вызвать функцию service.postsuspend с параметрами:

    Обработка запуска услуги на стороне панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка
    • —runningoperation — код текущей операции на включение услуги. Передается при наличии

    По завершению обработки включения услуги необходимо вызвать функцию service.poststart с параметрами:

    Обработка остановки услуги на стороне панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка
    • —runningoperation — код текущей операции на включение услуги. Передается при наличии

    По завершению обработки включения услуги необходимо вызвать функцию service.poststop с параметрами:

    Обработка отмены автоматического продления услуги на стороне панели управления или провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка

    close

    Обработка удаления услуги на стороне панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка
    • —runningoperation — код текущей операции на включение услуги. Передается при наличии

    По завершению обработки включения услуги необходимо вызвать функцию service.postclose с параметрами:

    Обработка изменения параметров услуги на стороне панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка
    • —runningoperation — код текущей операции на включение услуги. Передается при наличии
    • —userid — код пользователя инициировавшего смену тарифного плана. Передается при наличии

    Изменение параметров услуги может быть вызвано двумя действиями в BILLmanager

    В этом случае в таблице item для услуги сохраняется ссылка lastpricelist на предыдущий тарифный план и в случае ошибки смены тарифного плана на стороне панели управления или у провайдера услуги необходимо вызвать функцию service.changepricelist.rollback с параметрами:

    • elid — код услуги
    • userid — код пользователя
    • sok — со значение ok
    • Изменение параметров и дополнений к услуги

    В этом случае дополнительных действий выполнять ненужно

    По завершению обработки изменения параметров услуги необходимо вызвать функцию service.postsetparam с параметрами:

    Получение списка модулей обработки доступных для обработки открытия услуги с переданными параметрами

    Требуется поддержка функции:

    • —item — код услуги, для которой выполняется обработка. Не передается при построении списка тарифных планов
    • XML документ с параметрами услуги вида

    XML документ вида

    где атрибут id у ноды module — код обработчика подходящего для обработки услуги

    check_connection

    Проверка возможности доступа к панели управления или провайдеру услуг

    Требуется поддержка функции:

    • XML документ с параметрами обработчика вида

    XML документ вида

    В случае успеха, либо XML описание ошибки в случае ошибки подключения

    tune_connection

    Изменения формы настроек параметров обработчика. Может быть использован для заполнения списков, удаления/добавления атрибутов к полям и других действий по изменению формы

    Требуется поддержка функции:

    • XML документ текущего описания формы
    • Исходный или измененный XML документ

    tuning_param

    Поддержка функции настройки дополнительных параметров, а так же изменение формы/списка настройки дополнительных параметров

    Требуется поддержка функции:

    где action может принимать следующие значения:

    • TableFormTune — функция вызвана при построении формы настройки параметра
    • TableGet — функция вызвана при получении данных уже настроенного параметра
    • TableSet — функция вызвана при сохранении параметра
    • List — функция вызвана при построении списка параметров
    • XML документ текущего описания формы или списка с дополнительной нодой session_params содержащей параметры сессии
    • Исходный или измененный XML документ, либо XML описание ошибки

    usercreate

    Изменение формы создания нового пользователя на стороне провайдера услуги. Обычно служит для формирования ссылки на регистрацию в системе провайдера услуг Требуется поддержка функции:

    • XML документ текущего описания формы
    • Исходный или измененный XML документ

    tune_changepassword

    Изменение формы смены пароля для услуги

    Требуется поддержка функции:

    • —module — код модуля обработчика, к которому привязана услуги, для которой производится смена пароля
    • XML документ текущего описания формы
    • Исходный или измененный XML документ

    sync_pricelist

    Синхронизация тарифного плана в BILLmanager с соответствующей сущностью в панели управления или у провайдера услуг. Может использоваться для создания пресета на стороне панели управления, выставления лимитов дополнения в BILLmanager по данным от панели управления или провайдера услуг и т.д. Вызывается при создании или изменении внутреннего имени тарифного плана, а так при подключении тарифов к обработчику

    Требуется поддержка функции:

    get_server_config

    Формирование и сохранение в BILLmanager описания конфига обработчика

    Требуется поддержка функции:

    Конфиг модуля представляет собой XML документ следующего формата:

    Так же в конфиг модно сохранить дополнительную инфомрацию для дальнейшего использования модулем

    Сохранение конфига в BILLmanager выполняется вызовом функции processing.setconfig с параметрами

    • elid — код обработчика
    • config — XML описание конфига

    Сохранение в BILLmanager шаблонов ОС (и другим вариантов параметров типов продукта) выполняется функцией itemtype.param.value.edit с параметрами

    • intname — внутреннее наименование шаблона (идентификатор)
    • name (name_xx) — наименование, в том числе локализованные
    • pl >sync_server

    Синхронизация данных по услугам между BILLmananager и панелью управления или провайдером услуг

    Требуется поддержка функции:

    Может использоваться для выставления узла кластера, на котором была создана услуга, шаблона ОС для виртуальных и выделенных серверов, либо для любых других действий обеспечивающихся актуальность информации отображаемой в BILLmanager

    prolong

    Продление срока действия услуги в панели управления или у провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги
    • —runningoperation — код текущей операции

    По завершению продления услугу, необходимо вызвать функцию service.postprolong с параметрами:

    Сбор статистики использования ресурсов услугами в панели управления или у провайдера услуг

    Требуется поддержка функции:

    Собранную статистику необходимо сохранить в базу данных BILLmanager в таблицу itemstat, поля таблицы:

    • item — код услуги
    • statdate — дата потребления ресурса
    • param — внутреннее имя параметра, по которому сохраняется статистика. Это либо внутреннее имя типа продукта дополнения в тарифному плану услуги, либо произвольное наименование параметра, которое указывается в настройках дополнения к тарифному плану
    • value — целочисленное значение потребленного ресурса
    • measure — код единицы измерения

    По завершению сохранени инфомрация о собранной статистике а базе данных BILLmanager необходимо вызвать функцию service.poststat, с параметрами

    • elid — код обработчика
    • date — дата за которую была собрана статистика

    Дата, за которую последний раз была собрана статистика сохраняется в поле laststatdate таблицы processingmodule, где id — код обработчика

    import_pricelist

    Получение данных тарифного плана из панели управления или от провайдера услуг для сохранения в BILLmanager

    Требуется поддержка функции:

    • —module — код обработчика
    • —subcommand — тип получаемой информации. Возможные значения:
      • available — запрос списка доступных для импорта тарифных планов
      • pricelist — запрос детальной информации по тарифному плану для импорта. Параметр —id — идентификатор тарифа в панели управления или у провайдера услуг
      • images — запрос списка образов диска тарифного плана (при наличии). Параметр —id — идентификатор тарифа в панели управления или у провайдера услуг
      • periods — запрос списка доступных периодов заказа тарифного плана. Параметр —id — идентификатор тарифа в панели управления или у провайдера услуг
      • details — запрос списка доступных дополнений к тарифному плану. Параметр —id — идентификатор тарифа в панели управления или у провайдера услуг

    XML документ, формат которого зависит от полученного —subcommand:

    check_param

    Проверка возможности изменения параметра услуги

    Требуется поддержка функции:

    • —item — код услуги
    • —param — внутреннее наименование параметра
    • —value — новое значение параметра
    • —level — уровень доступа пользователя изменившего параметры
    • XML вида

    В случае допустимости изменения параметра XML вида

    В противном случае сообщение об ошибке

    check_addon

    Проверка возможности изменения дополнения к услуге

    Требуется поддержка функции:

    • —item — код услуги
    • —param — внутреннее наименование типа дополнения
    • —value — новое значение дополнения
    • —level — уровень доступа пользователя изменившего дополнение
    • XML вида

    В случае допустимости изменения параметра XML вида

    В противном случае сообщение об ошибке

    changepassword

    Изменение пароля для услуги на стороне панели управления или провайдера услуг

    Требуется поддержка функции:

    • —item — код услуги
    • —password — новое значение пароля, зашифрованное алгоритмом RSA и секретным ключом /usr/local/mgr5/etc/billmgr.pem.

    По завершению смены пароля у услуги необходимо сохранить его в BILLmanager командой service.saveparam с параметрами

    • item — код услуги
    • password — новый пароль услуги
    • sok со значением ok

    И вызвать функцию service.postchangepassword с параметрами:

    addip

    Добавление у услуги нового ip адреса

    Требуется поддержка функции:

    • —item — код услуги
    • —ip — код ip адреса из таблицы ip

    IP адрес сохраняется в BILLmanager функцией service.ip.add с параметрами:

    • elid — код ip адреса
    • ip — значение ip адреса
    • domain — ptr запись ip адреса
    • ipmgr — ссылка на IPmanager, если используется
    • sok со значением ok

    В ответ функция вернет XML вида

    Надо ip.id содержит новый код ip адреса в BILLmanager (код меняется в случае, если услуге выделяется IP адрес, ранее уже сохраненный в BILLmanager)

    Для полученного кода ip адреса нужно вызвать функцию активации service.ip.add.commit с параметрами:

    Изменение существующего ip адреса услуги. Вызывается при редактировании доменного имени у ip адреса в BILLmanager

    Требуется поддержка функции:

    • —ip — код ip адреса из таблицы ip

    delip

    Удаление ip адреса у услуги

    Требуется поддержка функции:

    • —item — код услуги
    • —ip — код ip адреса из таблицы ip

    IP адрес помечается в BILLmanager удаленным функцией service.ip.del с параметрами:

    Переход на сервер под учетной записью клиента или сотрудника

    Требуется поддержка функции:

    • —item — код услуги
    • —level — уровень доступа пользователя, выполняющего переход
    • —panelkey — код обработчика, при переходе из списка обработчиков или идентификатор панели, ссылку на переход в которую необходимо вывести

    XML документ со списком панелей или ссылкой на переход в панель управления вида:

    pingip

    Проверка доступности ip адреса. Выполняется перед удалением

    Требуется поддержка функции:

    XML документ с результатом проверки доступности ip адреса вида

    cleanup

    Выполнение дополнительных действий по завершению удаления услуги (после перевода услуги в статус «удален»)

    Требуется поддержка функции:

    cloneitem

    Перенос услуги от клиента к клиенту в BILLmanager. Может быть полезна если разные услуги одного клиента создаются в рамках одной учетной записи в панели управления или на стороне провайдера услуг

    Требуется поддержка функции:

    reboot

    Требуется поддержка функции:

    По завершению перезагрузки услуги, необходимо вызвать функцию service.postreboot с параметрами:

    В случае если при вызове функции модуля был передан Id текущей операции и при обработке команды произошла какая-либо ошибка, целесообразно отобразить информацию об этом в BILLmanager. Для этого существует набор функций:

    runningoperation.edit — изменение текущей операции. Принимает параметры:

    • elid — код текущей операции
    • errorxml — XML документ с набором XML описаний произошедших ошибок, вида

    При наличии код услуги и необходимости прекращения повторных попыток выполнения операции (в таблице runningoperation поле trycount отражает количество попыток выполнения операции) можно создать задачу на отдел ответственный за модуль обработки. Для этого нужно выполнить два шага:

    • Вызвать функцию task.gettype, в которую параметром operation передается текущее значение параметра —command командной строки. В ответ будет получен XML документ вида

    где task_type — тип задачи, которую необходимо создать. Если нода отсутствует или пуста, создание задачи невозможно.

    • Зарегистрировать задачу функцией task.edit, с параметрами:
      • item — код услуги
      • runningoperation — код текущей операции
      • type — значение task_type

    Примеры модулей

    Исполняемый файл модуля обработчика может быть реализован на любой скриптовом или компилируемом языке программирования, поддерживающем работу с параметрами командной строки, а так же потоками ввода вывода. Выбор языка программирования зависит от разработчика, но для ускорения разработки, а так же своевременного реагирования на добавления новых функций, рекомендуется использовать C++ и заголовочные файлы из пакета разработчика BILLmanager.

    C++ (с использованием библиотек BILLmanager)

    Использование заголовочных файлов BILLmanager для разработки собственных модулей обработчиков доступно с версии BILLmanager 5.58.0. Кроме приведенного упрощенного примера, можно изучить примеры представленные в пакете разработчика BILLmanager — billmanager-[Редакция BILLmanager]-devel, например:

    После этого примеры можно найти в директории:

    Модуль для создания модулей и расширенных функций

    [1/3/09 Дополнение – оригинальная ссылка на присоединенный файл, содержащий этот код, была с ошибкой, которая теперь исправлена. Извините. jps]

    Трудно переоценить важность модулей и расширенных функций. Если используете PowerShell – вам необходимо уделить время изучению этих новых механизмов и применять их в качестве наиболее предпочтительного варианта реализации новых функций. Причина в том, что эти механизмы являются важнейшими технологиями позволяющими нам ОБМЕНИВАТЬСЯ ДРУГ С ДРУГОМ И СОВМЕСТНО ИСПОЛЬЗОВАТЬ КОД.

    Расширенные функции обеспечивают справку, завершение параметров с помощью табуляции и семантику коммандлетов, что упрощает использование ваших функций другими людьми. Тем кто хочет по-прежнему читать исходный код, чтобы узнать, что делает функция – вам нужна справка. Желающим гадать о значении параметров – нужно автодополнение с помощью табуляции. Тем кто хочет использовать функцию, которая может давать неожиданные результаты – нужно использовать -WHATIF -CONFIRM и -VERBOSE.

    Модули упрощают упаковку функций и их использование без взаимных конфликтов. Кстати, не уверен объяснил ли я что модули обеспечивают альтернативный механизм позволяющий делать то же, что делает механизм PSSNAPIN. На самом деле командлеты *-module работают и с модулями написанными на PowerShell, и с компилированными библиотеками DLL. Преимущество модулей перед snap-in в том, что их можно развертывать с помощью команды xcopy.

    Единственный отрицательный момент в использовании модулей и расширенных функций состоит в том, что они требуют дополнительных действий в при написании кода. Поэтому я написал модуль Module (это, возможно, и ужасное имя, но я пока что пользуюсь именно им). Этот модуль делает создание модулей и расширенных функций простым делом и является хорошим примером и тех, и других.

    New-PSScript требует указать ГЛАГОЛ (VERB) и СУЩЕСТВИТЕЛЬНОЕ (NOUN), (он может принимать также несколько дополнительных параметров), и создает тело сценария или функции, содержащее справочные комментарии. Затем вы можете перенаправить его вывод в файл. Ниже приведен пример использования New-PSScript:

    New-ModuleTemplate делает что-то подобное для модулей. Он требует ИМЯ (NAME) и создает файл .PSD1, описывающий модуль и файл .PSM1 с функцией GET-NAME. Одной из удобных возможностей этой команды является то, что она понимает флаг -EDIT, и если вы укажете его, созданные файлы откроются в Powershell_ISE, так что вы сможете немедленно начать писать свой код.

    Установите модуль, скопировав файлы в каталог MODULE в вашем каталоге модулей:

    ($Env:PSMODULEPATH -Split «;»)[0]

    Если вы еще не создали каталог для своих модулей, можете сделать это следующей командой:

    Если вы похожи на меня, то не захотите каждый раз набирать эту ерунду, так что когда вы сделаете import-Module Module, первое что она сделает, это создаст для вас PSDRIVE под названием MYMOD.

    Дайте этой штуке шанс и расскажите мне, что вы об этом думаете. У нее есть HELP, и он содержит подробные примеры того, как все это работает.

    Скажу еще раз – трудно переоценить, насколько важно начать использовать модули и расширенные функции. Вам действительно следует начать использовать их уже сегодня и сообщить нам, нет ли в них каких-то ошибок, проблем или возможностей для улучшения. У нас мало времени для внесения изменений в V2 (Powershell версии 2), так что давайте начнем прямо сегодня.

    Работа с модулями: создание, подключение инструкциями import и from

    Модулем в Python называется любой файл с программой (да-да, все те программы, которые вы писали, можно назвать модулями). В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами.

    Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++.

    Подключение модуля из стандартной библиотеки

    Подключить модуль можно с помощью инструкции import. К примеру, подключим модуль os для получения текущей директории:

    После ключевого слова import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода. Импортируем модули time и random.

    После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Например, можно обратиться к константе e, расположенной в модуле math:

    Стоит отметить, что если указанный атрибут модуля не будет найден, возбудится исключение AttributeError. А если не удастся найти модуль для импортирования, то ImportError.

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

    Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.

    Теперь доступ ко всем атрибутам модуля math осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет (если, конечно, вы после этого не напишете import math, тогда модуль будет доступен как под именем m, так и под именем math).

    Инструкция from

    Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:

    Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова as.

    Импортируемые атрибуты можно разместить на нескольких строках, если их много, для лучшей читаемости кода:

    Второй формат инструкции from позволяет подключить все (точнее, почти все) переменные из модуля. Для примера импортируем все атрибуты из модуля sys:

    Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная __all__ (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная __all__ не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имен главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны.

    Создание своего модуля на Python

    Теперь пришло время создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции:

    Теперь в этой же папке создадим другой файл, например, main.py:

    Поздравляю! Вы сделали свой модуль! Напоследок отвечу ещё на пару вопросов, связанных с созданием модулей:

    Как назвать модуль?

    Помните, что вы (или другие люди) будут его импортировать и использовать в качестве переменной. Модуль нельзя именовать также, как и ключевое слово (их список можно посмотреть тут). Также имена модулей нельзя начинать с цифры. И не стоит называть модуль также, как какую-либо из встроенных функций. То есть, конечно, можно, но это создаст большие неудобства при его последующем использовании.

    Разработка базового модуля

    Материал из Joomla! Documentation

    Содержание

    Материалы в этой серии

    Данная серия материалов написана о том, как разработать какой-либо модуль для Joomla! в версии . Вы можете пройтись по материалам этой серии с помощью выпадающего навигационного меню.

    Начните со вступления и пройдитесь по материалам этой серии с помощью либо расположенной внизу навигационной кнопки, либо расположенного справа навигационного текстового блока (Материалы в этой серии).

    Модули представляют собой легкие и гибкие расширения. Они используются для малых кусочков страницы, которые, как правило, менее сложные и могут быть замечены вокруг разных компонентов.

    Вы можете увидеть много примеров модулей в стандартной установке Joomla!: — Меню — Последние Новости — Форма входа — и многое другое.

    Этот учебник объяснит, как создать простой модуль «Привет мир». С помощью данного руководства вы узнаете основную файловую структуру модуля. Затем эта базовая структура может быть расширена, чтобы произвести более сложные модули.

    Файловая Структура

    Существует четыре основных файла, которые используются в стандартном шаблоне разработки модуля:

    • mod_helloworld.php — этот файл и является основной точкой входа для модуля. Он будет выполнять все необходимые процедуры инициализации, вызова вспомогательных средств для сбора необходимых данных а также шаблон, который будет отображать вывод модуля.
    • mod_helloworld.xml — этот файл содержит информацию о модуле. Он определяет файлы, которые должны быть установлены установщиком Joomla! и задает параметры конфигурации модуля.
    • helper.php — этот файл содержит вспомогательный класс, используемый для того, чтобы сделать фактическую работу в получении информации, которая будет отображаться в модуле (как правило, из базы данных или другого источника).
    • tmpl/default.php — это шаблон модуля. Этот файл будет принимать данные, собранные mod_helloworld.php и генерирует HTML, который будет отображаться на странице.

    Создание mod_helloworld.php

    Файл mod_helloworld.php будет выполнять три задачи:

    • включает файл helper.php который содержит класс, который должен быть использован для того чтобы собрать необходимые данные
    • вызывает соответствующий метод вспомогательного класса, чтобы получить данные
    • включает шаблон для отображения результата.

    Вспомогательный класс определяется в нашем файле helper.php . Этот файл включается выражением require_once:

    require_once используется потому, что наши вспомогательные функции определяются внутри класса, а мы хотим чтобы класс объявлялся только один раз.

    Наш вспомогательный класс, пока еще не был определен, но, когда он появится, он будет содержать один метод: getHello(). Для нашего простого примера, на самом деле не надо этого делать — сообщение “Привет, мир!” , которое этот метод возвращает может быть просто включен в шаблон. Здесь мы используем вспомогательный класс, чтобы продемонстрировать эту базовую технику.

    В настоящее время наш модуль не использует никаких параметров, но мы будем передавать их в любом случае во вспомогательный метод, так что они могут быть использованы позже, если мы решим расширить функционал нашего модуля.

    Метод вспомогательного класса вызывается следующим образом:

    Полный файл mod_helloworld.php

    Полный файл mod_helloworld.php выглядит следующим образом:

    Единственная строка, которую мы до сих пор не объяснили — это первая строка. Эта строка проверяет, чтобы этот файл включался через приложение Joomla!. Это необходимо, чтобы предотвратить инъекции переменных и другие потенциальные проблем безопасности.

    Создание helper.php

    Файл helper.php содержит вспомогательный класс, который используется для извлечения данных, которые будут отображаться при выводе модуля. Как говорилось ранее, наш вспомогательный класс будет иметь один метод: getHello(). Этот метод будет возвращать сообщение ‘Привет, мир’.

    Вот код файла helper.php :

    Нет правила, гласящего, что мы должны назвать наш вспомогательный класс так, как он назван у нас, но делать так — это полезно, чтобы его можно было легко идентифицировать и обнаружить. Обратите внимание, что название должно быть в таком формате, если вы планируете использовать плагин com_ajax.

    Более сложные модули могут включать в себя запросы к базе данных или другие функции во вспомогательном методе класса.

    Создание tmpl/default.php

    Файлdefault.php это шаблон, который выводит модуль.

    Код для файла default.php выглядит следующим образом:

    Важный момент, который следует отметить, это то, что файл шаблона имеет ту же область видимости, что и файл mod_helloworld.php . Это означает, что переменная $hello может быть определена в файле mod_helloworld.php, а затем использоваться в файле шаблона, без каких-либо дополнительных объявлений или вызовов функций.

    Создание mod_helloworld.xml

    Файл mod_helloworld.xml используется, чтобы указать файлы, которые установщик должен скопировать и он используется Менеджером Модулей, чтобы определить, какие параметры используются для настройки модуля. Другая информация о модуле также указывается в этом файле.

    Код mod_helloworld.xml выглядит следующим образом:

    файлы Манифеста объясняют технические детали элементов, используемых в XML-файле.

    Вы заметите, что есть два дополнительных файла, которые мы еще не упоминали: index.html и tmpl/index.html. Эти файлы добавлены для того, чтобы содержимое папок, в которых они расположены не могло быть просмотрено. Если пользователь попытается открыть в своем браузере эти папки — будет отображаться файл index.html. Эти файлы могут быть пустыми или могут содержать простую строку:

    который будет отображать пустую страницу.

    Так как наш модуль не использует поля формы раздел config пуст.

    Заключение

    Разработка модуля для Joomla! это довольно простой и понятный процесс. Используя методы, описанные в этом учебнике, бесконечное разнообразие модулей может быть разработано без особых хлопот.

    Документация по API UMI.CMS

    Создание модуля

    Перед прочтением необходимо ознакомиться с документацией по структуре модуля.

    Готовый к установке модуль из рассматриваемого примера можно скачать по ссылке.

    Создаем основные файлы и классы модуля

    Для того, чтобы модуль корректно зарегистрировался в системе и мы смогли сосредоточится на разработке его функционала, создадим необходимые файлы и опишем изначальную структуру классов:

    Отвечает за регистрацию модуля в системе. В файле install.php находится массив $INFO, который содержит ключи, которые будут внесены в настройки системы, чтобы обеспечить функционирование модуля и массив $COMPONENTS, содержащий список компонентов модуля.

    Описание обязательных настроек:

    Имя модуля (латинское), будет использоваться системой, должно совпадать с именем папки модуля. Имя модуля должно быть уникальным, рекомендуем добавлять к нему префикс с названием вашей организации. Если проигнорировать данную рекомендацию, то может возникнуть коллизия — другая организация может опубликовать модуль с таким же именем на umi.market, в таком случае ваш модуль при переактивации системы отключится, так как он не был приобретен.

    Метод, который будет вызываться по умолчанию в клиентской части

    Метод, который будет вызываться по умолчанию в административной части

    Массив, определяющий группы прав нашего модуля. Это те группы, которые отображаются в настройках пользователя и влияют на доступ к функционалу модуля. Более подробно права будут рассмотрены далее.

    Массив, содержащий пути к файлам, необходимым для работы нашего модуля.

    Основной файл, содержащий класс, который представляет собой модуль. Этот класс должен быть унаследован от абстрактного класса def_module и должен иметь имя, соответствующее имени модуля. Класс модуля может подключать методы других абстрактных классов, в зависимости от режима работы системы. Это позволяет экономить ресурсы и логически разделить административные методы и клиентские методы-макросы.

    При работе с модулем мы пользуемся экземпляром этого класса. Каждый публичный метод этого класса может являться макросом.

    Обратите внимание на метод getEditLink . Этот метод должен присутствовать, если наш модуль работает со страницами. Этот метод указывает системе где находятся обработчики на добавление и редактирование нашей страницы. Используется, например, при построении дерева (в модуле «Структура»), в панели быстрого редактирования на клиентской части. Далее мы поговорим об этом методе более подробно, а так же «научим» систему «распознавать» наши страницы для отображения в панели быстрого редактирования. Аналогичные методы можно определить для получения ссылки на редактирование объектов и типов данных, с помощью методов getObjectEditLink() и getObjectTypeEditLink().

    В этом файле могут содержаться административные методы, которые будут обеспечивать необходимый функционал, например: редактирование, создание, удаление страниц.

    Этот файл мы подгружаем в классе модуля >baseModuleAdmin .

    Пример реализации получения, удаления, переключения активности списка страниц, создания и редактирования страницы:

    В этом файле хранятся все языковые константы, используемые в клиентской части. Массив $C_LANG содержит строки, автоматически подставляемые в заголовок (title) страницы (в данном случае, это имена методов, которые могут быть вызваны напрямую: http://mysite.ru/mymodule/mymethod/), а массив $LANG_EXPORT — строки, которые могут появляться в тексте в виде макроса вида %mystring% ; такие макросы будут автоматически заменены шаблонизатором на соответствующее значение из массива $LANG_EXPORT .

    Обратите внимание, что в зависимости от текущего языка, может подключаться дополнительный файл. Например, если мы находимся в английской версии и префикс у этого языка «en», то при наличии файла lang.en.php в папке модуля будет использоваться именно он.

    В этом файле хранятся все языковые константы, используемые в административной части

    Обратите внимание, что в зависимости от текущего языка, может подключаться дополнительный файл. Например, если мы находимся в английской версии административной части и префикс у этого языка «en», то при наличии файла i18n.en.php в папке модуля будет использоваться именно он.

    После определения этих констант, в xslt-скине они доступны через сущности, например так &header-dummy-pages; Об этом будет рассказано подробнее в разделе Интернационализация.

    В этом файле хранятся подключи для прав к функциям модуля.

    Основные группы прав мы задали в файле install.php, а в массиве $permissions данного файла, указывается какой метод относится к той или иной группе прав. Таким образом, если мы хотим добавить новый метод, мы должны включить его в одну из групп прав.

    В этом файле могут содержаться клиентские методы, которые будут доступны в шаблоне, например: получение списка страниц.

    Пример реализации получение информации о странице и списка страниц:

    customAdmin.php и customMacros.php

    Это файлы для кастомизации функционала модуля, их содержимое не меняется при обновлении системы. В customAdmin.php — добавляется административный функционал, а в customMacros.php клиентский. Эти файлы подключаются в class.php, в зависимости от режима работы системы.

    Типовое содержание customAdmin.php:

    Типовое содержание customMacros.php:

    У модуля должны быть иконки определенных размеров. Начиная с версии 2.12 в системе по умолчанию выбран скин «Modern», иконки для которого находятся в папке

    Иконка должна носить имя модуля, тип иконки — прозрачный png:

    /images/cms/admin/modern/icon/ dummy.png — иконка 42×42 px

    Устанавливаем модуль

    После создания основных файлов модуля, можно попробовать его установить. Для этого необходимо зайти в конфигурацию системы ( /admin/config/modules) и в строке установки ввести classes/components/dummy/install.php. Если структура основных файлов модуля сделана корректно, модуль зарегистрируется в системе и мы увидим его в списке доступных модулей. Попробуйте перейти в наш новый модуль, должен появиться список комментариев, т.е. вызывается метод tree, который мы прописали в инталляторе, в качестве метода по умолчанию для администрирования модуля.

    Теперь можно приступить к проектированию и созданию типов данных для модуля, а затем к разработке его функционала.

    Создаем типы данных

    Допустим, наш модуль будет создавать страницы какого-то особого типа и поведения. Для этого нам необходимо создать соответствующие типы данных и связать их с модулем.

    Создаем базовые (иерархические) типы данных

    Сначала создадим базовые (иерархические) типы, чтобы корректно связать будущий тип данных с модулем. Для этого необходимо зайти в настройки модуля «Шаблоны данных» (/admin/data/config/). Вы увидите таблицу, в которой перечислены все базовые типы, на данный момент установленные в системе. В самом низу таблицы есть пустые поля, которые можно заполнить.

    Сначала добавим базовый (иерархический) тип для страниц:

    Это обычное название, для удобства разработчика. Назовем наш тип «Страницы моего модуля»

    Модуль, который будет контролировать наш тип. Введем имя нашего модуля «dummy»

    Метод, который отвечает за обработку элементов (страниц) нашего нового типа. Назовем этот метод «page»

    Потом добавим базовый (иерархический) тип для объектов:

    Назовем наш тип «Объекты моего модуля»

    Введем имя нашего модуля «dummy»

    Назовем этот метод «object»

    Обратите внимание, что изменение существующих базовых типов повлечет за собой непредсказуемые последствия.

    Создаем объектные типы данных

    Теперь можно перейти к созданию нужного нам типа данных. В системе уже есть типы данных, которые отвечают за страницы, отображаемые на сайте. Все они являются дочерними типами от типа данных «Раздел сайта». Зайдите в содержание типа «Раздел сайта» и увидите список всех его подтипов. Нам необходимо создать свой. Для этого нажмите на кнопку «Добавить тип данных». Откроется страница редактирования нового типа данных. Поменяем название типа на «Моя страница». Теперь необходимо связать тип данных с модулем. В выпадающем списке «Назначение типа» выберите пункт «Страницы моего модуля». Это базовый тип, который мы только что создали в настройках модуля «Шаблоны данных».

    Нажмите «Сохранить». Теперь мы сможем использовать этот тип данных, как основу для создания элементов — страниц сайта.

    Потом найдем в общем списке тип «Справочники», создадим к нему дочерний тип «Мой объект» и укажем ему назначение типа «Объекты моего модуля».

    Создаем административные шаблоны модуля

    Завершающий этап: пишем справку

    Создание справки в компонентах модулей представляет из себя немаловажную задачу. То, насколько понятно и полно будет описана работа с модулем в справке, сильно повлияет на простоту работы с вашим модулем и его компонентами, а значит и на лояльность конечного пользователя к вашему программному решению.

    Несмотря на очевидную важность наличия справки, процесс её создания крайне прост и представляет собой создание обыкновенных html-документов, расположенных в файловой системе вашего сервера по следующему принципу: man/<локаль>/<модуль>/<компонент>.html, где локаль — это языковая версия административного интерфейса (может иметь значения ru или en), модуль — системное название модуля (например, для модуля Структура — это content), компонент — системное название компонента (административного метода модуля, вкладки модуля или страницы настроек модуля, например, sitetree).

    Примеры расположений файлов справки существующих модулей: man/ru/emarket/orders.html — файл справки для вкладки Заказы модуля Интернет-магазин, man/ru/emarket/orders.html — файл справки для вкладки Заказы модуля Интернет-магазин, man/ru/emarket/orders_edit.html — файл справки для страницы редактирования заказа, man/ru/emarket/payment_add.html — файл справки для страницы добавления способа оплаты того же модуля, man/ru/emarket/config.html — файл справки для страницы настроек. Для административных страниц вашего компонента или модуля файл справки и, соответственно, путь до него будет свой.

    Обратите внимание : При разработке собственного модуля в справке основного компонента (компонента по умолчанию) рекомендуется размещать вводную информацию по его назначению и основным возможностям. Эта же рекомендация распространяется на справку компонента, разработанного вами для существующего модуля.

    SalesPlatform Vtiger CRM Developers Руководство Создание нового модуля

    Модуль является функциональной единицей Vtiger CRM. Каждый модуль, следуя паттерну Model-View-Controller (MVC), состоит из Моделей, Контроллеров, Представлений и связанных с ними ресурсов, которые необходимы для управления данными и пользовательского интерфейса. Модули бывают двух типов: Модуль-сущность (Entity Module) и Модуль-расширение (Extension Module). В данной статье речь пойдет о создании Модуля-сущности.

    Важно Перед тем, как создавать новый Модуль, выполните действия из статьи «Окружение разработчика».

Учебник РНР
Назад Глава 32. Исходные Ресурсы. Обсуждение. Вперёд

Содержание

Модуль “MyModule

Модуль будет состоять из двух блоков:

  1. Общая информация
  2. Описание
Состав полей блока “Общая информация”
Название поля Тип поля
Название* Текстовое поле
Заказ* Поле-ссылка на карточку Заказа
Статус* Выпадающий список. Значения: Активно, Неактивно
Дата Дата
Ответственный* Ответственный

Состав полей блока “Описание”

Название поля Тип поля
Описание Текстовая область

Поля отмеченные звездочкой (*) для обязательного заполнения.
Связанные списки

Для начала в корне системы создайте файл для размещения кода модуля .php. В нем подключите модули Module.php и Package.php.

В файле Module.php описан класс Vtiger_Module, который предлагает API для работы с модулями Vtiger CRM, таких как initWebservice, getInstance, setRelatedList и другие.
Включить протоколирование.

Сохранение имени модуля в переменной MODULENAME.

Создание нового модуля.

В поле name задать имя модуля.

В поле parent задать глобальный раздел, к которому принадлежит модуль.

Для Модуля инициализировать (создать) 2 таблицы.

Перечень созданных таблиц

Таблица Имя таблицы в БД Описание
Базовая таблица vtiger_ Содержит поля нового модуля
Настраиваемая таблица vtiger_ cf Содержит настраиваемые (пользовательские) поля

Класс Vtiger_Block предлагает API для работы с блоком Модуля, содержащий контейнер, в котором помещаются все поля.
Создание нового блока.

Отображение названия блока для пользователя.

Добавление нового блока в модуль, который был создан ранее.

Второй блок “Описание” создается аналогичным способом.
Класс Vtiger_Field предлагает API для работы с полями Модуля, которые являются основными элементами, которые хранят и отображают данные записи модуля.

Создание полей для Модуля «MyModule»

Создание текстового поля

Пример текстового поля (см. рис.1).

Создание нового поля.

Присвоение имени полю.

Отображение названия поля для пользователя.

Каждое поле в Модуле содержит информацию, которая может быть представлена в разных видах: текстовое поле, выпадающий список, текстовая область, дата и время и др.
Тип поля задается свойством uitype. Список некоторых из них можно посмотреть по ссылке: https://wiki.vtiger.com/index.php/UI_Types .

Список наиболее из распространенных полей представлен ниже

UI type Описание
1 Текстовое поле
4 Автоинкрементное поле (номер идентификатор сущности)
5 Поле Дата с ссылкой на Календарь
10 Поле ссылка на другой модуль
15 Список с возможностью выбора одного из значений
16 Раскрывающийся список. Значения в раскрывающемся списке могут отличаться от модуля к модулю и не зависят от роли (без роли) на основе текущего пользователя.
19 Текстовая область для ввода нескольких строк текста (н-р: «Описание», «Решения»)
53 Поле “Ответственный” (раскрывающийся список, где выбирается имя пользователя или группа).
70 Дата и время. Должен использоваться для создания таких полей, как время создания/ изменения Модуля

Тип представления для поля.

Отобразить поле в кратком виде карточки.

Название столбца в соответствующей таблице.

Тип данных в столбце таблицы.

Тип вводимых данных

Тип вводимых данных должен соответствовать типу данных в БД.

‘V’- VARCHAR; ‘M’- поле обязательно для заполнения (‘О’ — поле необязательно для заполнения).

Добавление созданного поля в соответствующий блок.

Одно из обязательных полей должно быть установлено в качестве идентификатора модуля. Значение данного поля (связанный Модуль) будет подставлено в поле-ссылку основного Модуля. Идентификация модуля осуществляется методом setEntityIdentifier, который вызывается только один раз.
Идентификация модуля.

Создание поля со списком возможных значений

Пример поля со списком возможных значений (см. рис. 2).

Создание поля со списком возможных значений происходит аналогично предыдущему примеру (создания текстового поля), с добавлением дополнительного метода установки значений выпадающего списка.

Если поле имеет тип PickList (uitype равно одному из перечисленных значений: 15, 16, 33, 55, 111), то вы можете задать начальные значения:

где метод setPicklistValues принимает на вход массив возможных значений.

Создание поля-ссылки на связанный Модуль

Пример поля-ссылки (uitype равно 10) на связанный Модуль (см. рис.3).

При выборе открывается дополнительное окно, отображающее записи Модуля, который связан с данным полем. При необходимости можно добавить новую запись в Модуль, при нажатии на кнопку .

В отличии от предыдущих примеров в коде присутствует метод setRelatedModule.

Для того, чтобы в поле можно было указать ссылку на связанный модуль нужно использовать метод setRelatedModules(Array(‘SalesOrder’)), который принимает на вход массив с названиями модулей.

Создание стандартного поля

Существуют стандартные поля, которые содержатся почти в каждом модуле, например: Ответственный, Создано, Изменено. Добавим в наш Модуль “MyModule” стандартное поле “Ответственный”. Добавление таких полей происходит следующим образом:

В свойство “table” поля “responsible_field” указываем конкретную таблицу «vtiger_crmentity», которая содержит информацию о том, какое поле было создано, в каком модуле, когда и т.п.

Таблица ‘vtiger_crmentity’ содержит следующие атрибуты

Название столбца Тип в таблице
crmid int(19)
smcreatorid int(19)
smownerid int(19)
modifiedby int(19)
setype varchar(30)
description text
createdtime datetime
modifiedtime datetime
viewedtime datetime
status varchar(50)
version int(19)
presence int(1)
deleted int(1)
label varchar(255)

Важно При создании поля название столбца должно полностью совпадать с названием столбца из таблицы (в нашем случае: $responsible_field->column = 'smownerid';).

Создание поля Дата

Создание поля Дата происходит аналогично примеру создания текстового поля:

Добавление связанного списка к Модулю

Пример связанного списка Модуля (см. рис.4).

Существуют следующие типы связей между модулями:

  • ЗависимыйDependents list – отношение один ко многим (через поле UIType 10). Одна запись текущего модуля может быть связана с несколькими записями другого модуля.
  • СвязанныйRelated list – отношение многие ко многим (без поля UIType 10). Одна запись первого модуля может быть связана с несколькими записями второго модуля и одна запись второго модуля может быть связана с несколькими записями первого модуля.

Типы связей можно просмотреть в таблице “vtiger_relatedlists” в поле “name”.
Для установки связи двух Модулей используется функция:

— название связываемого модуля; — название ссылки на связанный список; - кнопки которые будут показаны в соответствующем окне зависимого списка. По умолчанию вместо кнопок используется “false” - соответствующих кнопок не будет; - функция, осуществляющая связь между Модулями (по умолчанию используется “get_related_list”).

В нашем примере создадим отношение многие ко многим между модулями “MyModule” и “Contacts” – Related list.
Создание объекта типа “Contacts”.

Надпись возле списка.

Установка связи основного Модуля с зависимым Модулем.

Методу setRelatedList в качестве параметров передаются:

  • $contactModule - зависимый Модуль;
  • $relLabel - надпись ссылки, отображаемая в списке зависимых Модулей;
  • Array('ADD', 'SELECT') - кнопки которые будут показаны в соответствующем окне зависимого списка. По умолчанию вместо кнопок используется “false” - соответствующих кнопок не будет;
  • Указывается функция, осуществляющая связь между Модулями. По умолчанию используется функция get_related_list, если не указана другая функция.

Добавление фильтра

Пример фильтра “Все Контакты” (см. рис.5).

Класс Vtiger_Filter предлагает API для работы с модулем в настраиваемом представлении или фильтре. Список записей контролируется с помощью этих фильтров, т.е. при открытии данного модуля будут отображать только те поля, которые были добавлены в фильтр и по этим же полям будет происходить поиск.

Приведенный ниже пример описывает способ настройки фильтра для модуля:

Создание нового фильтра.

Установка фильтра по умолчанию.

Добавление созданного фильтра в Модуль.

Добавление полей в фильтр.

Для добавления полей в фильтр используется метод AddField. В качестве параметров ему передаются: объект поля и необязательное значение порядка (индекс), при котором поле должно появиться в списке.

Для работы нового модуля следует добавить файл в каталоге modules/ / .php. Название файла должно совпадать с названием модуля (н-р: modules/MyModule/MyModule.php). В данном файле должен быть определен главный класс модуля, унаследованный от класса Vtiger_CRMEntity. Кроме того, в нем должны быть определены обязательный свойства приведенные ниже, необходимые для работы модуля.

указывается таблица для поддержки пользовательских полей: указывается с какими таблицами работает данный модуль:

указываются ключевые поля таблиц:

Также нужны файлы локализации, в каталоге languages/, например languages/ru_ru/ .php

Примечание Для локализации названий полей, блоков, а также записей раскрывающихся списков необходимо создать файлы локализации в каталоге "languages", например languages/ru_ru/ .php (код файла представлен ниже) и в каталоге "renamed" надо создать файл .php со следующим содержимым:

Кроме того, можно получить zip-архив, который можно использовать для установки через Менеджер Модулей:

$moduleInstance - экземпляр Модуля для экспорта test/vtlib - каталог, в котором должен быть создан архив модуля MyModule.zip - название архива модуля false - отключение загрузки архива

Теперь можно создать модуль. Для этого необходимо запустить на исполнение написанный php-скрипт. В результате его работы, будет создан новый модуль, и кроме того будет создан архив test/vtlib/MyModule.zip, который можно использовать для инсталляции на других системах через Менеджер Модулей.

Важно После того, как будет создан модуль, необходимо для версии SalesPlatform Vtiger CRM 7 дополнительно создать таблицу "vtiger_mymodule_user_field" при помощи следующего запроса:

Готовый скрипт

В результате у Вас должен создаться Модуль “MyModule” в разделе “Инструменты” (см. рис. 6). У Модуля присутствует связанный список “Контакты” (см. рис.8,9).

Создание get_module

Это специальная функция для всех динамически загружаемых модулей. Посмотрим сначала на создание через макрос ZEND_GET_MODULE :

Реализация функции окружена оператором условной компиляции. Это необходимо, поскольку функция get_module() требуется только тогда, когда ваш модуль построен как динамическое расширение. Специфицируя определение COMPILE_DL_FIRSTMOD в команде компилятору (см. ранее обсуждение инструкций компилятора, необходимых для построения динамического расширения), вы можете инструктировать ваш модуль, намереваетесь вы построить его как динамическое расширение или как встроенный модуль. Если вам нужен встроенный модуль, реализация get_module() просто будет не нужна.

get_module() вызывается Zend во время загрузки модуля. Вы можете представлять её как вызываемую с помощью вызова dl() в вашем скрипте. Её назначение в том, чтобы передать блок информации модуля обратно Zend, чтобы информировать машину о содержимом модуля.

Если вы не реализуете функцию get_module() в вашем динамически загружаемом модуле, Zend выдаст вам сообщение об ошибке при попытке доступа к ней.

Илон Маск рекомендует:  Альтернативный текст и всплывающая подсказка
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL