Phalcon назначает переменную представления непоследовательной
Возникли проблемы с получением согласованного поведения при назначении переменных представлению. Например:
В контроллере:
$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->media ничего не возвращают.
Любой способ заставить $ media быть локальным по объему?
1 ответ
Я думаю, что понял.
Описание неправильного поведения
Вы, вероятно, объявили media
модуль в вашем DI()
, Я очень много пытался воспроизвести эту ошибку, и, наконец, получил ее, когда я сделал немой media
сервис среди конфигурационных файлов:
$di->set('media', function() {
return new \stdClass();
});
и чем получил то же поведение, что и вы - Вольт во время компиляции не уверен, какую переменную использовать и выбирает $this->media
(DI::get('media')
) вместо $media
или же $this->view->media
Вар для получения данных.
Решение
Если вы не хотите отказываться от вызова, вы найдете результат 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 по этому вопросу.