Как автоматически публиковать файлы, загруженные в объект данных в администраторе модели 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();
}
}
}