Тема для никого - 1.10.7 и PHP 5.2.12 (часть 3)

Если программа полезна, ее обязательно переделывают
(Законы Мерфи для программистов)


Часть 2

Запустив сайт я проверил все доступные после установки разделы. Всё работало.
Однако интуиция подсказывала, что расслабляться преждевременно!
Опасения подтвердились в админке. При входе в разделы "Меню" и "Модули" вывалились ошибки:

Parse error: syntax error, unexpected T_FUNCTION in \admin\applets\menu.php on line 107
и
Parse error: syntax error, unexpected T_FUNCTION in \admin\applets\modules.php on line 172
соответственно.

Код и там и там абсолютно одинаковый:

$fields[] = array('title'=>'id', 'field'=>'id', 'width'=>'30');
$fields[] = array(
'title'=>$_LANG['AD_TITLE'],
'field'=>array('title','titles'), 'width'=>'',
'link'=>'?view=modules&do=edit&id=%id%',
'prc'=> function ($i){
$i['titles'] = cmsCore::yamlToArray($i['titles']);
// переопределяем название пункта меню в зависимости от языка
if(!empty($i['titles'][cmsConfig::getConfig('lang')])){
$i['title'] = $i['titles'][cmsConfig::getConfig('lang')];
}
return $i['title'];
}
);

А конкретно, строка, вызывающая ошибку:

'prc'=> function ($i){

Что тут происходит?
Instant с некоторых пор поддерживает несколько языков, а именно русский и английский. В связи с этим, теперь такие элементы как названия рубрик или названия модулей можно указать на двух языках, а сайт, в зависимости от выбранного в настройках языка, будет отображать нужный вариант названия.
При отображении таблиц "Меню" и "Модули" это достигается с помощью ещё одного новшества PHP 5.3 — анонимных функций, также известных как "замыкания" (closures).
Одной из возможностей применения замыканий является присвоение переменной не какого-то конкретного значения, а функции, которая в момент использования переменной выполнится и выдаст какой-либо результат.
Конкретно в этом случае функция присваивается элементу 'prc' в массиве $fields[]
Но PHP 5.2.12 с анонимными функциями не знаком, поэтому и образуется ошибка.

Решение этой, казалось бы неразрешимой ситуации, находится тут же, в файле menu.php, ниже на 3 строки.
Там элементу 'prc' из массива $fields[] тоже присваивается функция, но не в виде кода, а просто в виде названия. Сама же функция прописана отдельно, привычным для всех образом.
Итак, для устранения ошибок в обоих файлах меняем

'prc'=> function ($i){
$i['titles'] = cmsCore::yamlToArray($i['titles']);
// переопределяем название пункта меню в зависимости от языка
if(!empty($i['titles'][cmsConfig::getConfig('lang')])){
$i['title'] = $i['titles'][cmsConfig::getConfig('lang')];
}
return $i['title'];
}

на

'prc'=>'cpLangTitle'

а в файле cp.php размещаем функцию:

function cpLangTitle($i){
$i['titles'] = cmsCore::yamlToArray($i['titles']);
// переопределяем название пункта меню в зависимости от языка
if(!empty($i['titles'][cmsConfig::getConfig('lang')])){
$i['title'] = $i['titles'][cmsConfig::getConfig('lang')];
}
return $i['title'];
}

Почему в файле cp.php, если ошибки происходят в файлах menu.php и module.php ?
Вообще-то можно было сделать две функции, одну в файле menu.php, а вторую module.php.
НО так как функции в обоих файлах совершенно одинаковые, а массив $fields[] в обоих случаях передаётся в функцию cpListTable(), расположенную как раз в файле cp.php, то и необходимую нам функцию cpLangTitle() логично разместить в нём же. Оптимизация кода опять же, так как функция будет прописана один раз вместо двух.


Ну вот, с этой проблемой тоже всё понятно.
Не понятно только зачем? Зачем надо было городить городушки с анонимными функциями если решение уже есть? Тут же. Готовое и проверенное!

to be continue...
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.