SilverStripe 3.1 - 从FrontEnd创建和发布页面

inv*_*tus 2 php forms silverstripe

对于我们公司的内部网,我创建了一个带有表单的页面,用于从前端创建电子邮件(创建新的电子邮件页面).

保存表单后,页面应为Live.我是这样做的,但我认为我在某个地方犯了错误.因为KW1,KW2,Date和SendDate仅在前端可见,如果我转到后端并再次单击发布.

public static $allowed_actions = array(
    'MailingForm'
);

public function MailingForm() {
    $date = new DateField('EndDate', 'Gültig bis');
    $date->setConfig('showcalendar', true);

    $sendDate = new DateField('SendDate', 'Versanddatum');
    $sendDate->setConfig('showcalendar', true);

    $fields = new FieldList(
        new TextField('Title', 'Title'),
        new TextField('KW1', 'Start KW'),
        new TextField('KW2', 'End KW'),
        $date,
        $sendDate
    );

    $actions = new FieldList(
        new FormAction('createMailing', 'Erstellen')
    );

    //$validator = new RequiredFields('Title');

    return new Form($this, 'MailingForm', $fields, $actions);//, $validator);
}   

public function createMailing($data, $form) {
    $member = Member::currentUser();
    $filter = new URLSegmentFilter();

    $page = new Mailing();
    $form->saveInto($page);
    $page->PublisherID = $member->ID;
    $page->AuthorID = $member->ID;
    $page->ParentID = $this->ID;
    $page->URLSegment = $filter->filter($page->Title);
    $page->writeToStage('Stage');
    $page->publish('Stage', 'Live');

    // EMAIL BEG
    $email = new Email();

    $email->setTo('mail@mail.de'); 
    $email->setFrom('intranet@mail.de'); 
    $email->setSubject('Neues E-Mailing für '.$this->Title); 

    $messageBody = "
        <p>Neues E-Mailing wurde angelegt und wartet auf Freischaltung</p>
        <p><strong>Name:</strong> {$data['Title']}</p>
        <p><strong>KWs:</strong> {$data['KW1']} - {$data['KW2']}</p>
        <p><strong>Gültig bis:</strong> {$data['EndDate']}</p>
        <p><strong>Versanddatum:</strong> {$data['SendDate']}</p>
    "; 
    $email->setBody($messageBody); 
    $email->send();
    // EMAIL END

    return $this->redirect($this->Parent()->URLSegment.'/'.$this->URLSegment.'/'.$page->URLSegment);

}
Run Code Online (Sandbox Code Playgroud)

如果我更换$page->writeToStage('Stage'); $page->publish('Stage', 'Live');$page->write()比网页未发布,如果我添加$page->write()其他两个比我收到此错误

在舞台阶段找不到[页面标题]/[页面ID]

有人可以帮我吗?

先感谢您


再次打破这个问题

如果我发布页面

$page->write();
$page->writeToStage('Stage');
$page->publish('Stage', 'Live');
Run Code Online (Sandbox Code Playgroud)

比所有数据都正确提交但我收到以下错误http://www.picbutler.de/bild/301819/erroroirpt.jpg并且该页面仅保存为实时版本.在后端,页面被标记为"从草稿中删除".所以我认为这是正确的方向.

如果我发布页面

$page->writeToStage('Stage');
$page->publish('Stage', 'Live');
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误,提交的数据出现在后端,但不是在已发布的版本中.我必须在后端再次发布页面,以使数据在前端可见.

那么任何想法如何解决这个问题?

inv*_*tus 5

好吧,一百万次尝试后我得到了它!:)对于那些陷入困境的人.

您只需要在写入后将实时页面恢复到舞台

$page->write();
$page->doRestoreToStage();
Run Code Online (Sandbox Code Playgroud)

就这样 :)