SilverStripe 3.6.1 - if / else_if语句未在模板中设置正确的字段

时间:2017-08-23 13:14:00

标签: php if-statement silverstripe

我正在尝试在我的主页模板中使用if / else_if语句来检查2个字段中的哪一个具有值。根据具有值的字段,使用所述变量的值设置链接。

然而,就目前而言,我的设置不起作用。我有一个填充了ImageExternalLink字段的项目,但该语句似乎仍然认为它是一个内部链接。

见下文 - 此语句始终将链接设置为内部链接。这几乎就像else_if永远不会被执行,但是,我不知道为什么?我觉得好像我正在根据文档正确地进行设置。

div class="halfColumn">
   <% if $ImageLinkInternalURL.Link %>
     <a href="$ImageLinkInternalURL.Link">
         <p>Internal Link</p>
     </a>
    <% else_if $ImageExternalLink %>
        <a href="$ImageExternalLink">
            <p>External Link</p>
        </a>
    <% else %>
        <img class="dropShadow" src="$Image.URL" style="max-height: 220px;">
    <% end_if %>
</div>

作为参考,这里是HomePageCallout.php文件供参考,这是创建ImageLinkInternalURL和ImageExternalLink字段的地方:

<?php

class HomePageCallout extends DataObject {

    private static $db = array(
        'SortOrder'     => 'Int',
        'ButtonText'    => 'varchar',
        'Header'        => 'varchar',
        'ImageExternalLink'  => 'varchar',
        'Description'   => 'HTMLText'
    );

    static $default_sort = "SortOrder ASC";

    // One-to-one relationship with gallery page
    private static $has_one = array(
        'Image' => 'Image',
        'Page' => 'Page',
        'ImageLinkInternalURL' => 'SiteTree',
    );

    // tidy up the CMS by not showing these fields
    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->removeFieldFromTab("Root.Main","PageID");
        $fields->removeFieldFromTab("Root.Main","SortOrder");

        $fields->addFieldToTab("Root.Main", new NumericField("SortOrder"));
        $fields->addFieldToTab("Root.Main", new TextField("ImageExternalLink"), "SortOrder");

        return $fields;
    }

    // Tell the datagrid what fields to show in the table
    public static $summary_fields = array(
        'ID' => 'ID',
        'Header' => 'Header',
        'Thumbnail' => 'Thumbnail',
    );

    // this function creates the thumnail for the summary fields to use
    public function getThumbnail() {
        return $this->Image()->CMSThumbnail();
    }

    public function canEdit($member = NULL) {
        return true;
    }

    public function canDelete($member = NULL) {
        return true;
    }

    public function canCreate($member = NULL){
        return true;
    }

    public function canPublish(){
        return true;
    }

    public function canView($member = NULL){
        return true;
    }
}

1 个答案:

答案 0 :(得分:2)

当你在has_one中有一个$ imageLinkInternalURL Sitetree对象时,

$ImageLinkInternalURL.Link将总是返回一些字符串。

一种解决方案是通过检查当前对象的ID $ImageLinkInternalURL来测试当前对象是否有$ImageLinkInternalURLID对象。

<div class="halfColumn">
   <% if $ImageLinkInternalURLID %>
     <%-- we have a has_one, use this --%>
     <a href="$ImageLinkInternalURL.Link">
         <p>Internal Link</p>
     </a>
    <% else_if $ImageExternalLink %>
        <%-- we have an external link defined --%>
        <a href="$ImageExternalLink">
            <p>External Link</p>
        </a>
    <% else %>
        <%-- fallback --%>
        <img class="dropShadow" src="$Image.URL" style="max-height: 220px;">
    <% end_if %>
</div>