CrashyBang of WebFox
11/6/2015 - 12:35 AM

Editable table with multiple tables per page with only one relation

Editable table with multiple tables per page with only one relation

<?php

class TableRow extends DataObject {

    protected static $db = [
        'Column1'   => 'Varchar(255)',
        'Column2'   => 'Varchar(255)',
        'Column3'   => 'Varchar(255)',
        'Table'     => 'Int',
        'SortOrder' => 'Int'
    ];

    protected static $has_one = [
        'Page' => 'Page'
    ];

    private static $summary_fields = [
        'Column1' => 'Column One',
        'Column2' => 'Column Two',
        'Column3' => 'Column Three',
    ];

    protected static $default_sort = 'SortOrder';

    public function getCMSFields() {

        $fields = new FieldList([
            TextField::create('Column1'),
            TextField::create('Column2'),
            TextField::create('Column3'),
        ]);

        return $fields;

    }

    public function canView($member = null) {
        return Permission::check('CMS_ACCESS_CMSMain', 'any', $member);
    }

    public function canEdit($member = null) {
        return Permission::check('CMS_ACCESS_CMSMain', 'any', $member);
    }

    public function canDelete($member = null) {
        return Permission::check('CMS_ACCESS_CMSMain', 'any', $member);
    }

    public function canCreate($member = null) {
        return Permission::check('CMS_ACCESS_CMSMain', 'any', $member);
    }

}
<?php
class EditableTablePage extends Page {
  private static $has_many = [
    'TableRows' => 'TableRow'
  ];
  public function getCMSFields(){
    $fields = parent::getCMSFields();
    Requirements::customCSS(".col-Table { display: none; }");
    foreach ([1 => 'One', 2 => 'Two'] as $number => $name) {
      $displayFields = [
        'Column1' => 'Column One',
        'Column2' => 'Column Two',
        'Column3' => 'Column Three',
        'Table'   => function () use ($number) { return new HiddenField('Table', null, $number); }
      ];
      /** @var GridFieldConfig $tableConfig */
      $tableConfig = GridFieldConfig::create();
      $tableConfig->addComponent(new GridFieldButtonRow('before'))
                  ->addComponent(new GridFieldAddNewInlineButton('buttons-before-left'))
                  ->addComponent(new GridFieldSortableHeader())
                  ->addComponent(new GridFieldOrderableRows('SortOrder'))
                  ->addComponent((new GridFieldEditableColumns())->setDisplayFields($displayFields))
                  ->addComponent(new GridFieldDeleteAction());
      $gridField = GridField::create(
        "FeesTable{$name}GridField", 
        "Table Rows", 
        $this->{"Table{$name}TableRows"}(), 
        $tableConfig
      );
      
      $fields->addFieldToTab("Root.Table{$name}", $gridField);
    }
    
    return $fields;
    
  }
}