Если программа полезна, ее обязательно переделывают
(Законы Мерфи для программистов)
(Законы Мерфи для программистов)
Часть 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...