Вызов неопределенного метода Gridfield Silverstripe - PullRequest
2 голосов
/ 25 марта 2019

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

Это добавит вкладку галереи с GridField, которая позволит пользователю добавлять изображения.

Неуверен, что отсутствует, так как он работает в других проектах.

[Чрезвычайная ситуация] Uncaught Ошибка: вызов неопределенного метода MyProject \ Extensions \ BlogPostExtension :: BlogGalleryImages ()

<?php 


namespace MyProject\Extensions;


use SilverStripe\ORM\DataExtension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldEditButton;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
use SilverStripe\View\Requirements;
use MyProject\Model\BlogGalleryImage;

class BlogPostExtension extends DataExtension {

    private static $db = [
        'SortOrder' => 'Int'
    ];

    private static $has_many = [
        "BlogGalleryImages" => BlogGalleryImage::class,
    ];

    public function updateCMSFields(FieldList $fields) {
        // Add fields here

        $fields->removeByName("SortOrder");
        $options = $this->BlogGalleryImages();
        $gridFieldConfig = GridFieldConfig::create()->addComponents(
                new GridFieldAddNewButton('toolbar-header-right'),
                new GridFieldToolbarHeader(),
                new GridFieldSortableHeader(),
                new GridFieldDataColumns(),
                new GridFieldPaginator(80),
                new GridFieldDetailForm(),
                new GridFieldEditButton(),
                new GridFieldDeleteAction()
        );
        $itemsTable = new GridField("BlogGalleryImages","Gallery Image",$options,$gridFieldConfig);
        $fields->addFieldToTab('Root.Gallery',$itemsTable);

    }

}

Вот файл Dataobject, который должен вызываться для класса BlogPostExtension

<?php 

namespace MyProject\Model;

use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\ORM\DataObject;

class BlogGalleryImage extends DataObject{

    private static $singular_name = 'Gallery Image';

    private static $db = array(
        'Title' => 'Varchar(256)',
        'SortOrder' => 'Int'
    );

    private static $has_one = array(
        'Image' => Image::class,
        'BlogPosts' => BlogPost::class,
    );

    private static $owns = [
        'Image',
    ];

    private static $summary_fields = array(
        'Thumbnail',
        'Title'
    );

    private static $table_name = 'MyProject_BlogGallery';


    private static $default_sort = "SortOrder ASC";

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

        $fields->removeByName("SortOrder");
        $fields->removeByName("BlogPostID");
        $fields->addFieldToTab("Root.Main", new TextField("Title","Title"));
        $fields->addFieldToTab("Root.Main", $uploadfield = UploadField::create("Image","Image"));
        $uploadfield->setFolderName("BlogGallery");

        return $fields;
    }

    public function getThumbnail(){
        if ($icon = $this->Image()){
            return $icon->CMSThumbnail();
        }else{
            return '(No Image)';
        }
    }

}

1 Ответ

1 голос
/ 25 марта 2019

Вы вызываете метод экземпляра для вашего расширения, которого не существует:

$options = $this->BlogGalleryImages();

Это на самом деле магический метод, который представляет ваши отношения has_many "BlogGalleryImages" - он поддерживается DataObject. Вам необходимо обратиться к владельцу расширения, чтобы получить к нему доступ:

$options = $this->getOwner()->BlogGalleryImages();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...