Перейти к контенту

Чиним iBF 2.0


Рекомендуемые сообщения

Вполне может быть, что другие с этим не сталкивались, но, вдруг у кого-то будут те же проблемы, что у меня. Буду тут расписывать проблемы и их устранение. Заодно указывайте свои проблемы, может я их не заметил, а поправить смогу. Предупреждаю сразу, на совсем ламерские вопросы отвечать не буду, время жалко.

 

Итак, поставил я, наконец, в качестве тестового версию 2.0

Вполне всё работоспособно, но уже пришлось вносить четыре правки. Вот о них - чуть ниже (одна проблема - один постинг). Пошёл писать ;)

Добавлено в [mergetime]1081715976[/mergetime]

Проблемы с MySQL 4.1

 

В виду того, что считаю, что в наше время лучшей кодировкой является UTF-8 (холивор на эту тему вести не буду, просто посмотрите, на чём нынче создаются все новые протоколы и многие проекты и попробуйте при ином подходе в одном сообщении иметь и русские и западноевропейские и спецсимволы (я уже молчу про всякие арабские, иврит и иероглифы)), пришлось перейти в своё время на MySQL 4.1.1alpha, т.к. только он поддерживает полноценно UTF-8.

 

Проблема с iBF2 вылезла сразу при инсталляции. Базы данных по понятным причинам по умолчанию делаются в UTF8, а это вносит ограничение на длину ключа не в 255 символов, а в 166. Инсталляшка начала ругаться на MySQL-ошибки в духе "длина ключа более 500 символов (255*3=765 > 500, а 166*3=498<500).

 

Пришлось исправлять трижды.

 

2p0p0PDR1\upload\install\sql\mysql_tables.php

 

Ищем:

CREATE TABLE ibf_cache_store

в конце создания таблицы меняем

PRIMARY KEY (cs_key)

на

PRIMARY KEY (cs_key(166))

 

Ищем:

CREATE TABLE ibf_members

меняем

KEY name (name),

на

KEY name (name(166)),

 

Ищем:

CREATE TABLE ibf_skin_templates_cache

меняем

KEY template_group_name (template_group_name)

на

KEY template_group_name (template_group_name(166))

 

После этого инсталляция проходит успешно и форум запускается.

(но это - ещё не всё :D )

Ссылка на комментарий
Поделиться на других сайтах

Русская кодировка

 

Ну, это совсем просто. Уже на форуме обсуждалось. По умолчанию форум гонит ISO-кодировку. Идём в:

- админ-панель

-- в секцию Skins & Templates

--- Skin Manager

---- Кликаем на нашем дефолтовом скине (IPB Default Skin)

----- Жмём Edit Root Skin Board Header & Footer Wrapper во всплывшем меню

------ Делаем замену:

 

<meta http-equiv="content-type" content="text/html; charset=iso-8859" />

 

на

 

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

 

(или =windows-1251, если у вас windows-кодировка, но, повторюсь, от этого лучше по возможности отказываться)

 

Ок, теперь форум будет показывать по-русски, но писать по-русски ещё не рекомендуется. Почему - следующий совет.

Ссылка на комментарий
Поделиться на других сайтах

(чёрт, ну зачем такой большой флуд-контроль?? кстати, глюк, вот, в iBF. На флуд надо при отсылке проверять, а не при начале ответа)

 

Перевод форума на UTF-8

 

Для начала чуть-чуть о моей системе кодировок. Если у вас в системе всё переведено в единую кодировку (UTF-8 или Windows-1251), то это вам неактуально.

 

Большинство проектов на моём сервере висит всё ещё в Windows-1251 кодировке. Да оно и понятно, зачем среднего уровня вебмастеру, лепящему HTML, а не CMS, привыкшему к FAR Manager'у какие-то извраты с перекодированием.

 

Но всё новое перевожу или создаю на UTF-8 (приятно, всё же, когда в текст сообщения можно не задумываясь и разные языки мешать, и преформатированные таблички из символов, как в DOS или KOI8, или спецсимволы).

 

Поэтому и Apache2 и PHP у меня по умолчанию работают в Windows-1251.

 

А там, где надо, я при запуске нужного скрипта, будь то форум, Jabber-агент или часть сайта, вручную перевожу систему на UTF-8.

 

Правильнее и безглючнее всего это делать так:

 

В .htaccess в корне форума прописываем

php_value mbstring.func_overload 7

 

Эта команда укажет PHP, что всякие функции нарезки строк, замены, отсылки почты должны работать с мультибайтовыми строками. Тогда длины для UTF-строк будут возвращаться корректные (в символах, а не байтах), нарезка работать и т.п.

Предупреждением - PHP должен быть скомпилирован с поддержкой мультибайтовых строк (./configure --enable-mbstring=ru)

 

В начало главного файла, index.php надо записать:

header('Content-Type: text/html; charset=utf-8');
header('Content-Language: ru');
ini_set('default_charset','utf-8');
setlocale(LC_ALL, "ru_RU.utf8");

первая и вторая строка скажут браузеру, что контент отдавался в русском UTF-8

третья установит UTF-8 для PHP

четвёртая - общую системную локаль.

 

Всё, с этого момента форум полностью работоспособен под UTF-8.

 

Глюк с картинками в следующем постинге.

Добавлено в [mergetime]1081717641[/mergetime]

Глюк с показом аттачей

 

Не знаю, как у других, а у меня картинки-аттачи показывались в виде мусора в браузере. Сразу посмотрел в заголовок отклика и увидел, что сервер гонит картинку в text/html вместо image/jpeg. Как я отлавливал этот глюк - это отдельная песня. Лучше сразу решение:

 

Идём в 2p0p0PDR1\upload\sources\misc\attach.php

 

Ищем кусок

          //---------------------------------------
            // Set up the headers..
            //---------------------------------------
            
            flush();
            
            @header( "Content-Type: ".$ibforums->cache['attachtypes'][ $attach['attach_ext'] ]['atype_mimetype'].
                     "\nContent-Disposition: inline; filename=\"".$attach['attach_file']
                     ."\"\nContent-Length: ".(string)(filesize( $file ) ) );

 

Если убрать сообщения об ошибках с header() (убрать символ '@'), то эта функция начинает ругаться на то, что заголовок вывести не может. Судя по всему, ругань эта идёт и у разработчиков, т.к. зачем иначе они отключали вывод ошибок. А вся фишка тут в функции flush() - она принудительно отдаёт уже имеющиеся данные в браузер, после чего модификация заголовков становится невозможной. Честно говоря, странно видеть, что авторы такой штуки, как iBF, могли зевнуть такой глюк. Переносим flush() после header() и всё начинает работать. Результатирующий код может выглядеть так:

 

          //---------------------------------------
            // Set up the headers..
            //---------------------------------------

            header( "Content-Type: ".$ibforums->cache['attachtypes'][ $attach['attach_ext'] ]['atype_mimetype'].
                     "\nContent-Disposition: inline; filename=\"".$attach['attach_file']
                     ."\"\nContent-Length: ".(string)(filesize( $file ) ) );

            flush();

 

Впрочем, у себя я разбил header по частям, так удобнее:

            //---------------------------------------
            // Set up the headers..
            //---------------------------------------
            
            header("Content-Disposition: inline; filename=\"".$attach['attach_file']."\"");
            header("Content-Length: ".(string)(filesize( $file )));
            header("Content-Type: ".$ibforums->cache['attachtypes'][ $attach['attach_ext'] ]['atype_mimetype']);

            flush();

 

Вот теперь всё работает как надо!

 

Вот, на данный момент глюков с iBF2 больше не вижу, ну да я её больше пока и не мучал :D Попадётся ещё - расскажу, как исправлять (если интересно).

Ссылка на комментарий
Поделиться на других сайтах

Vanish

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

Возможно, что мысли умные, но не совсем... :D

 

В начало главного файла, index.php надо записать:

header('Content-Type: text/html; charset=utf-8');
header('Content-Language: ru');
ini_set('default_charset','utf-8');
setlocale(LC_ALL, "ru_RU.utf8");

И тут же:

Не знаю, как у других, а у меня картинки-аттачи показывались в виде мусора в браузере. Сразу посмотрел в заголовок отклика и увидел, что сервер гонит картинку в text/html вместо image/jpeg.

Так оно все закономерно ;)

Сначала сам выдаешь text/html, а потом недоволен, что аттачи не работают и хидеры неправильные.

Последовательным надо быть. :)

По дефолту аттачи работают. Хотя глюков в данном релизе предостаточно...

Ссылка на комментарий
Поделиться на других сайтах

>Сначала сам выдаешь text/html, а потом недоволен, что аттачи не работают и хидеры неправильные.

 

См. http://php.net/header/ значение по умолчанию у параметра bool replace :D

И заметь, что в моём варианте, с header() вначале, аттачи сейчас работают как положено ;)

 

wget -S --spider "http://airbase.ru/forums2/index.php?act=Attach&type=post&id=3"

--12:22:49--  http://airbase.ru:80/forums2/index.php?a
           => `index.php?act=Attach&type=post&id=3'
Connecting to airbase.ru:80... connected!
HTTP request sent, fetching headers...
1 HTTP/1.1 200 OK
2 Date: Mon, 12 Apr 2004 08:22:46 GMT
3 Server: Apache/2.0.49 (Unix) PHP/4.3.4
4 X-Powered-By: PHP/4.3.4
5 Content-Language: ru, ru
6 Content-Disposition: inline; filename="120_2001.jpg"
7 Content-Length: 110911
8 Vary: Accept-Encoding,User-Agent
9 Connection: close
10 Content-Type: image/jpeg
11
200 OK

 

см. 10-ю строку ответа сервера.

 

>По дефолту аттачи работают.

 

Видимо, у тебя flush() игнорируется web-сервером или PHP.

 

Повторюсь, после flush() гнать заголовки не положено. При чём на это наткнулись, судя по тому, что в header() была отрублена индикация ошибок, саим разработчики.

Добавлено в [mergetime]1081758160[/mergetime]

>И тут же:

 

Да, для краткости я ж не расписывал процесс отладки. Естественно, наткнувшись на неработоспособность аттачей я для тестов возвращал код к исходному виду :)

Ссылка на комментарий
Поделиться на других сайтах

Balancer

Наверное я и ошибаюсь... :D

Видимо, у тебя flush() игнорируется web-сервером или PHP.

Работает только если до flush() что либо было отправлено... В противном случае (буфер пуст) хидеры нормально проходят и после flush().

Повторюсь, после flush() гнать заголовки не положено. При чём на это наткнулись, судя по тому, что в header() была отрублена индикация ошибок, саим разработчики.

Там по такой схеме сделан вывод всей графики.

1.functions.php

function show_gd_img($content="")

function show_gif_img($this_number="")

2. аттачи

3. class_image.php

function show_image( $thumb, $type )

4.print_page.php

function auto_run()

5. stats.php

function show_queries()

Ну и много где еще header после flush стоит...

 

Добавлено в [mergetime]1081765456[/mergetime]

Да.... И кстати в 1.2 (1.3) сделано точно так же... ;)

Ссылка на комментарий
Поделиться на других сайтах

>Да.... И кстати в 1.2

 

Хм. Да, в 1.2 есть два таких места. И в одном - опять заэкранированный @header() :)

Видно, и у меня сервер не всегда по flush() сбрасывает данные в браузер, раз не натыкался на это :D

Впрочем, я всё равно давно отказался в своих скриптах от принудительного сбрасывания данных, отдаю страницу сразу, целиком всегда ;)

Ссылка на комментарий
Поделиться на других сайтах

Тэкс. Голосвания, они же Опросы в 2.0 только у меня не пашут? Или?

Ввожу параметры (не важно, русский или английский), результат сразу выглядит как если бы уже я проголосовал (т.е. результаты, а не форма ввода), но - "0 голосов"...

(Кстати, у них всё тот же маразм до сих пор используется, через сериализацию в БД... :D )

Ссылка на комментарий
Поделиться на других сайтах

Balancer

Ввожу параметры (не важно, русский или английский), результат сразу выглядит как если бы уже я проголосовал (т.е. результаты, а не форма ввода), но - "0 голосов"...

Создатель опроса не голосует насколько я понял. "You created this poll".

Ссылка на комментарий
Поделиться на других сайтах

Кстати, у них всё тот же маразм до сих пор используется, через сериализацию в БД

у вас есть более универсальные методы?

 

по поводу flush() и headers

По хедерам:

The HTTP status header line will always be the first sent to the client, regardless of the actual header() call being the first or not. The status may be overridden by calling header() with a new status line at any time unless the HTTP headers have already been sent.

 

По флашу:

Flushes the output buffers of PHP and whatever backend PHP is using (CGI, a web server, etc). This effectively tries to push all the output so far to the user's browser.

 

так что правильнее видимо использовать flush после отправки заголовков браузеру.

 

По поводу:

Так оно все закономерно :D

Сначала сам выдаешь text/html, а потом недоволен, что аттачи не работают и хидеры неправильные.

смотрите первую цитату мана. Так что получается что хедеры отправленные в index.php должны переопределятся хедерами отправленными в attach.php

 

Судя по всему, ругань эта идёт и у разработчиков, т.к. зачем иначе они отключали вывод ошибок.

вообще считается правилами хорошего тона при программировании (а именно в конечном продукте, не при тестировании!) заглушать варнинги посылаемые функциями вроде header, напр-р file и т.д. Я сейчас вспомнить не могу, но причина этого довольна интересна.

Ссылка на комментарий
Поделиться на других сайтах

urisoft>Создатель опроса не голосует насколько я понял. "You created this poll".

 

Вот, чёрт. Придётся искать как отключать :D

 

Vanish:

>у вас есть более универсальные методы?

 

Конечно. Ещё одна-две таблички в БД.

 

>так что правильнее видимо использовать flush после отправки заголовков браузеру.

 

Кстати, я тормоз! Когда идёт _перезапись_ заголовка, то, понятно, что после flush() между первым и вторым хедером, второй хедер не сработает. Заголовок-то уже ушёл! Правда, тут всё равно непонятно, почему у меня не работал второй хедер даже после того, как я убирал первый (свой). Ну да это не так и важно, когда можно flush() поставить после header() (или, вообще убрать его ;) )

 

>вообще считается правилами хорошего тона при программировании (а именно в конечном продукте, не при тестировании!) заглушать варнинги посылаемые функциями вроде header

 

Ну, лично я стараюсь программировать так, чтобы вообще варингов не было. По возможности - даже notice'ов :)

Тем более, что сейчас в PHP даже есть возможноть проверить, можно ли выводить хедеры или уже нет. А там - сам уже оценишь, насколько это для тебя важно, и или ошибку вернёшь, или не вызовешь просто функцию.

 

Исключения, конечно, бывают, например, закрытие файла или БД, когда это не важно, там проверкой можно себя не утруждать.

 

Но header для Content-Type я бы экранировать никогда не стал :)

 

>функциями вроде header, напр-р file

 

А вот file() - это жуткая функция... :) Она не позволяет залочить файл. Иногда это, конечно, терпимо, но чаще из-за этого лезут глюки ;)

Ссылка на комментарий
Поделиться на других сайтах

так что правильнее видимо использовать flush после отправки заголовков браузеру.

Лично мне кажется, что это своеобразная проверка на ошибки. Потому, что до этого flush() по структуре форума ни один header() выполняться не должен. Для общих хидеров в functions.php есть function do_headers() (теперь в class_display.php) и правильнее, с моей точки зрения вставить указанные выше хидеры кодировок именно туда. Сомневаюсь, что разработчики везде ошиблись.

Когда идёт _перезапись_ заголовка, то, понятно, что после flush() между первым и вторым хедером, второй хедер не сработает. Заголовок-то уже ушёл!

Ну я именно это и имел ввиду когда писал про "Сначала сам выдаешь text/html".

Ссылка на комментарий
Поделиться на других сайтах

  • 6 месяцев спустя...

Подскажите, а можно это как-нибудь организовать без .htaccess, у моего хостера он модулем и меня нельзя...

Добавлено в [mergetime]1098725982[/mergetime]

А если без него делаю, то просто чистый лист и всё... :D

Ссылка на комментарий
Поделиться на других сайтах

  • 1 год спустя...

Здравствуйте! Помогите разобраться.

Я решил поставить IPB 2.0.3 на локалхосте (PHP 4.4.0 Apache, MySQL 4.1.8-max), захотелось посмотреть на инферно. Нашел архив ipb_2.0.3_mods (тот в котором куча модов, в том числе и инферно). На первый взгляд все встало корректно, но при входе в скин манагер в админке получил в ответ:

mySQL query error: SELECT set_id FROM ibf_skin_templates GROUP BY set_id

mySQL error: Table 'ipb.ibf_skin_templates' doesn't exist
mySQL error code: 
Date: Tuesday 25th of April 2006 10:53:29 AM

В майадмине увидел, что таблица ibf_skin_templates не была добавлена. Решил установить ее отдельно. Но при добавлении не происходит самого заполнения, т.е. доходит только до создания полей.

Прочитав эту ветку подумал, что надо попробовать

Ищем:

CREATE TABLE ibf_skin_templates_cache

меняем

KEY template_group_name (template_group_name)

на

KEY template_group_name (template_group_name(166))

Но это не помогло.

Что надо сделать, что бы добавить эту недостающую таблицу и где именно ошибка?

Код таблицы здесь: skin_templates.sql

Ссылка на комментарий
Поделиться на других сайтах

pikachu: Если этот вопрос появился из-за ipb_2.0.3_mods, то это название архива:
Нашел архив ipb_2.0.3_mods
, а префиксы у всех таблиц ibf_ :D
Ссылка на комментарий
Поделиться на других сайтах

  • 1 год спустя...

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.