Как автоматически публиковать файлы, загруженные в объект данных в администраторе модели Silverstripe

В Silverstripe 4 загруженный файл должен быть опубликован, прежде чем он станет видимым для публичной части сайта.

Если я создаю $Page с помощью $has_one Image::Class, а затем назначаю это изображение для $owns[], загруженное изображение будет опубликовано при публикации страницы.

Однако, если я создам следующую структуру данных, это не так.

Class Item extends DataObject{
    $has_one[
        'ItemImage'=>Image::Class,
        'Catalog'=>'Catalog'
    ];

    $owns[
        'ItemImage'
    ]
}

Class Catalog extend DataObject{
    $has_many[
        'Items'=>'Item'
    ]
    $owns[
        'Items'
    ]

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

        $fields->addFieldToTab('Root.Items', GridField::create('Items', 'Items', $this->Items(), GridFieldConfig_RecordEditor::create()));

        return $fields;

    }
}

Если я создаю каталог и в нем создаю элементы с изображениями, а затем сохраняю его, он не будет публиковать загруженные изображения. Мне придется вручную: 1. Выбрать изображение 2. Редактировать оригинал 3. Опубликовать

Должен быть более простой способ для пользователя.

2 ответа

Решение

В настоящее время это обсуждается на GitHub в нескольких репозиториях.

Решением на данный момент является либо публикация изображений вручную в onAfterWrite, либо версия вашего DataObject, предпочтительно через YML:

My\Data\Object
  extensions:
    - Versioned

Ваш объект данных должен расширить Versioned расширение. Страницы уже имеют это в SiteTree объект.

Class Item extends DataObject
{
    private static $has_one = [
        'ItemImage' => Image::Class,
        'Catalog' => 'Catalog'
    ];

    private static $owns = [
        'ItemImage'
    ];

    private static $extensions = [
        Versioned::class . '.versioned'
    ];
}

редактировать

Вышесказанное на самом деле не работает для ModelAdmin, только для объектов, связанных с объектом, который уже является версионным (например, SiteTree).
Если вы хотите это из ModelAdmin, вы можете добавить следующее:

private static $versioned_gridfield_extensions = true;

Который создаст несколько кнопок в вашем ModelAdmin. После того, как вы нажмете "опубликовать", файл также будет опубликован.

Я немного опоздал, но, к сожалению, $owns по-прежнему не работает с объектами DataObject без версий. Я также не хотел делать его версионным, поэтому вот как я публикую их вручную:

<?php

namespace app\foo;

use SilverStripe\ORM\DataObject;
use SilverStripe\Assets\Image;

class Bar extends DataObject {
    private static $has_one = [
        'MyImage' => Image::class
    ];

    protected function onAfterWrite() {
        parent::onAfterWrite();
        $img = $this->MyImage();
        if ($img && $img->exists()) {
            $img->publishRecursive();
        }
    }
}
Другие вопросы по тегам