如何在Smarty中正确使用{$smarty.server.HTTP_HOST}{$smarty.server.REQUEST_URI}?

How to correctly use {$smarty.server.HTTP_HOST}{$smarty.server.REQUEST_URI} in Smarty?

我的网站上有一个博客页面,它使用 Smarty 创建帖子,我想使用它向它们添加一个 WhatsApp 分享按钮。我已经在整个互联网上搜索过了,我找到了这个:

{$smarty.server.HTTP_HOST}{$smarty.server.REQUEST_URI}

我正在尝试在我的 blog.tpl 文件中使用它:

<a class="whatsapp" href="whatsapp://send?text={$smarty.server.HTTP_HOST}{$smarty.server.REQUEST_URI}">Compartilhar</a>

我的代码有什么问题,我该如何解决?

您的代码无法正常工作有以下几个原因:

  • 很明显,您生成的消息不是 URL。它的内容类似于:Whosebug/questions/40062450/...。 URL 以协议开头(通常是 http://)。您发送的文本应该是:

    http://{$smarty.server.HTTP_HOST}{$smarty.server.REQUEST_URI}
    
  • 一个URL(如上面代码生成的)包含特殊字符,当它在另一个URL中用作参数时必须进行编码(f.e.&).当您想将 & 用作 URL 中的参数时未能正确编码会导致生成与您想象的不同的 URL。为此,Smarty 提供了 escape 变量修饰符。

  • 你生成了HTML,因为有些字符在HTML中也很特殊,所以你必须对它们进行正确的编码,否则你生成的HTML可能是无效的并且浏览器可能认为 URL 比您预期的要早结束。 escape 修饰符也可以帮助您。

综上所述,最好的方法是将URL构建成一个单独的Smarty variable,然后将其写入href属性:

{!--
  * Generate the URL we want to send using WhatsApp
  * and store it in the $url Smarty variable
  * There is no encoding here
  * --}
{capture assign=url}{strip}
    http://{$smary.server.HTTP_HOST}{$smarty.server.REQUEST_URI}
{/strip}{/capture}

{!--
 * The URL to invoke the WhatsApp app (and ask it to send $url as message) is:
 *     whatsapp://send?text={$url|escape:url}
 * --}

{!--
 * Generate correct HTML that contains the correct whatsapp URL
 * that contains as parameter the URL generated in $url
 * --}
<a class="whatsapp" href="whatsapp://send?text={$url|escape:url|escape:html}">Compartilhar</a>