Сегодня: 17:12:2025
Доброго вам вечера!
Страниц (117): В начало « ... 35 36 37 38 [39] 40 41 42 43 ... » В конец
Найдено сообщений: 1165 |
| NordWest |
Отправлено: 12 апреля 2017 — 18:12 • Тема: Перевод ExBB на UTF-8 • Форум: ExBB Community |
Ответов: 0 Просмотров: 1148
 |
Если вдруг когда-нибудь озадачусь этой проблемой (что вообще говоря вряд ли), то на всякий случай решил для самого себя сохранить информацию, какие функции в движке вероятно придётся подменить...
mail() --> mb_send_mail()
strlen() --> mb_strlen()
strpos() --> mb_strpos()
strrpos() --> mb_strrpos()
substr() --> mb_substr()
ereg() --> mb_ereg()
eregi() --> mb_eregi()
ereg_replace() --> mb_ereg_replace()
eregi_replace() --> mb_eregi_replace()
split() --> mb_split() |
| NordWest |
Отправлено: 12 апреля 2017 — 18:06 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91225
 |
Свой собственный хостинг для форума развернул, что бы не платить за хостинг в интернете.
Цитата: Хостинг (англ. hosting) — услуга по предоставлению ресурсов для размещения информации на сервере, постоянно находящемся в сети (обычно Интернет).
Обычно хостинг входит в пакет по обслуживанию сайта и подразумевает как минимум услугу размещения файлов сайта на сервере, на котором запущено ПО, необходимое для обработки запросов к этим файлам (веб-сервер). Как правило, в обслуживание уже входит предоставление места для почтовой корреспонденции, баз данных, DNS, файлового хранилища на специально выделенном файл-сервере и т. п., а также поддержка функционирования соответствующих сервисов.
У меня раньше бесплатный хостинг был вместе с тарифным планом от старого провайдера. Потом я провайдера сменил и спустя некоторое время они мне хостинг отключили. Алина за хостинг "Беседки" платит почти 2 тысячи в год - недавно скидывались. Бесплатные хостинги есть - но там невозможно работать, тормоза жуткие.
Ну и параллельно у меня там развернут медиа-сервер (киношки на телевизор гоняю), торент клиент и вообще большая файлопомойка.  |
| NordWest |
Отправлено: 12 апреля 2017 — 14:53 • Тема: Проблема с скрытыми разделами • Форум: ExBB Community |
Ответов: 1 Просмотров: 1215
 |
Инструкция для дистрибутива ExBB_FM_1.0_Final
Устраняет проблемы с видимостью некоторых ссылок на скрытые форумы.
Открываем файл index.php
в котором ищем строку
code:$LastPosterName = ($forum['last_poster_id'] !== 0) ? $fm->LANG['Author'].': <a href="profile.php?action=show&member='.$forum['last_poster_id'].'">'.$forum['last_poster'].'</a>' : $fm->LANG['Author'].': '.$fm->LANG['Guest'];
после которой вставляем
code:if (!isset($allforums[$id])) // если последние изменения пришлись на скрытый подфорум - формируем новые данные
{
$ftopics = $fm->_Read('forum'.$id.'/list.php');
usort($ftopics,"sort_by_postdate");
$topic = $ftopics[0];
$thread_keys = array_keys($fm->_Read('data/forum'.$forum['id'].'/'.$topic['id'].'-thd.php'));
$lt_name = (strlen($topic['name'])>36) ? substr($topic['name'],0,35).'...' : $topic['name'];
$LastTopicName = '<img src="./templates/'.DEF_SKIN.'/im/lastpost.gif"><span'.($fm->exbb['show_hints'] ? '<span class="hint">' : '').'><a href="topic.php?forum='.$topic['fid'].'&topic='.$topic['id'].'&v=l#'.end($thread_keys).'" title="'.$topic['name'].'">'.$lt_name.'</a></span>';
$LastPosterName = ($topic['a_id'] !== 0) ? $fm->LANG['Author'].': <a href="profile.php?action=show&member='.$topic['a_id'].'">'.$topic['author'].'</a>' : $fm->LANG['Author'].': '.$fm->LANG['Guest'];
$LastTopicDate = ($topic['postdate'] > 0) ? date("d.m.Y - H:i", $topic['postdate'] + $fm->user['timedif']*3600) : $fm->LANG['NA'];
}
Далее открываем файл profile.php
в котором ищем строку
code:$allforums = $fm->_Read(FM_ALLFORUMS);
которую заменяем на строку
code:$allforums = array_filter($fm->_Read(FM_ALLFORUMS),"Filter_Cat");
затем далее в этом же файле ищем код
code:if (isset($user['lastpost']['date'])) {
$postdate = $fm->_DateFormat($user['lastpost']['date'] + $fm->user['timedif']['usertime']*3600);
$topicTitle = preg_replace("#([^\s]{32})(.+)#is","$1­$2",$user['lastpost']['name']);
$lastpostdetails = $fm->LANG['LastPost'].': <a href="'.$user['lastpost']['link'].'">'.$topicTitle.'</a> - '.$postdate;
} else {
$lastpostdetails = $fm->LANG['NoPosts'];
}
который заменяем кодом
code:if (isset($user['last_visit'])) // время последней активности
{$lastvisit = $fm->LANG['LastVisit'].': '.$fm->_DateFormat($user['last_visit'] + $fm->user['timedif']*3600);}
else {$lastvisit = $fm->LANG['NoVisit'];}
затем далее в этом же файле ищем код
code: $fm->_BOARDSTATS();
$days_reged = max(1, round((time() - $user['joined'])/86400));
$posts_per_day = sprintf($fm->LANG['PostsPerDay'], $user['posts']/$days_reged);
$percentage = ($fm->_Stats['totalposts'] > 0) ? min(100, ($user['posts'] / $fm->_Stats['totalposts']) * 100) : 0;
$percentage = sprintf($fm->LANG['ProcTotal'], $percentage);
который удаляем
затем далее в этом же файле ищем строку
code:$countposts = array_sum($user['posted']);
которую заменяем на код
code:foreach ($user['posted'] as $inforum=>$posts)
{
if (isset($allforums[$inforum]))
{
$infposts[$inforum] = $posts;
$countposts += $posts;
}
}
затем далее в этом же файле ищем строку
code:foreach ($user['posted'] as $inforum=>$posts){
которую заменяем на строку
code:foreach ($infposts as $inforum=>$posts){
затем далее в этом же файле ищем строку
code:$fm->_Title = ' :: '.$fm->LANG['UserInfo'];
перед которой вставляем код
code: $fm->_BOARDSTATS();
$days_reged = max(1, round((time() - $user['joined'])/86400));
$posts_per_day = sprintf($fm->LANG['PostsPerDay'], $countposts/$days_reged);
$percentage = ($fm->_Stats['totalposts'] > 0) ? min(100, ($countposts / $fm->_Stats['totalposts']) * 100) : 0;
$percentage = sprintf($fm->LANG['ProcTotal'], $percentage);
$usertotalposts = $countposts.' ['.$percentage.' / '.$posts_per_day.']';
затем далее в этом же файле ищем строку
code:function validate_items(){
перед которой вставляем код
code:function Filter_Cat($var) {
global $fm;
$_access = TRUE;
if (!defined('IS_ADMIN') && $var['private'] === TRUE) {
$_access = (isset($fm->user['private'][$var['id']]) && $fm->user['private'][$var['id']] === TRUE) ? TRUE:FALSE;
}
return ($_access === TRUE) ?1:0;
}
Далее открываем файл lang_front_register.php
в котором ищем строки
code:$this->LANG['LastPost'] = 'Последняя запись';
$this->LANG['NoPosts'] = 'Нет записей';
которые заменяем строками
code:$this->LANG['Activity'] = 'Активность';
$this->LANG['LastVisit'] = 'Последнее посещение';
$this->LANG['NoVisit'] = 'Нет информации';
Затем открываем в своем шаблоне файл profile_show.tpl
в котором ищем строки
code:<tr>
<td class="pformleft" valign="top"><b>{$fm->LANG['Updates']}</b></td>
<td class="pformright">$lastpostdetails</td>
</tr>
<tr>
<td class="pformleft" valign="top"><b>{$fm->LANG['UserTotalPosts']}</b></td>
<td class="pformright">{$user['posts']} [$percentage / $posts_per_day]</td>
</tr>
которые заменяем строками
code:<tr>
<td class="pformleft" valign="top"><b>{$fm->LANG['Activity']}</b></td>
<td class="pformright">$lastvisit</td>
</tr>
<tr>
<td class="pformleft" valign="top"><b>{$fm->LANG['UserTotalPosts']}</b></td>
<td class="pformright">$usertotalposts</td>
</tr>
На этом устранение проблемы завершено. |
| NordWest |
Отправлено: 10 апреля 2017 — 21:22 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91225
 |
Я вот думаю, не подкинь я ей тогда эту мысль - может и по сей день нормально бы всё было?  |
| NordWest |
Отправлено: 10 апреля 2017 — 10:57 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91225
 |
Не страшно, когда рядом есть кому в случае чего поддержать. Прорвёмся.  |
| NordWest |
Отправлено: 9 апреля 2017 — 22:15 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91225
 |
Надежда сегодня ответила. Говорит в новый отдел перешла - работой загрузилась по самое нехочу. Ну и слава богу. 
topinant , Надя у вас просит прощения, что погорячилась в ответ на ваше поздравление с 8 марта - была на взводе. |
| NordWest |
Отправлено: 9 апреля 2017 — 13:09 • Тема: Проблема с скрытыми разделами • Форум: ExBB Community |
Ответов: 1 Просмотров: 1215
 |
Пытаюсь решить проблему такого плана.
В нескольких местах форум выдает ссылки на скрытые разделы пользователям, которые этой инфы видеть не должны.
В профиле...
На главной...
|
| NordWest |
Отправлено: 9 апреля 2017 — 11:42 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91225
 |
Написал недавно на почту Надежде - молчит. Не случилось бы чего.  |
| NordWest |
Отправлено: 3 апреля 2017 — 02:01 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91225
 |
Ну всё, вроде закончил ковыряться с железом - запустил таки я себе полноценный сервер.
По нынешним меркам уже устаревшая модель, но главное, что шасси серверное со всякими отказозащищающими штуками.  |
| NordWest |
Отправлено: 23 марта 2017 — 22:26 • Тема: WebParser: использование StringIndex2 • Форум: Rainmeter - изменяем интерфейс рабочего стола |
Ответов: 1 Просмотров: 2651
 |
Для эффективного использования плагина WebParser в целях получения повторяющихся данных из RSS-ленты или сайта погоды, следует использовать параметр StringIndex2 .
В мануале про этот параметр можно прочитать следующее:
StringIndex2
Этот параметр используется для RegExp параметра в Мере, использующую данные из другой Меры WebParser (т. е. URL-адрес указывает на родительскую меру). В этом случае StringIndex определяет индекс результата выражения родительской меры, а StringIndex2 определяет индекс RegExp выражения (т. е. определяет строку, возвращаемую меру).
Для примера давайте получим некоторые данные со страницы https://docs.rainmeter.net/
Исходный код этой страницы на момент написания данной статьи выглядел так:
Спойлер (Показать) Цитата:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Rainmeter Docs</title>
<link href="/css/main.css?v=3" rel="stylesheet">
<link rel="shortcut icon" href="//www.rainmeter.net/favicon.ico">
<!--[if lt IE 9]><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6/html5shiv.min.js"></script><![endif]-->
</head>
<body>
<div id="wrapper">
<div id="top">
<div class="container">
<a id="logo" href="//rainmeter.net/"></a>
<nav id="nav">
<ul>
<li><a href="//www.rainmeter.net">Home</a>
<li><a href="//www.rainmeter.net/about">About</a>
<li><a href="/" class="active">Docs</a>
<li><a href="//www.rainmeter.net/discover">Discover</a>
<li><a href="//forum.rainmeter.net">Forum</a>
</ul>
</nav>
</div>
</div>
<div class="container">
<div class="row">
<div id="content" class="index">
<div id="index-right">
<h3>Help</h3>
<p>Help is available on <a href="//forum.rainmeter.net/">the forum</a>. Members of the development team and the Rainmeter community offer support and advice on a volunteer basis.
<p>For shorter questions, join the discussion in our IRC chat room. Click <a href="http://webchat.freenode.net/?channels=rainmeter">here</a> to chat in your browser, or use your own IRC client to connect to #rainmeter at irc.freenode.net.
<h3>Contact</h3>
<p>For press inquiries or technical problems with the site or forums, email the development team at <a href="mailto:team@rainmeter.net">team@rainmeter.net</a>. Please do not send Rainmeter or skin support requests to this address; use the forum or chat room instead. Support requests sent to this address will not be answered.
</div>
<div id="index-left">
<h2><a href="/manual/">4.0 Manual</a></h2>
<p>Reference and tutorial material for the current final version of Rainmeter.
<h2><a href="/manual-beta/">4.1 Beta Manual</a></h2>
<p>Reference and tutorial material for the next version of Rainmeter in development.
<h2><a href="/tips/">Tips & Tricks</a></h2>
<p>Suggested methods and solutions for using Rainmeter in the field.
<h2><a href="/snippets/">Snippets</a></h2>
<p>Useful code fragments for running Lua scripts in Rainmeter.
<h2><a href="/developers/">Developers</a></h2>
<p>Information for working with the Rainmeter project source code, creating custom plugins, and interacting with Rainmeter from external applications.
<h2><a href="/history/">Version History</a></h2>
<p>Complete record of changes in each version of Rainmeter.
</div>
</div>
</div>
</div>
<div id="footer-push"></div>
</div>
<script src="/js/main.js?v=4"></script>
</body>
</html>
Код скина, который будем разбирать, выглядит так:
Спойлер (Показать)PHP:[Rainmeter]
Update=1000
DynamicWindowSize=1
[Variables]
Url=https://docs.rainmeter.net
Item=.*<h2>(.*)</h2>
[MeasureSite]
Measure=Plugin
Plugin=WebParser
Url=#Url#
RegExp="(?siU)<title>(.*)</title>#Item##Item##Item#.*"
[MeasureMainTitle]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
StringIndex=1
[MeasureItem1Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=2
StringIndex2=1
Substitute='href="':"#Url#"
[MeasureItem1Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=2
StringIndex2=1
[MeasureItem2Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=3
StringIndex2=1
Substitute='href="':"#Url#"
[MeasureItem2Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=3
StringIndex2=1
[MeasureItem3Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=4
StringIndex2=1
Substitute='href="':"#Url#"
[MeasureItem3Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=4
StringIndex2=1
[MeterMainTitle]
Meter=String
MeasureName=MeasureMainTitle
X=0
Y=0
FontSize=13
FontColor=255,255,255,255
SolidColor=0,0,0,1
StringStyle=Bold
Antialias=1
[MeterItem1Title]
Meter=String
MeasureName=MeasureItem1Title
X=0
Y=10R
W=300
H=35
ClipString=1
FontSize=11
FontColor=255,255,255,255
SolidColor=0,0,0,1
Antialias=1
LeftMouseUpAction=["[MeasureItem1Link]"]
[MeterItem2Title]
Meter=String
MeasureName=MeasureItem2Title
X=0
Y=1R
W=300
H=35
ClipString=1
FontSize=11
FontColor=255,255,255,255
SolidColor=0,0,0,1
Antialias=1
LeftMouseUpAction=["[MeasureItem2Link]"]
[MeterItem3Title]
Meter=String
MeasureName=MeasureItem3Title
X=0
Y=1R
W=300
H=35
ClipString=1
FontSize=11
FontColor=255,255,255,255
SolidColor=0,0,0,1
Antialias=1
LeftMouseUpAction=["[MeasureItem3Link]"]
В результате выполнения этого кода получаем такой результат.
Давайте теперь пошагово разберём, что делает этот код.
Во первых определены две переменные, причем одна из них используется в RegExp
PHP:[Variables]
Url=https://docs.rainmeter.net
Item=.*<h2>(.*)</h2>
Затем в коде используется плагин WebParser для получения информации с сайта.
PHP:[MeasureSite]
Measure=Plugin
Plugin=WebParser
Url=#Url#
RegExp="(?siU)<title>(.*)</title>#Item##Item##Item#.*"
В формировании параметра RegExp использована заранее объявленная переменная Item. Если эту переменную заменить её значением, то в итоге видим 4 точки захвата кода.
Цитата: RegExp="(?siU)<title>(.*)</title>.*<h2>(.*)</h2>.*<h2>(.*)</h2>.*<h2>(.*)</h2>.*"
Обратите внимание на одну особенность. Вместо того, что бы сразу разобрать весь сайт на многочисленные StringIndexes, мы только в первом StringIndexes сразу получаем результат, а вот в StringIndexes 2, 3 и 4 захватываем куски сырого кода между тегами <h2> и </h2>.
Вот этими кусками сырого кода мы в дальнейшем и займёмся.
PHP:[MeasureItem1Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=2
StringIndex2=1
Мы видим, что снова используется плагин WebParser, но в качестве параметра Url используется указание на другую месуру MeasureSite
В этом случае параметр StringIndex определяет индекс куска кода, который следует взять из MeasureSite и уже к этому куску кода применяется свой RegExp
В результате этого может быть захвачено снова несколько элементов и уже на эти элементы ссылается другой параметр - StringIndex2
Применительно к конкретному примеру из MeasureSite будет взят кусок кода с индексом 2 (StringIndex=2) и после поиска будет выбран элемент с индексом 1 (StringIndex2=1).
Следующая месура работает аналогично, но имеет свой RegExp
PHP:[MeasureItem1Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=2
StringIndex2=1
Substitute='href="':"#Url#"
Аналогично повторим те же операции, но для StringIndex=3 и StringIndex=4
В общем можно дать совет использовать плагин WebParser именно по такой схеме.
Первая, главная месура делает запрос к сайту и захватывает максимально необходимое количество даных (зачастую это может быть вся страница сайта целиком). А затем создаются вспомогательные месуры, которые ссылаются на главную и разбирают её данные. Этим достигается минимум запросов к интернет ресурсу, т.к. при слишком частых запросах сервер может принять работу WebParser за атаку на ресурс. Так же использование подобной схемы позволяет обойти ограничение в 99 StringIndex для одной месуры. |
|
Страниц (117): В начало « ... 35 36 37 38 [39] 40 41 42 43 ... » В конец
|
|