要在DataObject,SilverStripe 3.1.12中注释的表单

时间:2015-04-01 09:01:24

标签: php forms silverstripe

我有这种结构......:

产品和GT; mysite的>代码>产品与GT; 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();

    }

}

产品和GT; mysite的>代码>产品与GT; 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
        );
    }
}

产品和GT; mysite的>代码>扩展> ProductExtension> ProductComments.php

是一个包含很多评论的DataExtension ......

class ProductComments extends DataExtension{

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

产品和GT; mysite的>代码>扩展> ProductExtension> ProductComment.php

要评论的简单DataObject ...

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添加扩展注释...

产品和GT; mysite的> _config> config.yml

Product:
  extensions:
    - ProductComments

SilverStripe文件(.ss)...

产品和GT;主题> my_theme>模板>布局和GT; 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 %>

产品和GT;主题&GT; my_theme&GT;模板&GT;布局和GT; 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,这是错误的......发布DataObject的产品(发表评论)的最佳方式是什么?我看过这篇文章Submit Form in Dataobject - Silverstripe 3.1我不能工作。

1 个答案:

答案 0 :(得分:0)

<强>解决方案

好吧,我得到了解决问题的方法......通过这种方式,我可以在DataObject中发表评论...

<强>产品和GT; mysite的&GT;代码&GT;产品与GT; 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):在HiddenField中创建表单注释并保存产品ID,以便按产品进行句柄注释。

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

<强>产品和GT; mysite的&GT;代码&GT;产品与GT; ProductsPage.php

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

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

<强>产品和GT; mysite的&GT;代码&GT;扩展&GT; ProductExtension&GT; ProductComments.php

是一个包含许多注释的DataExtension ...

 class ProductComments extends DataExtension{

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

<强>产品和GT; mysite的&GT;代码&GT;扩展&GT; ProductExtension&GT; 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;
        }
    }

<强>产品和GT; mysite的&GT; _config&GT; config.yml

Product:
      extensions:
        - ProductComments

<强>产品和GT;主题&GT; my_theme&GT;模板&GT;布局和GT; 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>
相关问题