display titles from many_many relation in GridField - Silverstripe

狂风中的少年 提交于 2020-01-01 19:53:10

问题


How can I display the titles from a many_many relation in a GridField Summary?

I tried it with RelationName.Title but the result was only an empty field


回答1:


colymba's answer already said most of it, but in addition you can also specify a method in $summary_fields. This allows you to display image thumbnails in a GridField or as you need it, piece together your own string from the titles of a many_many relation.

class TeamMember extends DataObject {
    private static $db = array(
        'Title' => 'Text',
        'Birthday' => 'Date',
    );
    private static $has_one = array(
        'Photo' => 'Image'
    );
    private static $has_many = array(
        'Teams' => 'Team'
    );
    private static $summary_fields = array(
        'PhotoThumbnail',
        'Title',
        'Birthday',
        'TeamsAsString',
    );
    public function getPhotoThumbnail() {
        // display a thumbnail of the Image from the has_one relation
        return $this->Photo() ? $this->Photo()->CroppedImage(50,50) : '';
    }
    public function getTeamsAsString() {
        if (!$this->Teams()) {
           return 'not in any Team'; 
        }
        return implode(', ', $this->Teams()->Column('Title'));
        // or if one field is not enough for you, you can use a foreach loop:
        // $teamsArray= array();
        // foreach ($this->Teams() as $team) {
        //     $teamsArray[] = "{$team->ID} {$team->Title}";
        // }
        // return implode(', ', $teamsArray);
    }
}

alternative you can, as colymba pointed out, also use setDisplayFields to use different fields on different grids




回答2:


there should be a couple solutions:

defining $summary_fields on the DataObject that is linked:

private static $summary_fields = array(
    'YourFieldName',
    'AnotherField'
);

or with the GridFieldConfig on the Page/DataObject that defines the relation:

$config->getComponentByType('GridFieldDataColumns')->setDisplayFields(array(      
    'FieldName' => 'GridFieldColumnName',
    'AnotherFieldName' => 'AnotherGridFieldColumnName',
));

$config being your GridFieldConfig instance used by GridField.

EDIT

for more advanced formatting/control over the data included in the GridField, you can use setFieldFormatting:

$config->getComponentByType('GridFieldDataColumns')->setDisplayFields(array(      
    'TeamLink' => 'Edit teams'
));

$config->getComponentByType('GridFieldDataColumns')->setFieldFormatting(array(
    'TeamLink' => function($value, $item)
    {
      // $item here would be a TeamMember instance
      // since the GridField displays TeamMembers

      $links = 'No teams';

      $teamModelAdminClass = 'TeamModelAdmin'; //change to your classname
      $teams = $item->Teams(); // get the teams

      if ( $teams->count() > 0 )
      {
        $links = '';
        $teamClass = $teams->dataClass;

          $teamAdminURL = Config::inst()->get($teamModelAdminClass, 'url_segment');
          $teamEditAdminURL = 'admin/'.$teamAdminURL.'/'.$teamClass.'/EditForm/field/'.$teamClass.'/item/';       

          foreach($teams as $team)
          {
            $links .= '<a href="'.$teamEditAdminURL.$team->ID.'/edit">Edit '.$team->Title.'</a><br/>';
          }
      }

      return $links;
    }
));

Here setFieldFormatting will output edit links to all teams that a TeamMember is part of in a TeamLink column defined by setDisplayFields (might not be the best example, but hope you get the idea, although not tested).



来源:https://stackoverflow.com/questions/19523983/display-titles-from-many-many-relation-in-gridfield-silverstripe

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!