Page 1 of 1

Небольшие стартовые фиксы

Posted: Wed Oct 01, 2008 1:21 pm
by von-hamster
Далее следуют несколько фиксов, которые я применяю к cms, чтобы она корректно работала с русским языком.
Возможно большинству они известны, но в свое время я местами долго искал и ломал голову  :)

Итак:

0. (именно 0, а не 1  :) ) Это скорее не фикс, а настройки: первое, что я делаю, так это меняю кодировку базы на utf8, если она не по умолчанию.

1. Проблема: когда смотрю базу тем-же phpmyadmin, вместо русских букв - что угодно, кроме того, что нужно
    Файл include.php:
    раскомментирую строку:
    //    $cmsdb->Execute('set names utf8'); // database connection with utf-8
    иногда меняю на
    $cmsdb->Execute("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); // database connection with utf-8

2. Проблема: вместо первых букв некоторых пунктов меню административного раздела отображается "?" или загогулина
    Файл lib/classes/class.admintheme.inc.php

Code: Select all

    function FixSpaces($str)
    {
    	return preg_replace('/\s+/'," ",$str);
    }
    меняю на

Code: Select all

    function FixSpaces($str)
    {
    	return preg_replace('/\s+/u'," ",$str);
    }
3. Проблема: при добавлении нового контента, если ручками не вбить "Page Alias" - страница не добавляется (по другому - автоматом не генерится этот альяс)
    Файл: lib/replacement.php
    В первый массив добавил:

Code: Select all

		$toreplace  = array(
					'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
					'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я',
...
    Во второй:

Code: Select all

		$replacement = array(
					'a', 'b', 'v', 'g', 'd', 'e', 'e', 'zh', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'ts', 'ch', 'sh', 'sch', '', 'y', '', 'e', 'yu', 'ya',
					'a', 'b', 'v', 'g', 'd', 'e', 'e', 'zh', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'ts', 'ch', 'sh', 'sch', '', 'y', '', 'e', 'yu', 'ya',
...
    Замечание: необходимо учитывать кодировку, тоесть файл должен быть сохранен в той кодировке, в которой используется на сайте... По умолчанию - utf-8

Продолжение.............................................

4. Проблема: на некоторых хостингах неверно формировалась карта сайта... Особенно, если уровень вложенности страниц достаточно большой...
    Файл include.php:
    после $cmsdb->Execute('set names... добавить
    $cmsdb->Execute('SET max_sort_length = 1024');
    Пояснение: иерархия строится после сортировки по полю hierarchy в таблице _content, а значение max_sort_length в бд по умолчанию было очень маленьким, соответственно в сортировке учитывались только первые символы...

Продолжение от 14.11.2008
5. Еще немного про оптимизацию:
Проблема: Начал смотреть страницы с простым контентом, и заметил следующее: каждый вызов {cms_selflink page="alias"} - это запрос в БД. Для одного - двух - это не проблема, а для 2-3 десятков - засада...
    Как я исправил:
   
  •    
  • Использую модифицированный свой файл function.hierarchy.php (прилагаю)
       
  • сделал замену в файле /plugins/function.cms_selflink.php :
       

Code: Select all

// Нашел этот код и закоментировал:
		/*
		# check if the page exists in the db
		$manager =& $gCms->GetHierarchyManager();
		$node =& $manager->sureGetNodeByAlias($page);
		if (!isset($node)) return;
		$content =& $node->GetContent();
		if ($content !== FALSE)
		{
			$pageid = $content->Id();
			$alias = $content->Alias();
			$name = $content->Name(); //mbv - 21-06-2005
			$url = $content->GetUrl();
			$menu_text = $content->MenuText();
			$titleattr = $content->TitleAttribute();
		}
		*/

// вместо него это:
		require_once(dirname(__FILE__) . '/../modules/FB_functions/function.hierarchy.php');
		init_main_hierarchy();
		//print_r($gCms->RZ_main_hierarchy);
		if (isset($gCms->RZ_main_hierarchy_a[$page]) && $gCms->RZ_main_hierarchy_a[$page] > 0)
		{
			$pageid	= $gCms->RZ_main_hierarchy_a[$page];
			$alias	= $gCms->RZ_main_hierarchy[$pageid]['alias'];
			$name	= $gCms->RZ_main_hierarchy[$pageid]['header'];
			$url	= $gCms->RZ_main_hierarchy[$pageid]['url'];
			$menu_text	= $gCms->RZ_main_hierarchy[$pageid]['text'];
			$titleattr	= $gCms->RZ_main_hierarchy[$pageid]['title'];
		} else {
			return;
		}
Естессно это работает только с фиксами: http://forum.cmsmadesimple.org/index.ph ... #msg125650

И еще, чуть не забыл: текущий вариант function.hierarchy.php - кэширует свой результат в файл, чтобы при обновлении контента очистить кэш нужно следующее:
Добавить пользовательский тег следующего содержания:

Code: Select all

@unlink(TMP_CACHE_LOCATION . '/main_hierarchy.php');
И привязать его к событиям: ContentDeletePost и ContentEditPost.

Re: Небольшие стартовые фиксы для русского яk

Posted: Wed Oct 01, 2008 9:49 pm
by ilia3d
По пункту 1. надо попробовать, очень интересно )

Re: Небольшие стартовые фиксы для русского яk

Posted: Thu Oct 02, 2008 6:22 am
by Il_Burbero
Пункт второй и третий нужно включить в дистрибутив!

Я тупая офца снимаю шляпу пред столь элегантным решением проблемы с алиасами. Самое главное что это намного меньшая кровь чем втыкание дополнительных транслитераторов. А я то глупенький ковырял munge_string добавлял сторонние файлы, когда все решается намного проще!
Фон Хомячок вы гений!

Re: Небольшие стартовые фиксы для русского яk

Posted: Thu Oct 02, 2008 6:44 am
by von-hamster
Я создал эти темы в багтрекере, правда на кривом английском, но думаю, что поймут...

ЗЫ... Небольшое замечание к посту: в 3 пункте необходимо учитывать кодировку... Т.к. я делаю сайт на utf8 - у меня там все в utf8, как это будет работать с остальным - понятия не имею...

Re: Небольшие стартовые фиксы

Posted: Wed Oct 22, 2008 10:38 am
by von-hamster
2 и 3 пункт в svn вроде пофиксили... Думаю, что в следующем релизе уже будет...

Re: Небольшие стартовые фиксы

Posted: Wed Oct 22, 2008 11:02 am
by ZYV
Ну ты чувак, ну ты крут. Ты сделал то, что давно нужно было всем и все хотели, но никто не делал. Видимо в 1.5 настанет всем нам счастье. Спасибо.

Re: Небольшие стартовые фиксы

Posted: Thu Oct 30, 2008 3:15 am
by A_Saf
Уважаемый, von-hamster! Вы — просто молодец! Я новичок в этом деле и проблемы с Алиасами меня еще не коснулсиь (только присматриваюсь к CMS MS), но вот решение проблем с utf-8 мне очень помогло, только пришлось дописать еще пару строчек, вот что получилось:

Code: Select all

 $cmsdb->Execute("set names 'utf8' set collate 'utf8_general_ci'"); // database connection with utf-8
    $cmsdb->Execute("SET CHARACTER SET 'utf8'") ;
    $cmsdb->Execute("SET SESSION collation_connection = 'utf8_general_ci'");
Без них у меня не заработало, а с ними все ОК!

Жаль, что я раньше не нашел эту ветку — вчера пол вечера искал в коде, куда бы дописать кодировку и коллэйт!

Есть еще предложение — сделать профиксинный дистрибутив "для русских" :) Чтоб не мучились больше люди!

Еще раз спасибо!

Кстати, решение также было найдено на форуме, но уже другой СМS. Автор решения Fuzzy aka Igor ©

Re: Небольшие стартовые фиксы

Posted: Thu Oct 30, 2008 4:05 am
by A_Saf
Да, еще надо бы на стадии установки системы прописывать кодировку по дефолту для каждой таблицы, тогда ИМХО будет работать на любом хостинге....

Re: Небольшие стартовые фиксы

Posted: Thu Oct 30, 2008 6:31 am
by von-hamster
A_Saf wrote: Есть еще предложение — сделать профиксинный дистрибутив "для русских" :) Чтоб не мучились больше люди!
Часть изменений будет в новой версии, как я писал (если не терпится - бери последнюю версию из svn - я так и делаю)...

По поводу же кодировок - как я понял - создатели хотят ее заточить под большое количество (в частности, п2 они сделали немного по другому, тк этот не работает с другими кодировками)...

На самом деле - я не понимаю, зачем они это делают - заточили бы только под utf-8... Ведь, например, для русской версии, чтобы поменять на 1251 - нужно не только поправить соединения с БД, а еще добавить/изменить текущие файлы перевода (это как минимум на первый взгляд)...
Да, еще надо бы на стадии установки системы прописывать кодировку по дефолту для каждой таблицы, тогда ИМХО будет работать на любом хостинге...
Не обязательно - достаточно перед установкой поменять дефолтную кодировку БД, если, конечно, позволяет хостинг...

ЗЫ... Есть еще один интересный момент... Для иерархии они зарезервировали 5 разрядов, тоесть для каждого уровня может быть 99999 страниц, что, по моему, слишком, даже для больших сайтов, к тому-же, с их ядром - он убъет всю память...

Re: Небольшие стартовые фиксы

Posted: Thu Oct 30, 2008 7:12 am
by A_Saf
Не обязательно - достаточно перед установкой поменять дефолтную кодировку БД, если, конечно, позволяет хостинг...
Это, собственно, я и имел в виду. Наверное, больше по незнаю (может, большинство хостингов позволяют проводить подобные манипуляции).
Кстати, сейчас посидел немного, вроде нашел куда можно впихнуть кодировки создаваемых таблиц.
По поводу отображения русских заглавных букв в админке, заметил косяк только с буквой "Р" и то только в тех местах, где она внеслась во время установки. В других, например, в названиях страниц, все тип-топ!
Опять же связываю это с невыставленными переменными кодировок в момент занесения в БД установочной информации.
Ваш способ, пока не применял, но попробую обязательно...
Я, если честно, не следил за хронологией развития CMS (новенький я), но надеюсь, что в версии 1.5 будет в полной мере отлажена мультикодировочность.

Для справки: вот список букв, с которыми были проблемы А Р с Н  э я!

Re: Небольшие стартовые фиксы

Posted: Thu Oct 30, 2008 8:17 am
by von-hamster
По поводу отображения русских заглавных букв в админке, заметил косяк только с буквой "Р" и то только в тех местах, где она внеслась во время установки. В других, например, в названиях страниц, все тип-топ!
Опять же связываю это с невыставленными переменными кодировок в момент занесения в БД установочной информации.
Ваш способ, пока не применял, но попробую обязательно...
Это исправляется п.2. Связано не с кодировкой БД, а с функцией preg_replace, которая не всегда корректно ведет себя с utf-8 на стыке с пробелами... Подробнее это есть на http://ru2.php.net/manual/ru/function.preg-replace.php в комментариях.

Re: Небольшие стартовые фиксы

Posted: Thu Oct 30, 2008 11:48 pm
by A_Saf
Спасибо! Ознакомился.

П. С. Жалею, что когда-то упустил тему регулярных выражений, теперь вот наверстываю.

Re: Небольшие стартовые фиксы

Posted: Fri Nov 14, 2008 7:23 am
by von-hamster
Добавил еще один фикс, см. первый пост...