【问题标题】:has_many and has_one relation SilverStripehas_many 和 has_one 关系 SilverStripe
【发布时间】:2016-12-07 10:04:30
【问题描述】:

我按照https://www.silverstripe.org/learn/lessons/working-with-data-relationships-has-many?ref=hub 上的教程为我的主页创建了一些特色项目。但不知何故我错过了一件,因为我收到了这个错误

[错误] 未捕获的异常:在“HomePageFeatured”类上找不到 has_one,从“HomePage”到“HomePageFeatured”的 has_many 关系需要“HomePageFeatured”上的 has_one

主页.php

<?php
/**
 * Defines the HomePage page type
 */

class HomePage extends Page {
   // private static $db = array(
   // );
   // private static $has_one = array(
   // );

    private static $has_many = array (
        'Featured' => 'HomePageFeatured'
    );

    public function getCMSFields() {
            $fields = parent::getCMSFields();
            $fields->addFieldToTab('Root.Featured', GridField::create(
                'Featured',
                'Hervorgehobene Produkte',
                $this->Featured(),
                GridFieldConfig_RecordEditor::create()
            ));

            return $fields;
        }

   private static $icon = "themes/hstheme/images/treeicons/home";
}

class HomePage_Controller extends Page_Controller {

}

HomePageFeatured.php

<?php
/**
 * Holds the featured items from the Homepage
 */

class HomePageFeatured extends DataObject {
   private static $db = array(
        'Title' => 'Varchar',
        'Description' => 'Text'
   );
   private static $has_one = array(
        'Photo' => 'Image',
        'HomePageFeatured' => 'HomePageFeatured'
   );

   public function getCMSFields() {
        $fields = FieldList::create(
            TextField::create('Title'),
            TextareaField::create('Description'),
            $uploader = UploadField::create('Photo')
        );

        $uploader->setFolderName('featured-photos');
        $uploader->getValidator()->setAllowedExtensions(array('png','gif','jpeg','jpg'));

        return $fields;
    }

}

据我了解,问题在于 HomePageFeatured.php 中的 $has_one。但它有一个来自 HomePageFeatured 的参考。

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    HomePageFeatured 需要一个 has_one of 'HomePage'

    class HomePageFeatured extends DataObject {
       private static $has_one = array(
            'Photo' => 'Image',
            'Parent' => 'HomePage',
       );
    }
    

    【讨论】:

    • 非常感谢!教程中有一个“提示”“通常,像这样的互惠 has_one 只能以父类命名。”不知道它有一个关键字 Parent。
    • @suntrop 'Parent' 在这种情况下只是您的HomePageFeatured 和您的HomePage 之间的关系名称。这个关系名称可以是任何东西。我建议您小心使用 'Parent' 作为关系的名称,因为这已经是所有 Pages 上的关系,在站点树层次结构中引用它的父级。因此,如果您的HomePageFeatured 扩展了Page 而不是DataObject,则使用'Parent' 作为关系名称可能会产生意想不到的后果。本教程建议您这样做:private static $has_one = ['HomePage' =&gt; 'HomePage'].
    猜你喜欢
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多