1

我为徽标上传创建自定义字段,SiteConfig并在上传徽标Settings并尝试在.ss模板中呈现它之后。渲染后模板中没有显示任何内容。我使用的这段代码Silverstripe v3一切正常。现在在v4不工作。

这是我的Extension

class SiteConfigExtension extends \SilverStripe\ORM\DataExtension
{
    private static $db = array (
        'FacebookLink' => 'Varchar',
        'TwitterLink' => 'Varchar',
        'GoogleLink' => 'Varchar',
    );

    private static $has_one = array(
        'Logo' => Image::class,
        'DefaultImage' => Image::class
    );

    public function updateCMSFields(FieldList $fields)
    {
        parent::updateCMSFields($fields);


        $fields->addFieldsToTab('Root.Social', array (
            TextField::create('FacebookLink','Facebook'),
            TextField::create('TwitterLink','Twitter'),
            TextField::create('GoogleLink','Google'),
        ));

        $fields->addFieldsToTab('Root.Main', array(
            $logo = UploadField::create('Logo', 'Logo'),
            $defaultImage = UploadField::create('DefaultImage', 'Default Image'),
        ));

        $logo->setFolderName('Logo');
        $defaultImage->setFolderName("Settings");
    }
}

这是我的模板文件header.ss

    <% with $SiteConfig %>
                    <div style="display: inline-block;">
                    <div style="float: left;">
                        <h1 id="logo">
                            <% if $Logo %>
                                <a>$Logo.SetWidth(50)</a>
                            <% end_if %>
                        </h1>
                    </div>
                    <div id="logo-tagline" style="float:left;">
                        <% if $Title %>
                            <h1>$Title</h1>
                        <% end_if %>
                        <% if $Tagline %>
                            <strong>$Tagline</strong>
                        <% end_if %>
                    </div>
                </div>
<% end_with %>

我想念什么?我做错了什么?感谢您的回答。

4

1 回答 1

2

图像在 SilverStripe 4 中进行了版本控制,因此您需要确保在保存 SiteConfig 对象时发布图像。

您没有提及您使用的是哪个版本的 SilverStripe 4 -到目前为止,此问题已在 4.1.2 和 4.2.0-beta1 中进行了研究。这意味着如果您将所有权 API应用于这些相关对象,那么它们将在保存 SiteConfig 模型时自动发布,例如:

private static $owns = ['Logo', 'DefaultImage'];

如果您使用的是 SilverStripe 4.1.2 或更新版本,那么以上就是您需要做的所有事情。

对于早于此的版本,您可以在 SiteConfigExtension 中实现自己的钩子:

public function onAfterWrite()
{
    if ($this->owner->Logo()->exists()) {
        $this->owner->Logo()->publishSingle();
    }
    // ... same for other has_ones that are versioned
}
于 2018-06-26T22:45:15.997 回答