【问题标题】:Laravel- Why do I get a parse error when writing HTML inside an @if in a blade.php file?Laravel-为什么在blade.php文件的@if中写入HTML时会出现解析错误?
【发布时间】:2018-11-01 15:43:28
【问题描述】:

我正在开发一个 Laravel/Angular 应用程序,其中一个页面具有将用户输入表单的一些信息导出为 PDF 的功能。

PDF 写在一个 Blade.php 文件中:

<html>
<head>
    <title>App - Provisional Reminder</title>
    <link rel="stylesheet" href="{{ url('') }}/css/pdf.css">
</head>

<body style="...">
    @foreach ($items as $item)
        <table>
            ... HTML here...
        </table>

        @if($item['itemDetail']['itemProperty'] !== 'ParticularItemProperty')
            <p style="page-break-before: always"></p>
            @include('pdfs.partials.request')
        @endif
        ... A few more simiar @if statements here...
    @endforeach
</body>
</html>

目前,PDF 始终由三页组成(每一页显示有关用户输入表单的信息的特定方面的信息。

我想根据用户导出为 PDF 的任何项目的 itemProperty 的值,使生成的 PDF 的内容成为有条件的。

我尝试用@if@else@endif 声明包围PDF 的内容:

<html>
<head>
    <title>App - Provisional Reminder</title>
    <link rel="stylesheet" href="{{ url('') }}/css/pdf.css">
<head>

@if(( count( {{ $item['itemDetail'] }} ) === 1 ) && ({{ $item['itemDetail']['itemProperty'] }} === '1010'))
<body style="...">
    <p>if statement run in blade.php</p>
</body>
@else
<body>
    <p>else statement run in blade.php</p>
</body>
@endif

</html>

我无法在我的@if@else@endif PHP 语句中有条件地显示blade.php 文件的原始内容,所以只是尝试显示一些非常基本的HTML - 如上所述,只是为了看到代码实际上正在运行/正确生成。

但是,当我单击链接以生成并下载 PDF,并在将生成的 Blade.php 文件中包含此代码时,我在浏览器中收到一条消息:

生成 PDF 时出现问题

浏览器控制台显示:

解析错误:语法错误,意外'

为什么@if 会导致此错误? HTML 显然很好,因为如果我删除 @if 并下载文件,它会正确显示。

我认为这一定与我在 @if() 语句中引用的 PHP 变量有关,就好像我将 @if() 更改为简单的东西,例如:

@if( 1 === 1)

然后尝试下载PDF,它下载并正确打开,我可以看到PDF页面上显示if statement run in reminder.blade.php的文字。

我在引用我的@if() 所基于的 PHP 变量时做错了什么?

【问题讨论】:

  • @if(( count( {{ $item['itemDetail'] }} ) === 1 ) &amp;&amp; ({{ $item['itemDetail']['itemProperty'] }} === '1010')) - 为什么{{ }} 在这个if 声明中?他们不应该在那里。 {{ }} 用于简单地回显值。
  • 使用@stuff时,您已经在模板上下文(解析器)中,因此无需使用另一个模板函数{{}},因为您已经在其中了;解析器试图将其视为混乱的 php 代码

标签: php laravel pdf


【解决方案1】:
<html>
<head>
    <title>App - Provisional Reminder</title>
    <link rel="stylesheet" href="{{ url('') }}/css/pdf.css">
<head>

@if(( count(  $item['itemDetail']  ) === 1 ) && ( $item['itemDetail']['itemProperty']  === '1010'))
<body style="...">
    <p>if statement run in blade.php</p>
</body>
@else
<body>
    <p>else statement run in blade.php</p>
</body>
@endif

</html>

在刀片中使用 {{ }} 仅用于将字符串值回显到视图。和

一样

&lt;?php echo $item['itemDetail'] ; ?&gt; 在 if 语句中毫无意义。

【讨论】:

  • 感谢您的回答。我对 Laravel/PHP 很陌生,所以没有意识到我不需要大括号。我尝试了你的建议,并删除了{{ }},但我现在在尝试下载 PDF 时在控制台中得到undefined variable: item - 我需要参考/使用 PHP 控制器文件,其中变量是从内部定义/初始化的Blade.php 文件不知何故?
  • 你很接近。您需要将您的值从控制器返回到视图,以便您可以在那里访问它们。这有点像从函数返回值,但 laravel 允许您在刀片上返回它们并在那里使用它们查看此链接以获得更多帮助:laravel.com/docs/5.7/views
  • 好的,谢谢。因此,鉴于$item 是一个变量,其值将根据用户选择的选项确定,我将如何传递它?您发布的链接似乎显示了如何传入字符串变量,但我的 $item 变量在这里是一个更复杂的数据类型......
  • 您还可以传递数组,而不仅仅是字符串。它的工作原理就像正常的回报工作。您处理数组的方式取决于您,但我想如果是这种情况,您将需要在刀片中设置一个循环。
  • 虽然变量不是数组,但它是一个对象——具有多个属性——其中一些属性本身也是复杂的数据类型。
猜你喜欢
  • 1970-01-01
  • 2013-10-20
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多