在 DataObject、SilverStripe 3.1.12 中评论的表单

Form to comment in DataObject, SilverStripe 3.1.12

我有这个结构...:[=​​18=]

产品>我的网站>代码>产品>Product.php

我有像 DataObject 和 ContentController 这样的产品来创建表单并在后端处理...

class Product extends DataObject
{
    //...
}

class Product_Controller extends ContentController
{
    private static $allowed_actions = array(
        'CommentForm'
    );

    public function CommentForm()
    {
        $form = Form::create(
            this,
            __FUNCTION__,
            FieldList::create(
                TextField::create('Name',''),
                EmailField::create('Email',''),
                TextareaField::create('Comment','')
            ),
            FieldList::create(
                FormAction::create('handleComment', 'Post Comment')
                ->setUseButtonTag(true)
                ->addExtraClass('btn btn-default-color btn-lg')
            ),
            RequiredFields::create('Name','Email', 'Comment')
        )->addExtraClass('form-style');

        foreach($form->Fields() as $field){
            $field->addExtraClass('form-control')
                ->setAttribute('placeholder', $field->getName(), '*');
        }

        $data = Session::get("FormData.{$form->getName()}.data");

        return $data ? $form->loadDataFrom($data) : $form;
    }

    public function handleComment($data, $form){
        Session::set("FormData.{$form->getName()}.data", $data);
        $existing = $this->CommentForm()->Comments()->filter(array(
            'Comment' => $data['Comment']
        ));
        if($existing->exists() && strlen('Comment') > 20){
            $form->sessionMessage('That comment already exists!', 'bad');

            return $this->redirectBack();
        }

        $comment = ProductComment::create();
        $comment->ProductID = $this->ID;
        $form->saveInto($comment);
        $comment->write();

        Session::clear("FormData.{$form->fetName()}.data");
        $form->sessionMessage('Thanks for your comment', 'good');

        return $this->redirectBack();

    }

}

产品>我的网站>代码>产品>ProductsPage.php

包含许多产品的页面...

class ProductsPage extends Page
{

    private static $has_many = array(
        'Products' => 'Product',
        'Categories' => 'Category'
    );
//...
}
class ProductsPage_Controller extends Page_Controller
{
    private static $allowed_actions = array (
    'show'
    );

    public function show(SS_HTTPRequest $request)
    {
        $product = Product::get()->byID($request->param('ID'));

        if (!$product) {
            return $this->httpError(404, 'That region could not be found');
        }

        return array(
            'Product' => $product,
            'Name' => $product->Name
        );
    }
}

产品>我的站点>代码>扩展>ProductExtension>ProductComments.php

是一个有很多注释的 DataExtension...

class ProductComments extends DataExtension{

    private static $has_many = array(
        'Comments' => 'ProductComment'
    );
}

产品>我的站点>代码>扩展>ProductExtension>ProductComment.php

要评论的简单数据对象...

class ProductComment extends DataObject
{
    private static $db = array(
        'Name' => 'Varchar',
        'Email' => 'Varchar',
        'Comment' => 'HTMLText'
    );

    private static $summary_fields = array(
        'Created' => 'Created',
        'Name' => 'Name',
        'Email' => 'Email',
        'Comment' => 'Text'
    );
    private static $has_one = array(
        'Product' => 'Product'
    );
    public function getCMSFields(){
        $fields = FieldList::create(
            TextField::create('Name'),
            TextField::create('Email'),
            HtmlEditorField::create('Comment')
        );
        return $fields;
    }
}

我的文件config.yml要添加扩展注释...

产品>我的网站>_config>config.yml

Product:
  extensions:
    - ProductComments

SilverStripe 文件 (.ss)...

产品>主题>my_theme>模板>布局>ProductsPage.ss 对产品的看法不多...

 <% loop $Products %>
        <div class="item col-md-2"><!-- Set width to 4 columns for grid view mode only -->
            <div class="image">
                <a href="$Link">
                    $Main_image.CroppedImage(175,150)
                </a>
            </div>
            <div class="item">
                <h3>
                    <a href="$Link">$Name</a>
                </h3>
                $Short_description
            </div>
        </div>
        <% end_loop %>

产品>主题>my_theme>模板>布局>ProductsPage_show.ss

查看信息和评论产品。

<% with $Product %>
    <%--...--%>
    <h1>Comments</h1>
        <% loop $Comments %>
            <div class="comment">
                <h3>$Name <small>$Created.Format('j F,Y')</small></h3>
                    <p>$Comment</p>
            </div>
        <% end_loop %>

        <div class="comments-form">
            <h3>Leave a Reply</h3>
                <p>Your email address wlill no be published. Required fields are marked*</p>

            $CommentForm
        </div>
<% end_with %>

我不能从 DataObject 扩展 ContentController,这是错误的...post创建 DataObject 产品(post 评论)的最佳方法是什么?我看过这个 post Submit Form in Dataobject - Silverstripe 3.1 我不能用它。

解决方案

好吧,我找到了问题的解决方案...通过这种方式,我可以在 DataObject 中 post 评论...

产品>我的网站>代码>产品>ProductsPage.php

最重要的文件,有了这个,我们就要用PageController来控制表单注释了。

class ProductsPage extends Page
{
        //...
}

class ProductsPage_Controller extends Page_Controller
{

    private static $allowed_actions = array (
    'show', 'CommentForm'
    );

    public function show(SS_HTTPRequest $request)
    {
         $product = Product::get()->byID($request->param('ID'));

        if (!$product) {
            return $this->httpError(404, 'That region could not be found');
        }

        return array(
            'Product' => $product,
            'Name' => $product->Name
        );
    }

    public function CommentForm($id)
    {
        $form = Form::create(
            $this,
            __FUNCTION__,
            FieldList::create(
                TextField::create('Name',''),
                EmailField::create('Email',''),
                TextareaField::create('Comment',''),
                HiddenField::create('id','', $id)
            ),
            FieldList::create(
                FormAction::create('handleComment', 'Post Comment')
                    //->setUseButtonTag(true)
                    ->addExtraClass('btn btn-default-color btn-lg')
            ),
            RequiredFields::create('Name','Email', 'Comment')
        )->addExtraClass('form-style');

        foreach($form->Fields() as $field){
            $field->addExtraClass('form-control')
                ->setAttribute('placeholder', $field->getName(), '*');
        }
        $data = Session::get("FormData.{$form->getName()}.data");

        return $data ? $form->loadDataFrom($data) : $form;
    }

    public function handleComment($data, $form){

        Session::set("FormData.{$form->getName()}.data", $data);

        $comment = ProductComment::create();
        $comment->ProductID = $data['id'];
        $form->saveInto($comment);
        $comment->write();

        Session::clear("FormData.{$form->getName()}.data");
        $form->sessionMessage('Thanks for your comment', 'good');

        return $this->redirectBack();
    }
}

show(SS_HTTPRequest $request): 允许显示来自 PageHolder 的产品。

CommentForm($id):创建表单评论并将产品ID保存在HiddenField中,用于按产品处理评论。

handleComment($data, $form): 将评论保存到数据库并以干净的形式重新加载页面。

产品>我的网站>代码>产品>ProductsPage.php

class Product extends DataObject
{
    //Product basic data...
    private static $db = array(
        'Name' => 'varchar',
        'Short_description' => 'text',
        'Content' => 'HTMLText'
    );
}

一个简单的数据对象,我们想要评论...

产品>我的站点>代码>扩展>ProductExtension>ProductComments.php

是一个有很多评论的 DataExtension...

 class ProductComments extends DataExtension{

        private static $has_many = array(
            'Comments' => 'ProductComment'
        );
    }

产品>我的站点>代码>扩展>ProductExtension>ProductComment.php

class ProductComment extends DataObject
    {
        private static $db = array(
            'Name' => 'Varchar',
            'Email' => 'Varchar',
            'Comment' => 'HTMLText'
        );

        private static $summary_fields = array(
            'Created' => 'Created',
            'Name' => 'Name',
            'Email' => 'Email',
            'Comment' => 'Text'
        );
        private static $has_one = array(
            'Product' => 'Product'
        );
        public function getCMSFields(){
            $fields = FieldList::create(
                TextField::create('Name'),
                TextField::create('Email'),
                HtmlEditorField::create('Comment')
            );
            return $fields;
        }
    }

产品>我的网站>_config>config.yml

Product:
      extensions:
        - ProductComments

产品>主题>my_theme>模板>布局>ProductsPage_show.ss

<% with $Product %>
    <%--...--%>
    <h1>Comments</h1>
        <% loop $Comments %>
            <div class="comment">
                <h3>$Name <small>$Created.Format('j F,Y')</small></h3>
                    <p>$Comment</p>
            </div>
        <% end_loop %>

        <div class="comments-form">
            <h3>Leave a Reply</h3>
                <p>Your email address wlill no be published. Required fields are marked*</p>
         </div>

<% end_with %>
    <div class="col-sm-12">
        $CommentForm($Product.ID)
    </div>