Кнопка "вставить пользователя" в стандартном редакторе
Возможность вставить ссылку на профиль пользователя в тело топика.
Для начала надо добавить кнопку в щаблон добавления топика:
Файл /templates/skin/new/actions/actionTopic/add.tpl строка 100
… и подключить шаблон окна выбора пользователя:
Шаблон окна выбора пользователя:
Создать файл /templates/skin/new/window_add_user.tpl
Добавить js-функции для поиска пользователей:
/templates/skin/new/js/other.js
AJAX-Обработчик:
Создать файл /include/ajax/insertUser.php
Вставка тега user в текст:
Файл /templates/skin/new/js/panel.js
Тут надо добавить метод insertUser:
Правила фильтрации тэгов:
Файл /classes/modules/sys_text/Text.class.php
В разрешенные теги добавить тег «user».
Добавить метод userParser
и его вызов в методе Parser:
В css для красоты:
Должно получиться вот так:
В итоге все теги вида
UPD:
Если необходима проверка на присутствие пользователя в базе, то функция парсера примет вид:
Файл /classes/modules/sys_text/Text.class.php
Для начала надо добавить кнопку в щаблон добавления топика:
Файл /templates/skin/new/actions/actionTopic/add.tpl строка 100
<a href="#" onclick="showUserForm(); return false;" class="button">
<img src="{$DIR_STATIC_SKIN}/images/panel/user.png" width="16" height="16" title="{$aLang.panel_user}">
</a>
… и подключить шаблон окна выбора пользователя:
{include file='window_add_user.tpl' sToLoad='topic_text'}
Шаблон окна выбора пользователя:
Создать файл /templates/skin/new/window_add_user.tpl
<div style="display: none;">
<div class="login-popup upload-image" id="winUserAdd">
<div class="login-popup-top"><a href="#" class="close-block" onclick="return false;"></a></div>
<div class="content">
<form method="POST" action="" enctype="multipart/form-data" id="form_user_insert" >
<h3>{$aLang.insertuser}</h3>
<p><label for="username">{$aLang.insertuser_username}:</label><br /><input type="text" name="username" value="" class="w100p"/></p>
<p>
<input type="button" value="{$aLang.insertuser_find}" onclick="ajaxFindUsers(this.form.username.value);">
<a href="#" onclick="return ajaxGetFriends();">{$aLang.insertuser_friends}</a>
</p>
<div style="display:none;" id="insertuser_results"><label for="userlist">{$aLang.insertuser_users}:</label><br />
<select name="userlist" id="userlist" class="w50p ld" size="10">
</select>
<div class="w50p rd" style="background:#fff; height:160px;" id="userPreview">
</div>
<div class="br"></div>
</div>
<p style="margin-top:20px;">
<input type="button" value="{$aLang.insertuser_submit}" onclick="lsPanel.insertUser('topic_text',this.form.userlist.value); return false;">
<input type="button" value="{$aLang.insertuser_cancel}" onclick="hideUserForm(); return false;">
</p>
</form>
</div>
<div class="login-popup-bottom"></div>
</div>
</div>
Добавить js-функции для поиска пользователей:
/templates/skin/new/js/other.js
function showUserForm() {
if (Browser.Engine.trident) {
//return true;
}
if (!winUserAdd) {
winUserAdd=new StickyWin.Modal({content: $('winUserAdd'), closeClassName: 'close-block', useIframeShim: false});
}
winUserAdd.show();
winUserAdd.pin(true);
return false;
}
function hideUserForm() {
winUserAdd.hide();
}
var winUserAdd;
function ajaxFindUsers(search){
var req = new JsHttpRequest();
$('userlist').set('html','');
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (req.responseJS.bStateError) {
msgErrorBox.alert(req.responseJS.sMsgTitle,req.responseJS.sMsg);
} else {
req.responseJS.found.each(function(item, index){
$('userlist').set('html','<option>'+item+'</option>');
});
$('insertuser_results').show();
$('userlist').addEvent('change',ajaxGetUserInfo);
}
}
}
req.open(null, DIR_WEB_ROOT+'/include/ajax/insertUser.php', true);
req.send( { search:search } );
return false;
}
function ajaxGetFriends(){
var req = new JsHttpRequest();
$('userlist').set('html','');
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (req.responseJS.bStateError) {
msgErrorBox.alert(req.responseJS.sMsgTitle,req.responseJS.sMsg);
} else {
req.responseJS.found.each(function(item, index){
$('userlist').set('html','<option value="'+item+'">'+item+'</option>');
});
$('insertuser_results').show();
$('userlist').addEvent('change',ajaxGetUserInfo);
}
}
}
req.open(null, DIR_WEB_ROOT+'/include/ajax/insertUser.php', true);
req.send( { task: 'getFriends' } );
return false;
}
function ajaxGetUserInfo(){
var req = new JsHttpRequest();
var login = $('userlist').get('value');
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (req.responseJS.bStateError) {
msgErrorBox.alert(req.responseJS.sMsgTitle,req.responseJS.sMsg);
} else {
$('userPreview').set('html',req.responseText);
}
}
}
req.open(null, DIR_WEB_ROOT+'/include/ajax/insertUser.php', true);
req.send( { task: 'getInfo',search: login } );
return false;
}
AJAX-Обработчик:
Создать файл /include/ajax/insertUser.php
<?
set_include_path(get_include_path().PATH_SEPARATOR.dirname(dirname(dirname(__FILE__))));
$sDirRoot=dirname(dirname(dirname(__FILE__)));
require_once($sDirRoot."/config/config.ajax.php");
$found = array();
$bStateError=true;
$sText='';
$sMsg=$oEngine->Lang_Get('system_error');
$sMsgTitle=$oEngine->Lang_Get('error');
$task = @$_REQUEST['task'];
$search = @$_REQUEST['search'];
if ($oEngine->User_IsAuthorization()) {
switch($task){
case 'getFriends':
$oUserCurrent=$oEngine->User_GetUserCurrent();
$friendList = $oUserCurrent->User_GetUsersFrend($oUserCurrent->getId());
if(count($friendList)>0){
foreach($friendList AS $friend){
$found[] = $friend->getLogin();
}
$bStateError=false;
$sMsgTitle='';
$sMsg='';
}else{
$sMsgTitle=$oEngine->Lang_Get('error');
$sMsg=$oEngine->Lang_Get('friends_empty');
}
break;
case 'getInfo':
if(strlen($search)<3){
$sMsgTitle=$oEngine->Lang_Get('error');
$sMsg=$oEngine->Lang_Get('registration_login_error');
}else{
$oUserCurrent=$oEngine->User_GetUserCurrent();
$user = $oUserCurrent->User_GetUserByLogin($search);
if($user){
echo '<img src="'.$user->getProfileAvatarPath(100).'">
'.$user->getProfileName().'
';
$bStateError=false;
$sMsgTitle='';
$sMsg='';
}else{
$sMsgTitle=$oEngine->Lang_Get('error');
$sMsg=$oEngine->Lang_Get('user_empty');
}
}
break;
default:
if(strlen($search)<3){
$sMsgTitle=$oEngine->Lang_Get('error');
$sMsg=$oEngine->Lang_Get('registration_login_error');
}else{
$oUserCurrent=$oEngine->User_GetUserCurrent();
$userList = $oUserCurrent->User_GetUsersByLoginLike($search,30);
if(count($userList)>0){
foreach($userList AS $user){
$found[] = $user->getLogin();
}
$bStateError=false;
$sMsgTitle='';
$sMsg='';
}else{
$sMsgTitle=$oEngine->Lang_Get('error');
$sMsg=$oEngine->Lang_Get('user_empty');
}
}
break;
}
} else {
$sMsgTitle=$oEngine->Lang_Get('error');
$sMsg=$oEngine->Lang_Get('need_authorization');
}
$GLOBALS['_RESULT'] = array(
"bStateError" => $bStateError,
"found" => $found,
"sMsgTitle" => $sMsgTitle,
"sMsg" => $sMsg
);
?>
Вставка тега user в текст:
Файл /templates/skin/new/js/panel.js
Тут надо добавить метод insertUser:
insertUser: function(obj,login){
obj=$(obj);
this.putText(obj,'<user>'+login+'</user>');
hideUserForm();
}
Правила фильтрации тэгов:
Файл /classes/modules/sys_text/Text.class.php
В разрешенные теги добавить тег «user».
Добавить метод userParser
public function UserParser($sText) {
return preg_replace("/<user>(.*)<\/user>/Ui","<a href=\"/profile/$1\" class=\"user\" target=_blank>$1</a>",$sText);
}
и его вызов в методе Parser:
$sResult=$this->UserParser($sResult);
В css для красоты:
a.user {
color: #999;
padding: 5px 0;
background: url(../images/icons.gif) no-repeat scroll 0 -101px; padding-left: 12px;
}
Должно получиться вот так:
В итоге все теги вида
<user>UserName</user>
будут заменяться ссылками на профиль с классом «user».UPD:
Если необходима проверка на присутствие пользователя в базе, то функция парсера примет вид:
Файл /classes/modules/sys_text/Text.class.php
public function UserParser($sText) {
if (preg_match_all("/<user>(.*)<\/user>/Ui",$sText,$aMatch)) {
$oEngine = Engine::getInstance();
foreach ($aMatch[1] as $key => $str) {
$oUser = $oEngine->User_GetUserByLogin($aMatch[1][$key]);
!$oUser ? $aMatch[1][$key] = '' : $aMatch[1][$key] = '<a href="/profile/'.$aMatch[1][$key].'" class="user" target=_blank>'.$aMatch[1][$key].'</a>';
$sText=str_replace($aMatch[0][$key],$aMatch[1][$key],$sText);
}
}
return $sText;
}
76 комментариев
хех.
2. Перед постингом топика, цепляем хук (как использовать можно найти, используя поиск)
3. В хуке берем текст топика, ищем в нем регуляркой наши ссылки на пользователей (похожие регулярки есть в модуле sys_text). Имя пользователя не может включать в себя всякие левые теги.
4. Отсылаем пользователям приватки типа «О вас упомянули в топике..»
5. Заменяем нашу ссылку [user=benone] на
Усё
С механизмом отправки я как раз еще не разобрался)
А чем плох тег «user»?
А чем плох тег «user»?
Тем что он будет резаться Jevix'ом
Только в моем случае всё будет реализовано без правки кода livestreet, через хуки.
Зачем путать :)
Лично я за единообразие. Тем более, что большая часть пользователей далеки от html и довольствуются тем, что им предоставляет редактор.
По хорошему, лучше вообще скрыть все теги в окне редактирования поста/комментария и показывать сразу их интерпретацию, без предпросмотра. Как на той же респективе, например.
Вообще, да. Дело вкуса.
Даже не с цифрой, а с вертикальной полоской, которая будет удлиняться, и становиться (по мере увеличения рейтинга «внимания к персоне») золотой и загадочно мерцающей.
Но если кнопка будет популярной, в основном, будут перечислины ссылки на профили. Я, например, стараюсь ссылаться.
никто не поблагодарил, афтар молодец )
Идея с отображением «внимания к персоне» тоже очень понравилась :) Различные пи*ькомерные феньки всегда привлекали внимание юзеров :)
sys_text*
не грузяться изображения. Пишет «системная ошибка… попробуйте позже»
Как побороть?
Поправил сам. Вроде работает.
Что сделал? В файле /templates/skin/new/window_add_user.tpl
исправил строчку
на
Вот появляется форма добавления пользователя (аналог добавления картинки в топик), как и где убрать затемнение экрана за этой формой?
Все стили прибивал — не в стилях дело.
(по умолчанию фон #333 и прозрачность 0.8)
Чтобы изменить эти настройки нужно открыть файл (по примеру стандартного шаблона)
templates/skin/new/js/other.js и найти в нем строку:
в конце перед последней закрывающей скобкой вставить переопределяющие свойства, вот так:
А именно код
Где можно задать свойства CSS
В шапке для 0.3 расписано всё
Комментарий валиден для 0.4.2
Даже если найденных пользователей или друзей несколько в списке выводится один.
Как это поправить?
+ не работает меню выбора списка друзей.
При нажатии «Мои друзья», пишет — NOT_FOUND_LANG_TEXT — , и нет окошка для выбора.
Как поправить?
Но показывает все равно всего одного человека.