| Интерфейс пользователя в плагинах (UI) |
| Написал Kotofeich | |
| 22.08.2007 | |
|
Сам компонент CommunityBuilder comProfiler обеспечивает пользовательский интерфейс (UI) для программных расширений. Различные варианты отображения интерфейса пользователя создаются довольно просто. Более детально они будут описаны в этой главе. Меню CommunityBuilder обеспечивает единый интерфейс для меню (хотя это может быть выключено администратором). Администратор может выбрать между панелью меню и списком меню. CommunityBuilder предусматривает только один уровень подменю, но в будущем планируется создать множество уровней.Есть отдельный обьект вкладок, который вызывается плагинами через зарегистрированные меню:
/**
* При вызове профиля пользователя генерирует меню и показывает статус пользователя back $this->addMenu * @param object вкладка записанная в БД * @param object mosUser показывает пользователя на экране * @param int 1 для фронт-енда, 2 для бак-енда * @returns boolean : истана, или ложь если есть сообщение ErrorMSG */ function getMenuAndStatus($tab,$user,$ui) { } Плагины могут добавлять свои собственные элементы меню, используя следующий код:
/**
* Регистрирует меню или статус в определенном положении * @param array элементы меню: // Пример: $mi = array(); $mi["_UE_MENU_CONNECTIONS"]["duplique"]=null; $this->addMenu( array( "position" => "menuBar" , // "menuBar", "menuList" "arrayPos" => $mi , "caption" => _UE_MENU_MANAGEMYCONNECTIONS , "url" => sefRelToAbs($ue_manageConnection_url) , // также может быть "<a ....>" или "javascript:void(0)" или "" "target" => "" , // например: "_blank" "img" => null , // например: "<img src='plugins/user/myplugin/images/icon.gif' width='16' height='16' alt='' />" "alt" => null , // например: "text" "tooltip" => _UE_MENU_MANAGEMYCONNECTIONS_DESC , "keystroke" => null ) ); // e.g. "P" // Пример использования: $mi = array(); $mi["_UE_MENU_STATUS"]["_UE_MEMBERSINCE"]["dupl"]=null; $dat = cbFormatDate($user->registerDate); if (!$dat) $dat="?"; $this->addMenu( array( "position" => "menuList" , // "menuBar", "menuList" "arrayPos" => $mi , "caption" => $dat , "url" => "" , // также может быть "<a ....>" или "javascript:void(0)" или "" "target" => "" , // например: "_blank" "img" => null , // например: "<img src='plugins/user/myplugin/images/icon.gif' width='16' height='16' alt='' />" "alt" => null , // например: "text" "tooltip" => _UE_MEMBERSINCE_DESC , "keystroke" => null ) ); // например: "P" */ function addMenu( $menuItem ) Элементы меню автоматически сортируются по имени. В качестве примера, добавим меню в PMS, если пользователь смотрит свой профиль:
global $my;
if ($my->id!=$user->id && $my->id > 0) { $pmsurl=... $mi = array(); $mi["_UE_MENU_MESSAGES"]["_UE_PM_USER"]=null; $this->menuBar->addObjectItem($mi,_UE_PM_USER,sefRelToAbs($pmsurl), "", "","", _UE_MENU_PM_USER_DESC,""); } Очень важно для SEF-совместимости вызывать - для всех внутренних ссылок - функцию sefRelToAbs. Отображение статуса Отображение статуса подобно меню. Для этого используется тот же самый API CB: Пример:
if ($sbConfig['showranking'] && ($params->get('statRanking', '1') == 1) && sbUserDetails !== false))
{ $mi = array(); $mi["_UE_MENU_STATUS"][$params->get('statRankingText',"_UE_FORUM_FORUMRANKING")]["_UE_FORUM_FORUMRANKING"]=null; $this->addMenu( array("position" => "menuList" , // "menuBar", "menuList" "arrayPos" => $mi , "caption" => $sbUserDetails->msg_userrank.($params->get('statRankingImg','1')==1 ? $sbUserDetails->msg_userrankimg : "") , "url" => "" , // может также быть "<a ....>" или "javascript:void(0)" или "" "target" => "" , // например: "_blank" "img" => null , // например: "<img src='plugins/user/myplugin/images/icon.gif' width='16' height='16' alt='' />" "alt" => null , // например: "text" "tooltip" => "") ); } Формы Формы в плагинах должны быть закодированы, используя специальный код CB, так, чтобы данные формы в плагине возвратились к тому же плагину. На данный момент, формы работают только в профилях. Данные формы можно отправить, используя методы GET или POST в HTTP. Параметры должны иметь префикс с названием плагина так, чтобы множество плагинов не приняли параметры с один и тем же названием. (например, "поиск" станет "simpleboardtabsearch"). Все параметры - когда получены через GET, - правильно поддерживаются SEF. Готовый пример для форм - плагин JoomlaBoard/SimpleBoard (вкладка профиля). В нем это используется для поиска, нумерации страниц и сортирующих функций. Поддержка ссылок Для нормальной поддержка SEF, все ссылки должны генерироваться строчными буквами. Ссылки, используемые в плагине должны всегда генерироваться, используя следующую функцию CommunityBuilder:
/**
* дает ссылку с параметрами плагина. * @param array строка с параметрами * @param string cb task (задает задачу на что ссылаться, по-умолчанию userProfile) * @param boolean Истина для вызова черезl sefRelToAbs (по-умолчанию), ЛОЖЬ чтобы избежать SEF * @param array строка параметров, которые надо исключить * @return string значения параметров */ function _getAbsURLwithParam($paramArray, $task="userProfile", $sefed=true, $excludeParamList=array()) Переданные параметры могут быть получены с помощью следующей функции CommunityBuilder:
/**
* возвращает ESCAPED и urldecoded параметры для плагина * @param строка - имя параметра в url * @param строка - значение по-умолчанию для параметров в url, если значение не найдено * @param постфикс pagings/search/sorts (выборочноl) * @return строка значений параметра */ function _getReqParam($name, $def=null, $postfix="") Желательно, чтобы разработчик плагинов всегда учитывал работу с магическими кавычками в php. Следующая функция дает возможность получения имен параметров с префиксом, переданных через GET/POST
/**
* возвращает имя параметра для поиска и других функций * @param строка - имя функции * @param строка постфикс pagings/search/sorts (выборочноl) * @returns строка - имя параметра */ function _getPagingParamName($name="search", $postfix="") Для примера, покажем вкладку PMS:
if (isset($_POST[$this->_getPagingSearchName("sndnewmsg")]) && $_POST[$this-
>_getPagingSearchName("sndnewmsg")] == _UE_PM_SENDMESSAGE) { $sender = $this->_getReqParam("sender", null); $recip = $this->_getReqParam("recip", null); if ($sender && $recip) { $newsub = htmlentities($this->_getReqParam("newsub", null)); //urldecode в _getReqParam $newmsg = htmlentities($this->_getReqParam("newmsg", null)); //исключить html код
Настоятельно рекомендуем проверять ваши формы на защищенность от sql-иньекций.
/**
* дает ссылку с параметрами плагина * @param массив строковой с имена параметров * @param строка cb task (выбор задачи, по умолчанию: userProfile) * @param булев Истина для вызоваl sefRelToAbs (по-умолчанию), ЛОЖЬ если не собираетесь поддерживать SEF * @param массив строковой исключенных параметров * @return строка - итог с параметрами */ function _getAbsURLwithParam($paramArray, $task="userProfile", $sefed=true, $excludeParamList=array()) Пример использования во вкладке PMS:
$base_url = $this->_getAbsURLwithParam(array());
$ret .= '<form method="post" action="'.$base_url.'">'; ... $ret .= '<input type="text" name="'.$this->_getPagingSearchName("newsub") .'" size="'.$width.'" value="'.$newsub.'" class="inputbox" /> ...
|
| < Пред. |
|---|







