首页 > 解决方案 > 如何在 Silverstripe 4.2 前端创建编辑表单?

问题描述

我希望在 Silverstripe 4.2 中创建编辑表单,就像我正在寻找的 Stack Overflow 的编辑功能一样。

已编辑:我希望能够拥有一个仅对我网站的注册成员可用的页面,他们可以作为所有者在前端(而不是 CMS)上发布他们的课程列表,并且需要单击“编辑”这会将您带到一个相同的表单(相同的 ClassListingForm),该表单允许成员所有者编辑/更新他们自己发布的课程列表。除了我目前坚持的编辑和提交功能外,我一切正常。

我有一个用于编辑特定课程列表的链接:

<a href="{$Top.Link}edit/{$ID}">Edit class listing</a></div>

它确实重定向到未找到此 url 的 404 页面:

http://.../learners/class-listings/edit/61

下面是我到目前为止的代码,ClassListingForm 工作正常,只需要让EditListingFormdoClassListing函数正常工作,我可能在这些代码中做错了什么?或者有没有更好的方法来正确地编辑表单,我无法在任何地方找到我需要的特定内容,因为没有太多教程涵盖 SilverStripe 课程中的 EditForm 功能。

<?php

class ClassListings extends DataObject {

    private static $table_name = 'ClassListings';

    private static $db = [
        'CourseTitle' => 'Varchar(255)',
        'CourseLocation' => 'Varchar(255)',
    ];

    private static $has_one = [
        'ClassListingPage' => ClassListingPage::class,
    ];
}
<?php

class ClassListingPageController extends PageController {

        private static $allowed_actions = [
            'ClassListingForm',
            'ClassEditForm'
        ];

        public function ClassListingForm() {

            $id = (int)$this->urlParams['ID'];
            $data = ($id)? $data = ClassListings::get()->byID($id) : false;

            $form = Form::create(
              $this,
              __FUNCTION__,
              FieldList::create(
                TextField::create('CourseTitle', 'Course title:')
                    ->setAttribute('placeholder', 'NZSL Level 1, NZSL 1A')
                    ->setCustomValidationMessage('Please enter the course title field')
                    ->addExtraClass('requiredField CourseTitle'),
                TextField::create('CourseLocation','Region:')
                    ->setAttribute('placeholder', 'Enter region')
                    ->setCustomValidationMessage('Please enter the region field')
                    ->addExtraClass('requiredField'),
                HiddenField::create('ID', 'ID')->setValue($ClassListingPageID)
              ),
              FieldList::create(
                  FormAction::create('handleClassListing')
                      ->setTitle('Post your class listing')
                      ->addExtraClass('btn btn-primary primary')
              ),
              RequiredFields::create(
                'CourseTitle',
                'CourseLocation'
              )
          );

          $form->loadDataFrom(Member::get()->byID(Member::currentUserID()));
          $form->getSecurityToken()->getValue();

                    if ($form->hasExtension('FormSpamProtectionExtension')) {
                $form->enableSpamProtection();
            }

                    $data = $this->getRequest()->getSession()->get("FormData.{$form->getName()}.data");
                    return $data ? $form->loadDataFrom($data) : $form;
          }

          public function handleClassListing($data, $form) {

                $session = $this->getRequest()->getSession();
                $session->set("FormData.{$form->getName()}.data", $data);
                $class = ClassListings::create($this->owner);

                $class->CourseTitle = $data['CourseTitle'];
                $class->CourseLocation = $data['CourseLocation'];
                $class->ID = $data['ID'];

                $class->ClassListingPageID = $this->ID;
                $form->saveInto($class);
                $class->write();

                $session->clear("FormData.{$form->getName()}.data");
                $form->sessionMessage('Your class listing has been posted!','good');
                $session = $this->getRequest()->getSession();

                return $this->redirect($this->Link());
            }

            public function ClassEditForm() {

                $ClassListingPageID = (int)$this->urlParams['ID'];
                $data = ($ClassListingPageID)? $data = ClassListings::get()->byID($ClassListingPageID) : false;
                $var = $this->getRequest()->getVar('$data');

                    if($var){
                        $form = Form::create(
                                    $this,
                                __FUNCTION__,
                                FieldList::create(
                                        TextField::create('CourseTitle', 'Course title:')
                                            ->setAttribute('placeholder', 'NZSL Level 1, NZSL 1A')
                                            ->setCustomValidationMessage('Please enter the course title field')
                                            ->addExtraClass('requiredField CourseTitle'),
                                        TextField::create('CourseLocation','Region:')
                                            ->setAttribute('placeholder', 'Enter region')
                                            ->setCustomValidationMessage('Please enter the region field')
                                            ->addExtraClass('requiredField'),
                                        HiddenField::create('ID', 'ID')->setValue($ClassListingPageID)
                                ),
                                FieldList::create(
                                        FormAction::create('doClassListing')
                                                ->setTitle('Post your class listing')
                                                ->addExtraClass('btn btn-primary primary')
                                ),
                                RequiredFields::create(
                                        'CourseTitle',
                                        'CourseLocation',
                                )
                        );

                        $form->loadDataFrom(ClassListings::get()->filter(['ClassListingPageID' => $var])[0]);
                        $form->getSecurityToken()->getValue();

                        if ($form->hasExtension('FormSpamProtectionExtension')) {
                                $form->enableSpamProtection();
                        }

                        $data = $this->getRequest()->getSession()->get("FormData.{$form->getName()}.data");
                        return $data ? $form->loadDataFrom($data) : $form;
                    }
                    return;
            }

      public function doUpdateClassListing($data, Form $form) {

                $session = $this->getRequest()->getSession();
                $session->set("FormData.{$form->getName()}.data", $data);
                $class = ClassListings::create($this->owner);

                $class->CourseTitle = $data['CourseTitle'];
                $class->CourseLocation = $data['CourseLocation'];
                $class->ID = $data['ID'];

                $class->ClassListingPageID = $this->ID;
                $form->saveInto($class);
                $class->write();

                $session->clear("FormData.{$form->getName()}.data");
                $form->sessionMessage('Your class listing has been updated!','good');
                $session = $this->getRequest()->getSession();

            return $this->redirect($this->Link());

      }
}

标签: phpsilverstripesilverstripe-4

解决方案


Thought i post this answer to share in case if others have the same issue i had.

Finally got it working and solved the issue now, have replaced whole the codes for both ClassEditForm and doUpdateClassListing methods, and also created another funcation called Edit:

public function Edit(HTTPRequest $request) {
    $id = (int)$request->param('ID');
    $class = ClassListings::get()->byID($id);
    if (!$class || !$class->exists()) {
         return ErrorPage::response_for(404);
    }
    $form = $this->ClassEditForm($class);
    $return = $this->customise(array(
         'Title' => 'Edit: ' . $class->CourseTitle,
         'Form' => $form,
    ));

    return $return = $return->renderWith(array('ClassListingPage_edit', 'Page'));
}

public function ClassEditForm() {

        $id = (int)$this->urlParams['ID'];
        $class = ClassListings::get()->byID($id);

        $fields = new FieldList(
            HiddenField::create('ID')->setValue($id),
            TextField::create('CourseTitle', 'Course title:')
                ->setAttribute('placeholder', 'NZSL Level 1, NZSL 1A')
                ->setCustomValidationMessage('Please enter the course title field')
                ->addExtraClass('requiredField CourseTitle'),
            TextField::create('CourseLocation','Region:')
                ->setAttribute('placeholder', 'Enter region')
                ->setCustomValidationMessage('Please enter the region field')
                ->addExtraClass('requiredField')
          );
          $actions = new FieldList(
              FormAction::create('doUpdateClassListing')
                ->setTitle('Update your class listing')
                ->addExtraClass('btn btn-primary primary')
          );
          $validator = new RequiredFields([
              'CourseTitle',
              'CourseLocation'
          ]);

        $form = Form::create($this, 'ClassEditForm', $fields, $actions, $validator);

        if ($class) $form->loadDataFrom($class);

        return $form;
}

public function doUpdateClassListing($data, Form $form) {

           if($data['ID']){
               $id = $data['ID'];
               $class = ClassListings::get()->byID($id);
           } else {
               $class = ClassListings::create();
           }

           $form->saveInto($class);
           $id = $class->write();
           $form->sessionMessage('Your class listing has been updated!','good');

           $this->redirect($this->Link() . "edit/".$id);
       }

推荐阅读