我有这种结构......:
产品和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我不能工作。
答案 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>