Php SilverStripe 3.1-页面创建和;从前端发布

Php SilverStripe 3.1-页面创建和;从前端发布,php,forms,silverstripe,Php,Forms,Silverstripe,对于我们公司的内部网,我创建了一个带有表单的页面,用于从前端创建电子邮件(创建一个新的电子邮件页面) 保存表单后,页面应处于活动状态。 我是这样做的,但我想我在什么地方犯了个错误。因为如果我转到后端并再次单击“发布”,KW1、KW2、Date和SendDate仅在前端可见 public static $allowed_actions = array( 'MailingForm' ); public function MailingForm() { $date = new Dat

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

保存表单后,页面应处于活动状态。 我是这样做的,但我想我在什么地方犯了个错误。因为如果我转到后端并再次单击“发布”,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);

}
所有数据都正确提交,但我收到以下错误,页面仅保存为实时版本。在后端,页面被标记为“从草稿中删除”所以我认为这是正确的方向。

如果我用

$page->write();
$page->writeToStage('Stage');
$page->publish('Stage', 'Live');
$page->writeToStage('Stage');
$page->publish('Stage', 'Live');
我没有收到任何错误,提交的数据显示在后端,但不在发布的版本中。我必须在后端再次发布页面,以使数据在前端可见


那么有什么办法解决这个问题吗?

好的,一百万次尝试后我就知道了!:) 对于其他陷入困境的人

您只需在编写后将live页面恢复到stage即可

$page->write();
$page->doRestoreToStage();
仅此而已:)

非常感谢您的两行代码 $page->write()

$page->dorestorostatage(); 在过去的几天里,我一直在努力处理SiteTree表,试图为此表写入一条新记录

重要的一点是永远不要直接使用SiteTree类,否则它将无法工作

例如$mySiteTree=newsitetree();(坏)

创建新页面扩展SiteTree(),例如Mypage

$mypage = new Mypage();
$mypage->Title = 'My Page';
$mypage->URLSegment = 'testing';
$mypage->ShowInMenus = '1';
$mypage->Version = '1';
$mypage->ParentID = '24';
$mypage->write();
$mypage->doRestoreToStage();

享受吧

->doPublish()有帮助吗?只需在$page->publish(…)之后添加,或者只添加doPublish?我会尝试
$page->write()
,然后
$page->doPublish()
就像@munomono说的那样,
doPublish()
会解决你的问题。嗨,好的,我添加了write()和doPublish(),删除了writeToStage()和publish()。提交后,我收到了此错误,请尝试用writeToStage替换write,然后DoPublishin,而不是只是投票否决答案,在评论中告诉我原因是有用的。代码中有错误吗?感谢分享您的解决方案!