Я не могу получить доступ к образу has_one из конкатенации VirtualPage при зацикливании

У меня есть тип страницы

ProductPage

что $ has_one FeatureImage

Существует виртуальная страница, которая ссылается на одну из страниц ProductPages

Когда я нахожусь на странице, которая зацикливает дочерние элементы, где один из дочерних элементов является виртуальной страницей, я могу отобразить все поля, кроме поля FeatureImage.

class ProductPage extends Page
{
private static $db = [
'TeaserText'=>'Varchar'
];

private static $has_one = [
'LinkedProduct'=>'Product',
'FeatureImage'=>Image::Class
];
private static $many_many = [

];
private static $owns = [
'FeatureImage'
];

public function getCMSFields(){
$fields = parent::getCMSFields();

$featureField = UploadField::create('FeatureImage', 'Feature Image')->setFolderName('FeatureImages')->setDescription("This image appears in the category pages. 400x400px");
$teaserField = TextField::create('TeaserText', 'Teaser Text')->setDescription("This text appears in the category pages");
$fields->addFieldToTab('Root.Main', $featureField, 'Metadata');
$fields->addFieldToTab('Root.Main', $teaserField, 'Metadata');

$productLinkField = DropdownField::create('LinkedProductID', 'Link a Product', Product::get()->map('ID', 'ProductName'));
$productLinkField->setEmptyString('(Select one)');

$fields->addFieldToTab('Root.Main', $productLinkField, 'Content');

$productLinkField->addExtraClass('stacked');
$featureField->addExtraClass("stacked");
$teaserField->addExtraClass("stacked");

return $fields;
}
}

Шаблон СС

<% loop $Children %>
<div class="category-card mb-5">
<div class="row">
<div class="col-md-4">

<img src="$FeatureImage.URL" class="fluid-image"/>
//This renders for standard ProductPage children

</div>
<div class="col-md-8 category-card-body">
<h4 class="category-card-title"><a href="$Link">$MenuTitle</a></h4>
<p class="category-card-text">$TeaserText</p>
//This TeaserText renders fine.

<a href="$Link" class="category-card-link btn btn-info">view details</a>
</div>
</div>
</div>
<% end_loop %>

2

Решение

Это может быть крайний вариант использования, но я думаю, что он действителен и опубликует мое решение для тех, кто хочет сделать то же самое.

Класс VirtualPage будет извлекать все поля базы данных, но не будет устанавливать отношения has_one, поэтому вы не сможете получить к нему доступ с виртуальной страницы.

Из VirtualPage.php:

* Note: This Only duplicates $db fields and not the $has_one etc..

Мое решение состоит в том, чтобы включить метод в класс виртуальной страницы, который будет возвращать фактический объект родительской страницы с помощью <% с%>

public function getTheParentPageObject(){
$page = DataObject::get_by_id(SiteTree::class, $this->getField('CopyContentFromID'));
return $page;
}

Это позволяет мне вызывать метод внутри моего цикла в шаблоне и извлекать все поля, которые остались вне виртуализации

    <% loop $Children %>
<div class="category-card mb-5">
<div class="row">
<div class="col-md-4">

<% if $ClassName == "SilverStripe\CMS\Model\VirtualPage" %>
<% with $getTheFeaturedImageById() %>
<img src="$FeatureImage.URL" class="fluid-image"/>
<% end_with %>

<% else %>
<img src="$FeatureImage.URL" class="fluid-image"/>

<% end_if %>

</div>
<div class="col-md-8 category-card-body">
<h4 class="category-card-title"><a href="$Link">$MenuTitle</a></h4>
<p class="category-card-text">$TeaserText</p>
<a href="$Link" class="category-card-link btn btn-info">view details</a>
</div>
</div>
</div>
<% end_loop %>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]