Как я могу вернуть много данных в полях сводки Silverstripe?

#php #orm #relational-database #silverstripe #silverstripe-4

Вопрос:

Я пытаюсь извлечь название проекта из таблицы Сведений о проекте, получаются данные и сохраняется идентификатор проекта в таблице временной шкалы, но я не могу указать название продукта в полях сводки, если у кого-нибудь есть решение, пожалуйста, помогите мне . Заранее спасибо.!

есть ли какие-либо синтаксические проблемы в этих кодах? как будто у многих, у одного , у многих много ?

Это мои коды

ProjectTimeline.php

 class ProjectTimeline extends DataObject {

private static $table_name = 'ProjectTimeline';

private static $db = [
    'Title' => "Varchar(255)",
    'ProjectId' => "Varchar(255)"

];

private static $has_one = [
    'ProjectPage' => ProjectPage::class
    
];

private static $has_many =[

'ProjectDetails'=>ProjectDetails::class
];

/**
 * Data Listing Fields
 */
private static $summary_fields = [
    'ProjectDetails.ProjectName' => 'Project Name',
    'Title' => 'Title'
];

private static $extensions = [
    Versioned::class,
];

private static $versioned_gridfield_extensions = true;

/**
 * getCMSFields
 * Projects - Amenities Form Fields 
 *
 * @return void
 */
public function getCMSFields()
{
    return new FieldList(
        DropdownField::create('ProjectId', 'Link a Product', ProjectDetails::get()->map('ID', 'ProjectName')),
        TextField::create('Title')
    );
}

/**
 * Search Fields
 */
private static $searchable_fields = [
    'Title'
];

/**
 * getCMSValidator - Required Fields
 *
 * @return void
 */
public function getCMSValidator()
{
    return new RequiredFields([
        'Title'
    ]);
}
 

ProjectDetails.php

 private static $has_one = [
    'ProjectPage' => ProjectPage::class,
    'QuickFactsImage' => Image::class,
    'ProjectTimeline' => ProjectTimeline::class
];

private static $many_many = [
    'ProjectImage' => Image::class,
    'FloorTypesImage' => Image::class
   
];
 

Ответ №1:

К сожалению, это не встроено в Silverstripe. Отношение has_many вернет HasManyList, подкласс DataList. Вам нужно будет указать метод получения в вашем объекте данных ProjectTimeline, чтобы выполнить цикл по этому списку и объединить имена проектов, такие как:

 public function getProjectDetailsNames()
{
    $names = $this->ProjectDetails()->column('ProjectName'); //returns just that column as an array

    return implode(', ' $names);
}
 

Затем вы можете использовать этот метод в summary_fields:

 private static $summary_fields = [
    'getProjectDetailsNames' => 'Project Names',
    'Title' => 'Title'
];
 

Я надеюсь, что это поможет вам решить эту проблему!

Комментарии:

1. Это становится похоже на [Чрезвычайная ситуация] Необнаруженное исключение BadMethodCallException: Объект->__вызов(): метод «столбец» не существует в «SilverStripeУрокиХвосты проектов» > Спасибо за ответ

2. В ProjectTitmeline функция $this->ProjectDetails() должна возвращать HasManyList, в котором есть этот метод. Трудно сказать, что здесь происходит без дополнительного кода или контекста.