§°§Ó§à ?§Ö §Ó§à§Õ§Ú§é §Ü§à§â§Ñ§Ü §á§à §Ü§à§â§Ñ§Ü §Ü§à?§Ú §á§à§Ü§Ñ§Ù§å?§Ö §Ü§Ñ§Ü§à §Õ§Ñ §ß§Ñ§á§â§Ñ§Ó§Ú§ä§Ö ?§Ö§Õ§ß§à§ã§ä§Ñ§Ó§Ñ§ß Áú»¢¶Ä²© §Ü§à§â§Ú§ã§ß§Ú§é§Ü§Ú §Ú§ß§ä§Ö§â§æ§Ö?§ã §Þ§à§Õ§å§Ý.§³§Ó§Ö §Õ§Ñ§ä§à§ä§Ö§Ü§Ö §à§Ó§à§Ô §Þ§à§Õ§å§Ý§Ñ §Þ§à§Ø§Ö§ä§Ö §á§â§Ö§å§Ù§Ö§ä§Ú §Ü§Ñ§à ZIP §Ñ§â§ç§Ú§Ó§å: MyAddress.zip.
§´§à§Ü§à§Þ §à§Ó§à§Ô §Ó§à§Õ§Ú§é§Ñ, §á§â§Ó§à ?§Ö§ä§Ö §Ü§â§Ö§Ú§â§Ñ§ä§Ú §Þ§à§Õ§å§Ý §Ü§à§â§Ú§ã§ß§Ú§é§Ü§Ú §Ú§ß§ä§Ö§â§æ§Ö?§ã§Ñ §Ü§à?§Ú §Õ§à§Õ§Ñ?§Ö §ß§à§Ó§Ú §à§Õ§Ö?§Ñ§Ü §Þ§Ö§ß§Ú?§Ñ §®§à?§Ñ §Ñ§Õ§â§Ö§ã§Ñ§Ñ §Ù§Ñ§ä§Ú§Þ §Ô§Ñ §Ü§à§ß§Ó§Ö§â§ä§å?§ä§Ö §å more advanced §Þ§à§Õ§å§Ý §Ü§à§â§Ú§ã§ß§Ú§é§Ü§à§Ô §Ú§ß§ä§Ö§â§æ§Ö?§ã§Ñ §Ü§à?§Ú §á§à§ã§ä§Ñ§Ó?§Ñ HTTP §Ù§Ñ§ç§ä§Ö§Ó §ß§Ñ https://api.seeip.org §Ú §á§â§Ú§Ü§Ñ§Ù§å?§Ö §à§Õ§Ô§à§Ó§à§â - IP §Ñ§Õ§â§Ö§ã§å §Ó§Ñ§ê§Ö§Ô §â§Ñ§é§å§ß§Ñ§â§Ñ - §ß§Ñ §ß§à§Ó§à? §ã§ä§â§Ñ§ß§Ú§è§Ú §å §ß§à§Ó§à§Ü§â§Ö§Ú§â§Ñ§ß§à§Þ §à§Õ§Ö?§Ü§å §Þ§Ö§ß§Ú?§Ñ §®§à?§Ñ §Ñ§Õ§â§Ö§ã§Ñ.§¦§Ó§à §Ü§Ñ§Ü§à ?§Ö §Ô§à§ä§à§Ó §Þ§à§Õ§å§Ý §Ú§Ù§Ô§Ý§Ö§Õ§Ñ§ä§Ú:
§¬§â§Ö§Ú§â§Ñ?§ä§Ö §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ MyAddress §å modules §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ§å §Ó§Ñ§ê§Ö Áú»¢¶Ä²© §Ú§ß§ã§ä§Ñ§Ý§Ñ§è§Ú?§Ö §Ü§à§â§Ú§ã§ß§Ú§é§Ü§à§Ô §Ú§ß§ä§Ö§â§æ§Ö?§ã§Ñ (§ß§Ñ §á§â§Ú§Þ§Ö§â, zabbix/ui/modules).
§¯§Ñ§á§â§Ñ§Ó§Ú§ä§Ö §Õ§Ñ§ä§à§ä§Ö§Ü§å manifest.json §ã§Ñ §à§ã§ß§à§Ó§ß§Ú§Þ §Þ§Ö§ä§Ñ§á§à§Õ§Ñ§è§Ú§Þ§Ñ §Þ§à§Õ§å§Ý§Ñ (§á§à§Ô§Ý§Ö§Õ§Ñ?§ä§Ö §à§á§Ú§ã §á§à§Õ§â§Ø§Ñ§ß§Ú§ç §á§Ñ§â§Ñ§Þ§Ö§ä§Ñ§â§Ñ).
ui/modules/MyAddress/manifest.json
{
"manifest_version": 2.0,
"id": "my-address",
"name": "My IP Address",
"version": "1.0",
"namespace": "MyAddress",
"description": "My External IP Address."
}
§®§à§Õ§å§Ý ?§Ö §ã§Ñ§Õ§Ñ §â§Ö§Ô§Ú§ã§ä§â§à§Ó§Ñ§ß §ß§Ñ §Ü§à§â§Ú§ã§ß§Ú§é§Ü§à§Þ §Ú§ß§ä§Ö§â§æ§Ö?§ã§å. §®§Ö?§å§ä§Ú§Þ, ?§à§ê §å§Ó§Ö§Ü §ß§Ú?§Ö §Ó§Ú§Õ?§Ú§Ó, ?§Ö§â ?§à§ê §å§Ó§Ö§Ü §ä§â§Ö§Ò§Ñ §Õ§Ñ §Õ§Ö§æ§Ú§ß§Ú§ê§Ö§ä§Ö §æ§å§ß§Ü§è§Ú§à§ß§Ñ§Ý§ß§à§ã§ä §Þ§à§Õ§å§Ý§Ñ. §¬§Ñ§Õ§Ñ §Õ§à§Õ§Ñ§ä§Ö §ã§Ñ§Õ§â§Ø§Ñ? §å §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ §Þ§à§Õ§å§Ý§Ñ, §à§Õ§Þ§Ñ§ç ?§Ö§ä§Ö §Ó§Ú§Õ§Ö§ä§Ú §á§â§à§Þ§Ö§ß§Ö §å Áú»¢¶Ä²© §Ü§à§â§Ú§ã§ß§Ú§é§Ü§à§Þ §Ú§ß§ä§Ö§â§æ§Ö?§ã§å §ß§Ñ§Ü§à§ß §à§ã§Ó§Ö§Ø§Ñ§Ó§Ñ?§Ñ §ã§ä§â§Ñ§ß§Ú§è§Ö.
§°§Ó§Ñ §Õ§Ñ§ä§à§ä§Ö§Ü§Ñ §Ú§Þ§á§Ý§Ö§Þ§Ö§ß§ä§Ú§â§Ñ §ß§à§Ó§å §Ü§Ý§Ñ§ã§å §®§à»å³Ü±ô±ð §Ü§à?§Ñ §á§â§à§ê§Ú§â§å?§Ö §á§à§Õ§â§Ñ§Ù§å§Þ§Ö§Ó§Ñ§ß§å §Ü§Ý§Ñ§ã§å CModule. §¬§Ý§Ñ§ã§Ñ Module ?§Ö §å§Þ§Ö§ä§ß§å§ä§Ú §ß§à§Ó§Ú §à§Õ§Ö?§Ñ§Ü §Þ§Ö§ß§Ú?§Ñ My Adress §å §Ô§Ý§Ñ§Ó§ß§Ú §Þ§Ö§ß§Ú.
§®§Ö§ä§à§Õ§Ñ setAction() §ã§á§Ö§è§Ú§æ§Ú§è§Ú§â§Ñ §â§Ñ§Õ?§å §Ü§à?§Ñ ?§Ö §ã§Ö §Ú§Ù§Ó§â§ê§Ú§ä§Ú §ß§Ñ§Ü§à§ß §Ü§Ý§Ú§Ü§Ñ §ß§Ñ §à§Õ§Ö?§Ñ§Ü §Þ§Ö§ß§Ú?§Ñ. §©§Ñ §á§à§é§Ö§ä§Ñ§Ü, §Þ§à§Ø§Ö§ä§Ö §Ü§à§â§Ú§ã§ä§Ú§ä§Ú §å§ß§Ñ§á§â§Ö§Õ §Õ§Ö§æ§Ú§ß§Ú§ã§Ñ§ß§å §Ñ§Ü§è§Ú?§å userprofile.edit, §Ü§à?§Ñ ?§Ö §à§ä§Ó§à§â§Ú§ä§Ú §ã§ä§â§Ñ§ß§Ú§è§å §¬§à§â§Ú§ã§ß§Ú§é§Ü§Ú §á§â§à§æ§Ú§Ý. §µ part III §à§Ó§à§Ô §å§á§å§ä§ã§ä§Ó§Ñ, §ß§Ñ§å§é§Ú?§Ö§ä§Ö §Ü§Ñ§Ü§à §Õ§Ñ §Ü§â§Ö§Ú§â§Ñ§ä§Ö §á§â§Ú§Ý§Ñ§Ô§à?§Ö§ß§å §â§Ñ§Õ?§å.
ui/modules/MyAddress/Module.php
<?php
namespace Modules\MyAddress;
use Áú»¢¶Ä²©\Core\CModule,
APP,
CMenuItem;
class Module extends CModule {
public function init(): void {
APP::Component()->get('menu.main')
->add((new CMenuItem(_('My Address')))
->setAction('userprofile.edit'));
}
}
§®§à§Ø§Ö§ä§Ö §Õ§Ñ §Ù§Ñ§Þ§Ö§ß§Ú§ä§Ö 'userprofile.edit'
§ã§Ñ §Õ§â§å§Ô§Ú§Þ §â§Ñ§Õ?§Ñ§Þ§Ñ, §ß§Ñ §á§â§Ú§Þ§Ö§â, 'charts.view'
(§à§ä§Ó§Ñ§â§Ñ §á§â§Ú§Ý§Ñ§Ô§à?§Ö§ß§Ö §Ô§â§Ñ§æ§Ú§Ü§à§ß§Ö), 'problems.view'
(§à§ä§Ó§Ñ§â§Ñ §®§à§ß§Ú§ä§à§â§Ú§ß§Ô ¡ú §±§â§à§Ò§Ý§Ö§Þ§Ú) §Ú§Ý§Ú 'report.status'
(§à§ä§Ó§Ñ§â§Ñ §Ú§Ù§Ó§Ö§ê§ä§Ñ? §ª§ß§æ§à§â§Þ§Ñ§è§Ú?§Ö §à §ã§Ú§ã§ä§Ö§Þ§å).
§µ §à§Ó§à§Þ §Õ§Ö§Ý§å ?§Ö§ä§Ö §á§â§Ö§Þ§Ö§ã§ä§Ú§ä§Ú §à§Õ§Ö?§Ñ§Ü §Þ§Ö§ß§Ú?§Ñ §®§à?§Ñ §Ñ§Õ§â§Ö§ã§Ñ §å §à§Õ§Ö?§Ñ§Ü §¯§Ñ§Õ§Ô§Ý§Ö§Õ§Ñ?§Ö §Ú §Ù§Ñ§ä§Ú§Þ §Þ§å §Õ§à§Õ§Ñ§ä§Ú §å§Ô§ß§Ö§Ø?§Ö§ß§Ú §Þ§Ö§ß§Ú. §¬§Ñ§à §â§Ö§Ù§å§Ý§ä§Ñ§ä §ä§à§Ô§Ñ, §Ü§à§â§Ú§ã§ß§Ú§è§Ú ?§Ö §Þ§à?§Ú §Õ§Ñ §á§â§Ú§ã§ä§å§á§Ö §Õ§Ó§Ö§Þ§Ñ §ã§ä§â§Ñ§ß§Ú§è§Ñ§Þ§Ñ §á§à§Õ§Þ§Ö§ß§Ú?§Ñ §Ú§Ù §à§Õ§Ö?§Ü§Ñ §Þ§Ö§ß§Ú?§Ñ §¯§Ñ§Õ§Ô§Ý§Ö§Õ§Ñ?§Ö ¡ú §®§à?§Ñ §Ñ§Õ§â§Ö§ã§Ñ.
ui/modules/MyAddress/Module.php
<?php
§Ú§Þ§Ö§ß§ã§Ü§Ú §á§â§à§ã§ä§à§â Modules\MyAdress;
§Ü§à§â§Ú§ã§ä§Ú§ä§Ö Áú»¢¶Ä²©\Core\CModule,
APP,
CMenuItem;
class Module extends CModule {
public function init(): void {
APP::Component()->get('menu.main')
->findOrAdd(_('Monitoring'))
->getSubmenu()
->insertAfter(_('Discovery'),
(new CMenuItem(_('My Address')))->setAction('userprofile.edit')
);
}
}
§°§Ó§Ñ? §Ü§à§â§Ñ§Ü §Ü§â§Ö§Ú§â§Ñ §Õ§Ó§Ñ §á§à§Õ§à§Õ§Ö?§Ü§Ñ:
§ª§Þ§Ñ?§ä§Ö §ß§Ñ §å§Þ§å §Õ§Ñ §Ù§Ñ §å§Ô§ß§Ö§Ø§Õ§Ö§ß§Ú §Þ§Ö§ß§Ú §Þ§à§â§Ñ§ä§Ö §Õ§Ñ §Ü§à§â§Ú§ã§ä§Ú§ä§Ö §Ü§Ý§Ñ§ã§å CMenu §á§à§â§Ö§Õ §Ü§Ý§Ñ§ã§Ñ §Ü§à§â§Ú§ê?§Ö§ß§Ú§ç §å §á§â§Ö§ä§ç§à§Õ§ß§Ú§Þ §Ü§à§â§Ñ§è§Ú§Þ§Ñ.
ui/modules/MyAddress/Module.php
<?php
namespace Modules\MyAddress;
use Áú»¢¶Ä²©\Core\CModule,
APP,
CMenu,
CMenuItem;
class Module extends CModule
{public function init(): void {
APP::Component()->get('menu.main')
->findOrAdd(_('Monitoring'))
->getSubmenu()
->insertAfter(_('Discovery'),
(new CMenuItem(_('My Address')))->setSubMenu(
new CMenu([
(new CMenuItem(_('External IP')))->setAction('my.address'),
(new CMenuItem(_('User profile')))->setAction('userprofile.edit')
])
)
);
}
}
§¡§Ü§è§Ú?§Ñ ?§Ö §Ú§Þ§á§Ý§Ö§Þ§Ö§ß§ä§Ú§â§Ñ§ß§Ñ §å §Õ§Ó§Ñ §æ§Ñ?§Ý§Ñ - actions/MyAddress.php §Ú views/my.address.php. §¥§Ñ§ä§à§ä§Ö§Ü§Ñ actions/MyAddress.php §Ò§â§Ú§ß§Ö §à §Ú§Þ§á§Ý§Ö§Þ§Ö§ß§ä§Ñ§è§Ú?§Ú §á§à§ã§Ý§à§Ó§ß§Ö §Ý§à§Ô§Ú§Ü§Ö, §Õ§à§Ü ?§Ö §Õ§Ñ§ä§à§ä§Ö§Ü§Ñ views/my.address.php §à§Õ§Ô§à§Ó§à§â§ß§Ñ §Ù§Ñ §á§â§Ú§Ü§Ñ§Ù.
§¬§â§Ö§Ú§â§Ñ?§ä§Ö §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ actions §å §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ§å MyAddress.
§¬§â§Ö§Ú§â§Ñ?§ä§Ö §Õ§Ñ§ä§à§ä§Ö§Ü§å MyAddress.php §å §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ§å actions.
§§à§Ô§Ú§Ü§Ñ §Ñ§Ü§è§Ú?§Ö ?§Ö §Ò§Ú§ä§Ú §Õ§Ö§æ§Ú§ß§Ú§ã§Ñ§ß§Ñ §å §Ü§Ý§Ñ§ã§Ú MyAddress. §°§Ó§Ñ §Ü§Ý§Ñ§ã§Ñ §â§Ñ§Õ?§Ö ?§Ö §Ú§Þ§á§Ý§Ö§Þ§Ö§ß§ä§Ú§â§Ñ§ä§Ú §é§Ö§ä§Ú§â§Ú §æ§å§ß§Ü§è§Ú?§Ö: init(), checkInput(), checkPermissions() §Ú doAction(). Áú»¢¶Ä²© §Ü§à§â§Ú§è§ß§Ú§é§Ü§Ú §Ú§ß§ä§Ö§â§æ§Ö?§ã §á§à§Ù§Ú§Ó§Ñ §æ§å§ß§Ü§è§Ú?§å doAction() §Ü§Ñ§Õ§Ñ §ã§Ö §Ù§Ñ§ç§ä§Ö§Ó§Ñ §Ñ§Ü§è§Ú?§Ñ. §°§Ó§Ñ §æ§å§ß§Ü§è§Ú?§Ñ ?§Ö §à§Õ§Ô§à§Ó§à§â§ß§Ñ §Ù§Ñ §á§à§ã§Ý§à§Ó§ß§å §Ý§à§Ô§Ú§Ü§å §Þ§à§Õ§å§Ý§Ñ.
§±§à§Õ§Ñ§è§Ú §Þ§à§â§Ñ?§å §Ò§Ú§ä§Ú §à§â§Ô§Ñ§ß§Ú§Ù§à§Ó§Ñ§ß§Ú §Ü§Ñ§à §Ñ§ã§à§è§Ú?§Ñ§ä§Ú§Ó§ß§Ú §ß§Ú§Ù. §¯§Ú§Ù §Þ§à§Ø§Ö §Ò§Ú§ä§Ú §Ó§Ú§ê§Ö§Õ§Ú§Þ§Ö§ß§Ù§Ú§à§ß§Ñ§Ý§Ñ§ß §Ú §Þ§à§Ø§Ö §ã§Ñ§Õ§â§Ø§Ñ§ä§Ú §ã§Ó§Ö §á§à§Õ§Ñ§ä§Ü§Ö §Ü§à?§Ö §à§é§Ö§Ü§å?§Ö §á§â§Ú§Ü§Ñ§Ù.
ui/modules/MyAddress/actions/MyAddress.php
<?php
namespace Modules\MyAddress\Actions;
use CController,
CControllerResponseData;
class MyAddress extends CController {
public function init(): void {
$this->disableCsrfValidation();}
protected function checkInput(): bool {
return true;
}
protected function checkPermissions(): bool {
return true;
}
protected function doAction(): void {
$data = ['my-ip' => file_get_contents("https://api.seeip.org")];
$response = new CControllerResponseData($data);
$this->setResponse($response);
}
}
§¬§â§Ö§Ú§â§Ñ?§ä§Ö §ß§à§Ó§Ú §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ views §å §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ§å MyAddress.
§¬§â§Ö§Ú§â§Ñ?§ä§Ö §Õ§Ñ§ä§à§ä§Ö§Ü§å my.address.php §å §Õ§Ú§â§Ö§Ü§ä§à§â§Ú?§å§Þ§å views §Ú §Õ§Ö§æ§Ú§ß§Ú§ê§Ú§ä§Ö §á§â§Ú§Ü§Ñ§Ù §Þ§à§Õ§å§Ý§Ñ.
§ª§Þ§Ñ?§ä§Ö §ß§Ñ §å§Þ§å §Õ§Ñ ?§Ö §á§â§à§Þ§Ö§ß?§Ú§Ó§Ñ $data
§Õ§à§ã§ä§å§á§ß§Ñ §å §á§â§Ú§Ü§Ñ§Ù§å §Ò§Ö§Ù §á§à§ã§Ö§Ò§ß§à§Ô §Õ§Ö§æ§Ú§ß§Ú§ã§Ñ?§Ñ. §°§Ü§Ó§Ú§â §Ñ§å§ä§à§Þ§Ñ§ä§ã§Ü§Ú §á§â§à§ã§Ý§Ö?§å?§Ö §Ñ§ã§à§è§Ú?§Ñ§ä§Ú§Ó§ß§Ú §ß§Ú§Ù §å §á§â§Ú§Ü§Ñ§Ù.
ui/modules/MyAddress/views/my.address.php
<?php
(new CHtmlPage())
->setTitle(_('The HTML Title of My Address Page'))
->addItem(new CDiv($data['my-ip']))
->show();
my.address
);§®²â´¡»å»å°ù±ð²õ²õ
) §Ü§Ñ§à §Ó§â§Ö§Õ§ß§à§ã§ä §Ù§Ñ §Ü?§å§é class
§à§Ò?§Ö§Ü§ä§Ñ my.address
;my.address
) §Ü§Ñ§à §Ó§â§Ö§Õ§ß§à§ã§ä §Ù§Ñ §Ü?§å§é view
§à§Ò?§Ö§Ü§ä§Ñ my.address
.ui/modules/MyAddress/manifest.json
{
"manifest_version": 2.0,
"id": "my-address",
"name": "My IP Address",
"version": "1.0",
"namespace": "MyAddress",
"description": "My External IP Address.",
"actions": {
"my.address": {
"class": "MyAddress",
"view": "my.address"
}
}
}