§¿§ä§Ñ §á§à§ê§Ñ§Ô§à§Ó§Ñ§ñ §Ú§ß§ã§ä§â§å§Ü§è§Ú§ñ §á§à§Ü§Ñ§Ù§í§Ó§Ñ§Ö§ä, §Ü§Ñ§Ü §ã§à§Ù§Õ§Ñ§ä§î §á§â§à§ã§ä§à§Û §Þ§à§Õ§å§Ý§î §Ó§Ö§Ò-§Ú§ß§ä§Ö§â§æ§Ö§Û§ã§Ñ Áú»¢¶Ä²©. §£§í §Þ§à§Ø§Ö§ä§Ö §ã§Ü§Ñ§é§Ñ§ä§î §Ó§ã§Ö §æ§Ñ§Û§Ý§í §ï§ä§à§Ô§à §Þ§à§Õ§å§Ý§ñ §Ó §Ó§Ú§Õ§Ö ZIP-§Ñ§â§ç§Ú§Ó§Ñ: MyAddress.zip.
§³ §á§à§Þ§à§ë§î§ð §ï§ä§à§Û §á§à§ê§Ñ§Ô§à§Ó§à§Û §Ú§ß§ã§ä§â§å§Ü§è§Ú§Ú §Ó§í §ã§ß§Ñ§é§Ñ§Ý§Ñ §ã§à§Ù§Õ§Ñ§Õ§Ú§ä§Ö §Þ§à§Õ§å§Ý§î §Ó§Ö§Ò-§Ú§ß§ä§Ö§â§æ§Ö§Û§ã§Ñ, §Ü§à§ä§à§â§í§Û §Õ§à§Ò§Ñ§Ó§Ý§ñ§Ö§ä §ß§à§Ó§í§Û §â§Ñ§Ù§Õ§Ö§Ý §Þ§Ö§ß§ð §®§à§Û §Ñ§Õ§â§Ö§ã, §Ñ §Ù§Ñ§ä§Ö§Þ §á§â§Ö§à§Ò§â§Ñ§Ù§å§Ö§ä§Ö §Ö§Ô§à §Ó §Ò§à§Ý§Ö§Ö §á§â§à§Õ§Ó§Ú§ß§å§ä§í§Û §Þ§à§Õ§å§Ý§î §Ó§Ö§Ò-§Ú§ß§ä§Ö§â§æ§Ö§Û§ã§Ñ, §Ü§à§ä§à§â§í§Û §à§ä§á§â§Ñ§Ó§Ý§ñ§Ö§ä 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."
}
§´§Ö§á§Ö§â§î §Þ§à§Õ§å§Ý§î §Ù§Ñ§â§Ö§Ô§Ú§ã§ä§â§Ú§â§à§Ó§Ñ§ß §Ó§à §Ó§ß§Ö§ê§ß§Ö§Þ §Ú§ß§ä§Ö§â§æ§Ö§Û§ã§Ö. §°§Õ§ß§Ñ§Ü§à §Ö§Ô§à §á§à§Ü§Ñ §ß§Ö §Ó§Ú§Õ§ß§à, §á§à§ã§Ü§à§Ý§î§Ü§å §Ó§Ñ§Þ §Ö§ë§Ö §ß§å§Ø§ß§à §à§á§â§Ö§Õ§Ö§Ý§Ú§ä§î §æ§å§ß§Ü§è§Ú§à§ß§Ñ§Ý§î§ß§à§ã§ä§î §Þ§à§Õ§å§Ý§ñ. §¬§Ñ§Ü §ä§à§Ý§î§Ü§à §Ó§í §Õ§à§Ò§Ñ§Ó§Ú§ä§Ö §Ü§à§ß§ä§Ö§ß§ä §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô §Þ§à§Õ§å§Ý§ñ, §Ó§í §ã§â§Ñ§Ù§å §å§Ó§Ú§Õ§Ú§ä§Ö §Ú§Ù§Þ§Ö§ß§Ö§ß§Ú§ñ §Ó §Ú§ß§ä§Ö§â§æ§Ö§Û§ã§Ö Áú»¢¶Ä²© §á§à§ã§Ý§Ö §à§Ò§ß§à§Ó§Ý§Ö§ß§Ú§ñ §ã§ä§â§Ñ§ß§Ú§è§í.
§¿§ä§à§ä §æ§Ñ§Û§Ý §â§Ö§Ñ§Ý§Ú§Ù§å§Ö§ä §ß§à§Ó§í§Û §Ü§Ý§Ñ§ã§ã Module, §Ü§à§ä§à§â§í§Û §â§Ñ§ã§ê§Ú§â§ñ§Ö§ä §Ü§Ý§Ñ§ã§ã CModule §á§à §å§Þ§à§Ý§é§Ñ§ß§Ú§ð. §¬§Ý§Ñ§ã§ã Module §Ó§ã§ä§Ñ§Ó§Ú§ä §ß§à§Ó§í§Û §â§Ñ§Ù§Õ§Ö§Ý §Þ§Ö§ß§ð My Address §Ó §Ô§Ý§Ñ§Ó§ß§à§Ö §Þ§Ö§ß§ð.
§®§Ö§ä§à§Õ setAction() §à§á§â§Ö§Õ§Ö§Ý§ñ§Ö§ä §Õ§Ö§Û§ã§ä§Ó§Ú§Ö, §Ü§à§ä§à§â§à§Ö §Ò§å§Õ§Ö§ä §Ó§í§á§à§Ý§ß§Ö§ß§à §á§â§Ú §ß§Ñ§Ø§Ñ§ä§Ú§Ú §ß§Ñ §â§Ñ§Ù§Õ§Ö§Ý §Þ§Ö§ß§ð. §¥§Ý§ñ §ß§Ñ§é§Ñ§Ý§Ñ §Ó§í §Þ§à§Ø§Ö§ä§Ö §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ä§î §á§â§Ö§Õ§à§á§â§Ö§Õ§Ö§Ý§Ö§ß§ß§à§Ö §Õ§Ö§Û§ã§ä§Ó§Ú§Ö userprofile.edit, §Ü§à§ä§à§â§à§Ö §à§ä§Ü§â§à§Ö§ä §ã§ä§â§Ñ§ß§Ú§è§å §±§â§à§æ§Ú§Ý§î §á§à§Ý§î§Ù§à§Ó§Ñ§ä§Ö§Ý§ñ. §£ §é§Ñ§ã§ä§Ú 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'
(§à§ä§Ü§â§í§Ó§Ñ§Ö§ä §®§à§ß§Ú§ä§à§â§Ú§ß§Ô ¡ú §±§â§à§Ò§Ý§Ö§Þ§í) §Ú§Ý§Ú '§à§ä§é§Ö§ä .status'
(§à§ä§Ü§â§í§Ó§Ñ§Ö§ä §à§ä§é§Ö§ä §ª§ß§æ§à§â§Þ§Ñ§è§Ú§ñ §à §ã§Ú§ã§ä§Ö§Þ§Ö).
§£ §ï§ä§à§Û §é§Ñ§ã§ä§Ú §Ó§í §á§Ö§â§Ö§Þ§Ö§ã§ä§Ú§ä§Ö §â§Ñ§Ù§Õ§Ö§Ý §Þ§Ö§ß§ð §®§à§Û §Ñ§Õ§â§Ö§ã §Ó §â§Ñ§Ù§Õ§Ö§Ý §®§à§ß§Ú§ä§à§â§Ú§ß§Ô, §Ñ §Ù§Ñ§ä§Ö§Þ §Õ§à§Ò§Ñ§Ó§Ú§ä§Ö §Ó §ß§Ö§Ô§à §Ó§Ý§à§Ø§Ö§ß§ß§à§Ö §Þ§Ö§ß§ð. §£ §â§Ö§Ù§å§Ý§î§ä§Ñ§ä§Ö §á§à§Ý§î§Ù§à§Ó§Ñ§ä§Ö§Ý§Ú §ã§Þ§à§Ô§å§ä §á§à§Ý§å§é§Ú§ä§î §Õ§à§ã§ä§å§á §Ü §Õ§Ó§å§Þ §ã§ä§â§Ñ§ß§Ú§è§Ñ§Þ §á§à§Õ§Þ§Ö§ß§ð §Ú§Ù §â§Ñ§Ù§Õ§Ö§Ý§Ñ §Þ§Ö§ß§ð §®§à§ß§Ú§ä§à§â§Ú§ß§Ô ¡ú §®§à§Û §Ñ§Õ§â§Ö§ã.
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')
->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
);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"
}
}
}