+11.38
Рейтинг
33.21
Сила

Николай

Оптимизация некоторых методов ядра

UPD: Недавно выяснил, что все эти оптимизации уже сделаны в AltoCMS.
UPD2: Добавил буфер значений для метода ядра GetEntity().
UPD3: Немного переписал класс Config.class.php.

С ЛС я знаком уже больше 3 лет. В течение этого времени следил за развитием движка, а также за быстродействием версий с 0.4* до 1.0*. Поэтому решил проверить, куда уходит процессорное время.
Поставил на тестовый сервер версию 1.0.3.

Параметры сервера:
Intel® Xeon(TM) CPU 3.00GHz 4GB RAM
GNU/Linux 8.5
nginx/1.1.14
Apache/2.2.22
PHP 5.3.23 + APC (на момент теста оказывается, что не работало) + Memcache


Читать дальше →

Постраничность в убывающем порядке

Всем привет.

Кто ни будь задавался вопросом, как реализовать постраничность в убывающем порядке? Чтобы страницы шли не по возрастанию (1, 2, 3, 4,...,500), а по убыванию (500, 499, 498, 497,...,1).

С точки зрения ценности страниц пагинации для поисковых систем, постраничность в убывающем порядке является более удачной, так как в таком случае на страницах будет не меняющийся, статичный контент.

Также интересует, если получится это реализовать, как внедрить новый тип пагинации в отдельный плагин, либо сделать её отдельными плагином, чтобы при помощи него, пагинацию можно было наследовать в других плагинах, не внося изменений в файл движка Viewer.class.php, дабы не усложнять себе жизнь при будущем обновлении.

Вот код из \engine\modules\viewer\Viewer.class.php:
	/**
	 * Формирует постраничный вывод
	 *
	 * @param int $iCount	Общее количество элементов
	 * @param int $iCurrentPage	Текущая страница
	 * @param int $iCountPerPage	Количество элементов на одну страницу
	 * @param int $iCountPageLine	Количество ссылок на другие страницы
	 * @param string $sBaseUrl	Базовый URL, к нему будет добавлять постикс /pageN/  и GET параметры
	 * @param array $aGetParamsList	Список GET параметров, которые необходимо передавать при постраничном переходе
	 * @return array
	 */
	public function MakePaging($iCount,$iCurrentPage,$iCountPerPage,$iCountPageLine,$sBaseUrl,$aGetParamsList=array()) {
		if ($iCount==0) {
			return false;
		}

		$iCountPage=ceil($iCount/$iCountPerPage);
		if (!preg_match("/^[1-9]\d*$/i",$iCurrentPage)) {
			$iCurrentPage=1;
		}
		if ($iCurrentPage>$iCountPage) {
			$iCurrentPage=$iCountPage;
		}

		$aPagesLeft=array();
		$iTemp=$iCurrentPage-$iCountPageLine;
		$iTemp = $iTemp<1 ? 1 : $iTemp;
		for ($i=$iTemp;$i<$iCurrentPage;$i++) {
			$aPagesLeft[]=$i;
		}

		$aPagesRight=array();
		for ($i=$iCurrentPage+1;$i<=$iCurrentPage+$iCountPageLine and $i<=$iCountPage;$i++) {
			$aPagesRight[]=$i;
		}

		$iNextPage = $iCurrentPage<$iCountPage ? $iCurrentPage+1 : false;
		$iPrevPage = $iCurrentPage>1 ? $iCurrentPage-1 : false;

		$sGetParams='';
		if (is_string($aGetParamsList) or count($aGetParamsList)){
			$sGetParams='?'.(is_array($aGetParamsList) ? http_build_query($aGetParamsList,'','&') : $aGetParamsList);
		}
		$aPaging=array(
			'aPagesLeft' => $aPagesLeft,
			'aPagesRight' => $aPagesRight,
			'iCount' => $iCount,
			'iCountPage' => $iCountPage,
			'iCurrentPage' => $iCurrentPage,
			'iNextPage' => $iNextPage,
			'iPrevPage' => $iPrevPage,
			'sBaseUrl' => rtrim($this->Tools_Urlspecialchars($sBaseUrl),'/'),
			'sGetParams' => $sGetParams,
		);
		/**
		 * Избавляемся от дублирования страниц с page=1
		 */
		if ($aPaging['iCurrentPage']==1) {
			$this->SetHtmlCanonical($aPaging['sBaseUrl'].'/'.$aPaging['sGetParams']);
		}
		return $aPaging;
	}

Text.class.php для iframe от coub.com (решено)

Помогите пожалуйста настроить преобразование ссылки на coube.com в iframe видео при помощи тега video.

Вот что вышло у меня:
$sText = preg_replace('/<video>http:\/\/(?:www\.|)coub\.com\/view\/(\d+).*<\/video>/i', '<iframe src="http://coub.com/embed/$1?muted=false&autostart=false&originalSize=false&hideTopBar=false&noSiteButtons=false&startWithHD=false" allowfullscreen="true" frameborder="0" width="640" height="480"></iframe>', $sText);

Но не работает…

Решение

Правильный код:
/**
		 * coub.com
		 */
		$sText = preg_replace('/<video>http:\/\/(?:www\.|)coub\.com\/view\/(\w+).*<\/video>/i', '<iframe src="http://coub.com/embed/$1?muted=false&autostart=false&originalSize=false&hideTopBar=false&noSiteButtons=false&startWithHD=false" allowfullscreen="true" frameborder="0" width="640" height="480"></iframe>', $sText);

Дата (время) топика отстает на час (РЕШЕНО)

Добрый день. Подскажите, пожалуйста, где искать и как лечить следующую проблему: при публикации топика выводится неправильная дата на час меньше текущей даты сервера? Временная зона в конфиге указана верно, Тестовый php-файл с кодом
<?php echo date('H:i:s d.m.Y'); ?>
тоже выводит правильное время и дату, а вот в топиках беда.

Читать дальше →

Прикрепляем топик без плагина

В LS существует множество возможностей для реализации самого разного функционала как с использованием плагинов, так и без них.

Допустим мы хотим реализовать следующий функционал: на главной странице для гостей сверху всегда выводится определенный топик. Конечно мы можем написать под эту задачу несложный плагин, повесить его на хук в шаблоне и радоваться, но мы поступим проще (на все про все уйдет 4 строчки c учетом замечаний kpoxas три строчки). Сделаем все в шаблоне, написав при этом минимальное кол-во кода. Итак.

Нас интересует главная страница, а значит экшен Index, шаблон вывода которого находится в файле templates/skin/synio/actions/ActionIndex/index.tpl который и будем изменять.

Сразу приведу код
{if !LS::CurUsr() and !Router::GetActionEvent()}
	{include file='topic_topic.tpl' oTopic=$LS->Topic_GetTopicById(8)}
{/if}
Да-да, больше ничего не нужно, результат достигнут ;)


А теперь подробности того как это все работает

Переносим информацию из блока профиля в блок на главную!

Привет Друзья, пришла идея перенести информацию сайдбара в профиле пользователя, что бы отображались с количеством постов: Стена, Публикации, Избранное, Друзья и т.д.



Внимание! Стили произвольные, что бы оформить блок, свои стили Вы должны вставить самостоятельно!

Читать дальше →

Снять checkbox по умолчанию

Всем привет!
Сегодня получил на почту парочку писем от пользователей типа «Отпишите нас от своей рассылки!».
В этой связи у меня возник вопрос:
Подскажите, что и где нужно подправить, чтобы галочки в настройках сайта в профиле не стояли по умолчанию?

А уж если пользователь захочет подписаться — то у него была бы такая возможность.

Как заставить CSS и JS обновляться автоматически при обновлении файлов

У нас на сервере включена полезная опция объединения всех JS и CSS файлов. Задается она в конфиге

/**
 * Параметры компрессии css-файлов
 */
$config['compress']['css']['merge'] = true;       // указывает на необходимость слияния файлов по указанным блокам.
$config['compress']['js']['merge']  = true; 


Однако при обновлении исходников JS и CSS файлов пользователи не получают обновления. Я видел есть плагин ReloadCSS однако он не занимается JS файлами, плюс тыкать кнопку мне тоже не охота совсем. В итоге я полез в код движка и нашел место, где формируется название скомпрессированных файлов

engine/modules/viewer/Viewer.class.php функция Compress
        /**
	 * Сжимает все переданные файлы в один,
	 * использует файловое кеширование
	 *
	 * @param  array  $aFiles	Список файлов
	 * @param  string $sType	Тип файла - js, css
	 * @return array
	 */
	protected function Compress($aFiles,$sType) {
		$sCacheDir  = $this->sCacheDir."/".Config::Get('view.skin');
		$sCacheName = $sCacheDir."/".md5(serialize($aFiles).'_head').".{$sType}";
		$sPathWeb    = Config::Get('path.root.web');
		/**
		 * Если кеш существует, то берем из кеша
		 */
		if(!file_exists($sCacheName)) {


Видно, что в формировании ключа участвуют только имена файлов. Я добавил туда еще и размеры, заодно проверил скорость формирования ключа. Вот такой код у меня получился:

	/**
	 * Сжимает все переданные файлы в один,
	 * использует файловое кеширование
	 *
	 * @param  array  $aFiles	Список файлов
	 * @param  string $sType	Тип файла - js, css
	 * @return array
	 */
	protected function Compress($aFiles,$sType) {
		$sPathWeb    = Config::Get('path.root.web');
		$aFileDates = array();
		$iStart = microtime(true);
		foreach ($aFiles as $sFile) {
			// если файл локальный
			if (strpos($sFile, $sPathWeb)!==false) {
				$sFile=$this->GetServerPath($sFile);
				list($sFile,)=explode('?',$sFile,2);
				$aFileDates[] = filectime($sFile);
			}
		}
		$sCacheDir  = $this->sCacheDir."/".Config::Get('view.skin');
		$sCacheName = $sCacheDir."/".md5(implode($aFiles).implode($aFileDates).'_head').".{$sType}";
		echo "Key calculation took ".(microtime(true) - $iStart)." secs\n";
		/**
		 * Если кеш существует, то берем из кеша
		 */
		if(!file_exists($sCacheName)) {


Проверка показала, что время пренебрежимо мало:

Key calculation took 0,0016648769378662 secs
Key calculation took 0,0010089874267578 secs


Убираем отладочный вывод и радумеся обновлениям JS и CSS.

Можно было бы это сделать плагином, но в плагине пришлось бы переопределить функцию Compress. Может, лучше это изменение просто включить в следующую версию LS.