Как создать форму редактирования в интерфейсе Silverstripe 4.2? - PullRequest
0 голосов
/ 20 января 2019

Я хочу создать форму редактирования в Silverstripe 4.2, очень похожую на функцию редактирования этого переполнения стека, которую я ищу.

РЕДАКТИРОВАНИЕ: Я хочу иметь возможностьстраница, которая доступна только зарегистрированному члену моего веб-сайта, чтобы они могли публиковать свои списки классов во внешнем интерфейсе (не в CMS) в качестве владельца, и им нужно было щелкнуть «изменить», чтобы перейти к идентичной форме (та же ClassListingForm) который позволяет владельцу участника редактировать / обновлять свои собственные списки классов, которые они опубликовали.У меня все работает, кроме функций редактирования и отправки, на которых я застрял в данный момент.

У меня есть ссылка для редактирования списка определенных классов:

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

Он перенаправлен на страницу 404, не найденную с указанным URL:

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

Вот код, приведенный ниже, пока у меня есть, ClassListingForm работает отлично, просто нужно получить EditListingForm и doClassListing функционируют нормально, и я могу что-то не так делать в этих кодах?или есть лучший способ сделать форму редактирования правильно, которую я нигде не могу найти в поиске конкретной информации о том, что мне нужно, так как на уроках 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());

      }
}

1 Ответ

0 голосов
/ 25 января 2019

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

Наконец-то он заработал и решил проблему, заменив целые коды для методов ClassEditForm и doUpdateClassListing , а также создал другую функцию под названием 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);
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...