在获取向视图分配变量的一致行为时出现问题。例如:
在控制器中:
$this->view->media = Media::findFirst(['groupId=0', 'order' => 'RAND()', 'limit' => 1]);
在视图中:
{% if media is defined %}
<div class="thumbnail">
<img src="{{ static_url('img/media/thumbs/' ~ media.name) }}" class="img-round">
<div class="caption">
<h3>{{ media.title }}</h3>
<p>{{ media.description }}</p>
</div>
</div>
{% endif %}
解析如下:
<?php if (isset($media)) { ?>
<div class="thumbnail">
<img src="<?php echo $this->url->getStatic('img/media/thumbs/' . $this->media->name); ?>" class="img-round">
<div class="caption">
<h3><?php echo $this->media->title; ?></h3>
<p><?php echo $this->media->description; ?></p>
</div>
</div>
<?php } ?>
问题在于,当解析版本的模板时,$ media无法通过$ this访问,因此isset($ media)会通过,但对$ this-&gt;媒体的引用不会返回任何内容。
有什么方法可以迫使$ media在本地范围内?
答案 0 :(得分:0)
我想我明白了。
您可能已在media
中声明了DI()
模块。我正在努力重现这个错误,最后在我在配置文件中设置一个愚蠢的media
服务时得到它:
$di->set('media', function() {
return new \stdClass();
});
并且得到了相同的行为 - Volt在编译期间不确定,使用什么变量并选择$this->media
(DI::get('media')
)而不是$media
或$this->view->media
var用于获取数据。
如果您不想在该变量名称下调用findFirst结果,您可以直接使用View in volt来绕过它:
{% if view.media is defined %}
<div class="thumbnail">
<img src="{{ static_url('img/media/thumbs/' ~ view.media.name) }}" class="img-round">
<div class="caption">
<h3>{{ view.media.title }}</h3>
<p>{{ view.media.description }}</p>
</div>
</div>
{% endif %}
它会生成$this->view->media
次来电而不是$this->media
次。
该问题的+1。