Перейти к публикации
TheAndrey

руководство Адаптация IP.Board 3.4 к PHP 7

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

TheAndrey

image.png

Не так давно закончилась поддержка пятой версии PHP. Это значит, пришло время переходить на новый и быстрый PHP 7.

PHP эволюционирует, можно сказать «взрослеет». Требования к качеству кода выросли – плохо написанные скрипты при переходе на новую версию перестанут работать. Такая участь постигла IP.Board 3.4. К сожалению, ждать обновления от разработчиков не стоит, поддержка продукта полностью прекращена 1 апреля 2017. Если вы по каким-либо причинам не можете или не желаете обновляться до IPS 4, то это руководство для вас. Я хочу поделиться своим опытом «продления жизни» старому движку. Это не так сложно.

 

[] operator not supported for strings и Illegal string offset

Fatal error: Uncaught Error: [] operator not supported for strings in admin/applications/forums/sources/classes/topics.php:1895

Суть этой ошибки проста: мы пытаемся добавить элемент не в массив, а в строку. В PHP 7 появилась поддержка типизации, потому этот трюк приводит к ошибке:

$foo = "";
$foo[] = "bar"; // Fatal error: [] operator not supported for strings
echo $foo['core']; // Warning: Illegal string offset 'core'

И такой момент встречается в нескольких местах. Решается исправлением объявления переменной. Чуть выше строки, указанной в ошибке найдите такой код:

$topic['pages']	= ""; // Было
$topic['pages']	= []; // Теперь это массив (это сокращённая замена array())

Аналогичное повторяем в ips_kernel/classCustomFields.php после строки: class customFieldDrop extends customFieldPlugin

public $parsed      = ''; // Было
public $parsed      = []; // Стало

 

count(): Parameter must be an array or an object that implements Countable

Warning: count(): Parameter must be an array or an object that implements Countable in admin/sources/classes/text/parser.php on line 2395

Ошибка приведения типа. Скорее всего, функции передали пустую строку или NULL. Решается здесь это добавлением проверки типа.

if ( ! count( $this->_sortedSmilies ) ) // Было
if ( empty( $this->_sortedSmilies ) ) // count() заменили на empty(), так как он более универсален для проверки на пустоту

admin/sources/classes/like/composite.php исправляем аналогичным образом:

if ( is_numeric($relId) && count($data) ) // Было
if ( is_numeric($relId) && !empty($data) ) // Стало

 

Сломанный шаблонизатор

Вместо форума скорее всего, вы будете лицезреть вот такую ошибку:

Fatal error: Redefinition of parameter $forum_data in cache/skin_cache/cacheid_1/skin_forum.php on line 424 

Это связана с неправильной генерацией кода функции. В объявлении функции более одного раза повторяется имя аргумента. В данном случае это $forum_data. Ремонт шаблонизатора был самой сложной частью, но для вас он будет простым благодаря готовому решению от меня 😎

  1. Находим и открываем файл ips_kernel/classTemplateEngine.php
  2. Ищем вот такой фрагмент кода (можно по комментарию искать):
    //----------------------------------------
    // Get function arguments
    //----------------------------------------
    
    foreach( $_tmp_func_data as $_i ) {
    	preg_match( "#".'\$'.'(\w+)\s*(=|,|$)#i', $_i, $match );
    	
    	if( count($match) ){
    		$_final[] = '$'.$match[1];
    	}
    }
  3. Ниже вставляем мой авторский фикс, который добавляет суффиксы к дублирующимся параметрам функции. Обязательно должен стоять перед строчкой: $clean_func_data = implode( ",", $_final );
    // TODO TheAndrey start: PHP 7 compat fix
    $knownParamNames = [];
    $paramsFixed = false;
    for($i = count($_tmp_func_data) - 1; $i >= 0; $i--) { // Обходим с конца, так как параметры, что в конце переопределдяют значения предыдущих
    	preg_match("#".'\$'.'(\w+)\s*(=|,|$)#i', $_tmp_func_data[$i], $matches);
    	
    	if(count($matches)) {
    		$argName = $matches[1];
    		
    		$argUseCount = intval($knownParamNames[$argName]) + 1;
    		$knownParamNames[$argName] = $argUseCount;
    		if($argUseCount > 1) {
    			$argName = '$PARENT' . ($argUseCount - 1) . '_' . $argName; // Добавляем префикс повторяющимся (суть фикса)
    			$_tmp_func_data[$i] = $argName; // TODO: съедает значение по умолчанию
    			$paramsFixed = true;
    		}
    	}
    }
    
    if($paramsFixed) $normal_func_data = implode(',', $_tmp_func_data); 
    // TODO TheAndrey end
  4. Сохраняем и закрываем файл. Теперь нужно запустить перестроение шаблонов, чтобы изменения вступили в силу: Админцентр > Внешний вид > Инструменты > Обновление кеш-файлов.

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...