Nano Hash - криптовалюты, майнинг, программирование

Добавить новую страницу с помощью GridField - создает дочерний элемент в корневой папке

Я хотел бы использовать GridField для просмотра и создания новых дочерних страниц. Родитель - DocumentHolder, дочерний - Document. Оба расширяют SiteTree. Когда я нажимаю «Добавить документ» (кнопка, созданная сеткой), заполняю поля и подтверждаю форму, родительская страница игнорируется и страница создается в корне. Это хорошо работает, когда я использую DataObject. Код выглядит так:

class DocumentHolder extends SiteTree
{

    private static $allowed_children = array(
        'Document'
    );

    private static $default_child = "Document";


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

        $gridField = new GridField('Documents', 'Documents', SiteTree::get('Document')->filter('ParentID', $this->ID), GridFieldConfig_RecordEditor::create());

        $fields->addFieldToTab("Root.Uploads", $gridField);

        return $fields;
    }

}



class Document extends SiteTree
{

    private static $db = array(
    );
    private static $has_one = array(
    );
}

Спасибо за помощь.

03.09.2014

Ответы:


1

Поскольку SiteTree уже имеет отношение к настроенным дочерним страницам, вы также можете его использовать! Поскольку allowed_children всегда будут только документами, попробуйте вместо этого:

$gridField = new GridField('Documents', 'Documents', $this->Children(), GridFieldConfig_RecordEditor::create());
03.09.2014
  • Привет, Элиот, спасибо за ответ, я пробовал это и раньше, но с тем же результатом ... 04.09.2014

  • 2

    Я столкнулся с этой проблемой ранее, работая над своим модулем страницы-держателя. Вам нужно установить ParentID по умолчанию. Вот две стратегии;

    Вы можете использовать populateDefaults в дочернем классе. Например.

    class Document extends SiteTree
    {
    
        private static $default_parent = 'DocumentHolder';
        private static $can_be_root = false;
    
        public function populateDefaults(){
            parent::populateDefaults();
            $this->ParentID = DataObject::get_one(self::$default_parent)->ID;
        }
    
        ...
    

    Или вы можете управлять записью в поле сетки с помощью пользовательской реализации GridFieldDetailForm или с помощью обратного вызова updateItemEditForm.

    <?php
    
    class MyGridFieldDetailForm_ItemRequest extends GridFieldDetailForm_ItemRequest
    {
    
        public function ItemEditForm()
        {
            $form = parent::ItemEditForm();
    
            if (! $this->record->exists() && $this->record->is_a('SiteTree')) {
                $parent_page = $this->getController()->currentPage();
                if ($parent_page && $parent_page->exists()) {
    
                    $this->record->ParentID = $parent_page->ID;
    
                    // update URLSegment @TODO perhaps more efficiently?
                    $field = $this->record->getCMSFields()->dataFieldByName('URLSegment');
                    $form->Fields()->replaceField('URLSegment', $field);
                }
            }
    
            return $form;
        }
    }
    

    Это более сложно, хотя это позволило мне создать простой модуль / надстройку (https://github.com/briceburg/silverstripe-holderpage)

    24.11.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..