【问题标题】:display titles from many_many relation in GridField - Silverstripe在 GridField 中显示来自 many_many 关系的标题 - Silverstripe
【发布时间】:2013-10-31 16:25:21
【问题描述】:

如何在 GridField 摘要中显示 many_many 关系的标题?

我用 RelationName.Title 尝试过,但结果只是一个空字段

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    应该有几个解决方案:

    在链接的 DataObject 上定义 $summary_fields

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

    或在定义关系的页面/数据对象上使用GridFieldConfig

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

    $configGridFieldConfig 使用的GridField 实例。

    编辑

    要对 GridField 中包含的数据进行更高级的格式化/控制,您可以使用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;
        }
    ));
    

    这里setFieldFormatting 将在setDisplayFields 定义的TeamLink 列中输出TeamMember 所属的所有团队的编辑链接(可能不是最好的例子,但希望你明白这一点,尽管未经测试) .

    【讨论】:

    • 嗨,谢谢,但定义 summary_fields 不是问题。每个成员都有多个团队,我需要显示该成员所在团队的列表。但是您的第二个代码 sn-p 很有用:) 谢谢您
    • 不用担心...如果您想对 GridField 中显示的数据进行更多控制,可以使用setFieldFormatting,请参阅答案中的编辑。
    • 不错。但直到现在我不知道在哪里使用它。你有我可以使用它的例子吗?
    • 用更深入的例子更新了答案......不过,您可能必须适应自己的代码。
    【解决方案2】:

    colymba 的回答已经说了大部分,但另外你也可以在$summary_fields 中指定一个方法。这允许您在 GridField 中显示图像缩略图,或者根据需要将您自己的字符串从 many_many 关系的标题拼凑起来。

    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);
        }
    }
    

    正如colymba指出的那样,您也可以使用setDisplayFields 在不同的网格上使用不同的字段

    【讨论】:

    • 正是我需要的,还有更多 - 缩略图功能也非常有用。谢谢
    • 是否也可以获取模板中显示的每个团队的链接?这样我就可以在每个球员旁边建立他所在球队的链接。我尝试修改你的功能(cmets中的部分)但没有成功
    • 你的意思是在你有这样的团队列表的 cloumn 中:“团队 1,团队 2,团队 3”,当我按下“团队 3”时,我会进入该团队的编辑表单?我想它可能,但它可能要复杂得多,我需要调查一下
    • 不,不在 GridField 中。仅适用于前端模板。这更容易吗?
    • 是的。它与这里的问题基本相同:stackoverflow.com/questions/19477858/…
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    相关资源
    最近更新 更多