0

Am trying to fetch the Project Name from Project Details table data is getting and project id saving in Timeline table but i can't set Product name in summary fields if anyone have the solution please help me . Thanks in Advance.!

is there any syntax issue in this codes? like has many, has one , many many ?

These are my codes

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
   
];
Abhilash
  • 11
  • 5

1 Answers1

0

Unfortulantely this is not built into Silverstripe. A has_many relation will return a HasManyList, a subclass of DataList. You'll have to provide a getter method in your ProjectTimeline DataObject to loop over that list and concat the project names like:

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

    return implode(', ' $names);
}

Then you can use this method in summary_fields:

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

I hope that helps you solving that problem!

wmk
  • 4,598
  • 1
  • 20
  • 37
  • Its Getting Like **[Emergency] Uncaught BadMethodCallException: Object->__call(): the method 'column' does not exist on 'SilverStripe\Lessons\ProjectDetails'** Thanks for the response – Abhilash Aug 05 '21 at 06:16
  • In ProjectTitmeline, $this->ProjectDetails() should return a HasManyList, which has this method. Hard to tell what happens here without more code or context. – wmk Aug 06 '21 at 08:25