2015-07-13 3 views
0

Я использую модуль MultiForm для отправки длинной формы с помощью SilverStripe. Логика для этой формы находится в 'CampaignBriefForm.php', тогда как поле CMS gridfield добавляется в 'CampaignBriefPage.php'. У меня есть объект данных для CampaignBriefLead, который создает форму.Сетка Поле, не отображающее записей [SilverStripe]

Campaign Brief Page

private static $has_many = array(
    'CampaignBriefLeads' => 'CampaignBriefLead' 
); 

public function CampaignBriefForm() { 
    return new CampaignBriefForm($this, 'CampaignBriefForm'); 
} 

Campaign Brief Свинец (DO)

private static $has_one = array("Page" => "CampaignBriefPage"); 

Как вы можете увидеть кампании Краткая страница имеет правильное соотношение с объектом данных, а также вас может видеть, что сама форма (сделанная в файле sepearate) правильно возвращается (поскольку она сохраняется в БД). По какой-то причине, однако, gridfield не покажет мне, что находится в базе данных для этого объекта данных. Код поля сетки выглядит следующим образом.

$fields = parent::getCMSFields(); 
    $contactConfig = GridFieldConfig_RelationEditor::create(); 
    $contactConfig->getComponentByType('GridFieldDataColumns')->setDisplayFields(
     array(
      'CompanyName' => 'Company Name', 
      'StartDate'  => 'Start Date', 
      'Duration'  => 'Duration', 
      'WebsiteURL' => 'Website', 
      'Budget'  => 'Budget' 
    )); 

    $contactGrid = new GridField(
     'CampaignBrief', 
     'Campaign Enquiries', 
     $this->CampaignBriefLeads(), 
     $contactConfig 
    ); 

    $fields->addFieldToTab("Root.Enquiries", $contactGrid); 

Для меня это все выглядит правильно и должно работать, но по какой-то причине оно не работает.

Примечание

Ссылку существующий вариант на gridfield позволяет мне связать одну из записей из DO с gridfield Жутко ?? Таким образом, он сохраняет одну запись, но мне нужно сделать это вручную, это говорит мне, что она может видеть БД, но по какой-то причине не потянет.

Для ознакомления с причинами, здесь приведен код мультиформатной формы, где краткое руководство кампании фактически сохраняется в БД после отправки формы.

public function finish($data, $form) { 

    parent::finish($data, $form); 

    $steps = DataObject::get(
     'MultiFormStep', 
     "SessionID = {$this->session->ID}" 
    ); 

    $enquiry = new CampaignBriefLead(); 


    foreach($steps as $step) { 
     $data = $step->loadData(); 

     foreach($data as $key => $value) { 
      if($key == 'url' || $key == 'MultiFormSessionID' || $key == 'action_finish') { 
       continue; 
      } 
      if(isset($data[$key])) { 
       $enquiry->$key = $data[$key]; 
       error_log($data[$key]); 
      } 
     } 
    } 

    $enquiry->write(); 

    $this->controller->redirect('/campaign-brief/'); 
} 

Если вам нужно что-нибудь еще, дайте мне знать. Благодарю.

ответ

1

Я бы предположил, что CampaignBriefLeadPageID не устанавливается при отправке формы.

Проверьте таблицу CampaignBriefLead в своей базе данных и проверьте, есть ли столбец PageID. Если он пустой, null или 0 для каждой строки, то он не устанавливается.

Один из способов решить эту проблему для любого нового представления должен установить PageID для $ запрос:

public function finish($data, $form) { 

    // ... 

    $enquiry = new CampaignBriefLead(); 

    if ($campaignBriefPage = CampaignBriefPage::get()->first()) { 
     $enquiry->PageID = $campaignBriefPage->ID; 
    } 

    // ... 
} 

Для существующих записей, которые необходимо будет обновлять данные, чтобы иметь правильную PageId.

Смежные вопросы