在 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>
我有这个结构...:[=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>