Маленькая ошибка PHP Слишком мало аргументов для работы на php72 - PullRequest
0 голосов
/ 19 декабря 2018

Мне нужна помощь для исправления небольшой проблемы с моим 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">

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Отсутствующие аргументы будут вызывать предупреждение только до PHP / 7.0, но начиная с PHP / 7.1 они выдают фатальную ошибку ( demo ).Из 7.0 руководства по миграции :

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

Скорее всего, он никогда не работал, но вы настроили PHP для скрытия информации об ошибках - что больше не нужно для фатальных ошибок, потому что они все равно прерывают выполнение.

Поскольку вы никогда не работалииспользуйте второй аргумент функции, просто полностью избавьтесь от него.

0 голосов
/ 19 декабря 2018

см. 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">
...