捕获并处理未找到的 smarty 提取文件

Catch and handle smarty fetch file not found

我有一些聪明的模板代码如下:

{fetch file="https://example.com/file.php" assign='value'}

但是,如果无法访问 URL,则页面会出现 500 错误。错误日志显示“{fetch} 无法读取资源”。

如果 URL 不可用,我如何捕获上述内容以避免页面崩溃?例如如果它是一个 var,我可以用 isset 检查它是否已设置,但由于它是 url 我不知道怎么说“如果找不到,请执行此操作”。

尝试了以下但没有成功。

{if file_exists('https://example.com/file.php')} 
{fetch file="https://example.com/file.php" assign='value'}
{/if}

需要使用smarty功能(将此功能移至smarty功能目录):

function smarty_function_checkurl($params)
{
    if (isset($params['url'])) {

        $url      = $params['url'];
        $parsed   = parse_url($url);
        $domain   = str_replace('www.', '', $parsed['host']);
        $response = checkdnsrr($domain);

        if ($response) {

            $file_headers = @get_headers($url);

            if ($file_headers && strpos($file_headers[0], ' 200 OK') !== false) {
                return true;
            }
        }

    }

    return false;
}

然后在 .tpl 文件中:

{if {checkurl url="https://example.com/file.php"}}
    YES
    {fetch file="https://example.com/file.php" assign='value'}
{else}
    NOT
{/if}

老实说吧。视图不是此类事物的最佳位置。来自@r_a_f的建议是可以的,但最好将它放在模块的核心中。

然后,如果您可以获取此外部资源,则可以将其与您需要的其他数据一起传递给视图。

您甚至可以为此使用一个小部件: https://devdocs.prestashop.com/1.7/modules/concepts/widgets/

getWidgetVariables 中,您可以 运行 进行适当的检查。