Мне нужна помощь в устранении небольшой проблемы с моим PHP-скриптом для работы на php7.2, приведенный ниже код работает на php7.0, но не работает на php7.1 или 7.2 🙁
Ошибка при отладке:
ArgumentCountError: Too few arguments to function smarty_function_gravatar(), 1 passed and exactly 2 expected in public_html/includes/hooks/custom-function.php: Line 91
Stack trace:
#0 /public_html/includes/hookfunctions.php(0): smarty_function_gravatar(Array)
#1 /public_html/includes/clientareafunctions.php(0): run_hook('ClientAreaPage', Array)
#2 /public_html/login.php(0): outputClientArea('login', false, Array)
#3 /public_html/member/viewticket.php(0): unknown()
#4 {main}
Мой оригинальный код в строке 91:
function smarty_function_gravatar($params, &$smarty) {
$email = (isset($params['email']) ? trim(strtolower($params['email'])) : '');
$rating = (isset($params['rating']) ? $params['rating'] : 'R');
$url = "https://www.gravatar.com/avatar/".md5($email) . "?r=".$rating;
if(isset($params['default']))
$url .= "&d=".urlencode($params['default']);
if(isset($params['size']))
$url .= "&s=".$params['size'];
if(isset($params['assign'])) {
$smarty->assign($params['assign'], $url);
return;
}
return $url;
}
По шаблону .tpl
<img src="{gravatar email="{if $reply.name eq 'Admin 1'}admin1@domain.com{elseif $reply.name eq 'Admin 2'}admin2@domain.com{elseif $reply.name eq 'Admin 3'}admin3@domain.com{elseif $reply.name eq 'Admin 4'}admin4@domain.com{/if}" size="140"}" height="60" width="60">
{elseif $reply.contactid} <img src="{gravatar email="$replyemail" size="140"}" height="60" width="60">
{elseif $reply.userid}
<img src="{gravatar email="$replyemail" size="140" default="/default-avatar.png"}" height="60" width="60">
{else}
<img src="{gravatar email="$replyemail" size="140" default="/default-avatar.png"}" height="60" width="60">
Отсутствующие аргументы будут вызывать предупреждение только до PHP / 7.0, но начиная с PHP / 7.1 они выдают фатальную ошибку (демонстрация). От 7.0 руководство по миграции:
Ранее было бы выдано предупреждение для вызова пользовательских функций со слишком малым количеством аргументов. Теперь это предупреждение переведено в исключение ошибки. Это изменение касается только пользовательских функций, а не внутренних функций.
Скорее всего, он никогда не работал, но вы настроили PHP для сокрытия информации об ошибках — что больше не нужно для фатальных ошибок, потому что они все равно прерывают выполнение.
Поскольку вы никогда не используете второй аргумент функции, просто полностью избавьтесь от него.
увидеть kevinpapst.de (на немецком); это с 2008 года и так синтаксис …
между тем документация говорит что-то еще о «Написание плагинов»:
Как правило, в настоящее время оценивается шаблон
Smarty_Internal_Template
Объект всегда передается плагинам как последний параметр с двумя исключениями:
модификаторы не проходят мимо Smarty_Internal_Template
объект вообще.
блоки проходят мимо $ repeat после Smarty_Internal_Template
Объект для обратной совместимости со старыми версиями Smarty.
например:
function smarty_function_gravatar(array $params, Smarty_Internal_Template $template) {
$email = (isset($params['email']) ? trim(strtolower($params['email'])) : '');
$rating = (isset($params['rating']) ? $params['rating'] : 'R');
$url = "https://www.gravatar.com/avatar/".md5($email) . "?r=".$rating;
if(isset($params['default'])) {
$url .= "&d=".urlencode($params['default']);
}
if(isset($params['size'])) {
$url .= "&s=".$params['size'];
}
if(isset($params['assign'])) {
$template->smarty->assign($params['assign'], $url);
return;
}
return $url;
}
использоваться одинаково:
{gravatar email="example@example.com" size="60" rating="X" assign="gravatarURL" default="http://www.example.com/default_gravatar.jpg"}
<img src="{$gravatarURL}" height="60" width="60">