Хак, убирающий один запрос к БД для смайлов.
Убирает везде где идет вывод текстовой инфы с форматированием (новости, статьи, форум, файлы и т.п.), как на главной странице модулей так и выбранной статьи/новости/описания/поста и т.п.
Хак основан на отказе хранить инфу о смайлах в БД и перенос хранения в папку "cache" где хранятся другие файлы настроек всего портала.
Работает на любой версии.
Начинаем:
1. Помещаем файл \modules\system\cache\smiles.php в папку \www\modules\system\cache и назначаем права 666
2. Помещаем все смайлы из архива в папку \www\images\smilies
3. Помещаем файл \modules\system\admin\smilies\smilies.php в папку \www\modules\system\admin\smilies
4. В корневом файле misc.php находим конструкцию:
case "smilies":
и меняем её на:
PHP код:
case "smilies":
echo "
<script type='text/javascript'>
<!--
function doSmilie(addSmilie) {
var currentMessage = window.opener.xoopsGetElementById(\"".$target."\").value;
window.opener.xoopsGetElementById(\"".$target."\").value=currentMessage+addSmilie;
return;
}
//-->
</script>
</head><body>
<table width='100%'><tr>
<td colspan='3'><big><b>"._SMILIES."</b></big><br />"._CLICKASMILIE."</td>
</tr><tr class='bg2'>
<td><b>"._CODE."</b></td>
<td><b>"._IMAGE."</b></td>
</tr>";
$file_smiles_arr = file(XOOPS_ROOT_PATH."/modules/system/cache/smiles.php");
if (is_array($file_smiles_arr)) {
$rcolor = 'bg1';
for ($i=0;$i<count($file_smiles_arr); $i++) {
$data = explode("|",$file_smiles_arr[$i]);
if (trim($data) != "") {
echo "<tr class='$rcolor'><td>".$data[0]."</td><td><a href='javascript: justReturn()' onclick='doSmilie(\" ".$data[0]." \");'><img src='".formatURL(XOOPS_URL."/images/smilies/", rtrim($data[1]))."' alt='' /></a></td></tr>";
if ( $rcolor == 'bg1' ) {
$rcolor = 'bg2';
} else {
$rcolor = 'bg1';
}
}
}
} else {
echo "Could not retrieve data from the database.";
}
echo "</table>";
break;
5. В файле \www\class\module.textsanitizer.php находим функции:
smiley($message)
desmile($message)
и в новых версиях рони есть такая:
getAllSmilesFromDB()
нам нужно заменить код функиции: smiley($message)
другие функции не трогаем низависимо от версии портала.
Новый код функции:
PHP код:
function smiley($message) {
$file_smiles_arr = file(XOOPS_ROOT_PATH."/modules/system/cache/smiles.php");
if (is_array($file_smiles_arr)) {
for ($i=0;$i<count($file_smiles_arr); $i++) {
$data = explode("|",$file_smiles_arr[$i]);
$message = str_replace($data[0], '<img src="'.formatURL(XOOPS_URL.'/images/smilies/', rtrim($data[1])).'" alt="'.$data[0].'" />', $message);
}
}
return $message;
}
6. Меняем вывод смайлов под формой ответа:
Открываем файл \www\class\xoopsform\formdhtmltextarea.php
и находим функцию renderSmileys()
меняем её на:
PHP код:
function renderSmileys() {
$smileyPath = "images/smilies/";
$file_smiles_arr = file(XOOPS_ROOT_PATH."/modules/system/cache/smiles.php");
if (is_array($file_smiles_arr)) {
$ret = "";
for ($i=0;$i<count($file_smiles_arr); $i++) {
$data = explode("|",$file_smiles_arr[$i]);
$ret .= "<a href='javascript:justReturn()' onclick='xoopsCodeSmilie(\"".$this->getName()."\", \" ".$data[0]." \");'><img src='".XOOPS_URL."/".$smileyPath.rtrim($data[1])."' border='0' alt='".$data[0]."' /></a>";
if ($i > 19) {
$ret .= " [<a href='javascript:openWithSelfMain(\"".XOOPS_URL."/misc.php?action=showpopups&type=smilies&target=".$this->getName()."\",\"smilies\", 300, 475);'>"._MORE."</a>]";
break;
}
}
}
return $ret;
}
P.S. Хак конечно убирает один всего лишь запрос, но если портал имеет тысячи страниц то прогресс налицо.
В базе останется таблица смайлов, что мы больше не используем. Можете не трогать, места она не отъедает.
Хак by Zormax