我正在为用户之间的私人消息构建一个包。
这是我的控制器的收件箱操作。它的作用是获取当前用户的消息,它将查询传递给KNPpaginator以显示其中的一部分。我还保存了数据库中页面上显示的结果数量。一个表单是一个下拉列表,用于显示每页显示的结果数量。另一种形式由复选框和带动作的下拉列表组成。根据选择的动作,我将消息的id(选中的复选框id)传递给另一个名为markAction的函数(也是一个可以通过转到特定URL来标记单个消息的页面)
public function inboxAction(Request $request)
{
$messages = $this->getDoctrine()->getRepository('PrivateMessageBundle:Message');
$mymsg = $messages->findMyMessages($this->getUser());
$message_settings = $this->getDoctrine()->getRepository('PrivateMessageBundle:MessageSettings');
$perpage = $message_settings->findOneBy(array('user' => $this->getUser()));
$pagerform = $this->createForm(new MessageSettingsType(), $perpage);
$pagerform->handleRequest($request);
if ($pagerform->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($perpage);
$em->flush();
}
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$mymsg,
$request->query->get('page', 1)/*page number*/,
$perpage ? $perpage->getResPerPage() : 10/*limit per page*/,
array('defaultSortFieldName' => 'a.sentAt', 'defaultSortDirection' => 'desc')
);
$form = $this
->createForm(
new ActionsType(),
$mymsg->execute()
);
$form->handleRequest($request);
if ($form->isValid()) {
$data = $form->getData();
$ids = array();
foreach ($data['checkboxes'] as $checkbox) {
$ids[] = $checkbox->getId();
}
$action = $data['inboxactions'];
$this->markAction($action, $ids);
return $this->redirectToRoute('private_message_inbox');
}
return $this->render(
'@PrivateMessage/inbox.html.twig',
array(
'messageList' => $pagination,
'form' => $form->createView(),
'pagerform' => $pagerform->createView(),
)
);
}
我的收件箱控制器中的标记操作用户。基于一个参数,我将相应的操作应用于第二个参数,如果页面是通过路由调用的,则是一条消息,如果通过我的inboxAction调用,则可以是一个消息数组。我做了一些一致性检查,然后标记我的消息。
public function markAction($action, $msgs)
{
if (!$msgs) {
$this->addFlash(
'error',
'Select at least one message!'
);
return;
} else {
if (!$action) {
$this->addFlash(
'error',
'Select one action to apply to your items!'
);
return;
} else {
$messages = $this->getDoctrine()->getRepository('PrivateMessageBundle:Message');
$em = $this->getDoctrine()->getManager();
$msg = $messages->findBy(array('receiver' => $this->getUser(), 'id' => $msgs));
$good = 0;
foreach ($msg as $isforme) {
$good++;
switch ($action) {
case 'spam': {
if ($isforme->getIsSpam() == false) {
$isforme->setIsSpam(true);
if (!$isforme->getSeenAt()) {
$isforme->setSeenAt(new \DateTime('now'));
}
$em->persist($isforme);
}
break;
}
case 'unspam': {
if ($isforme->getIsSpam() == true) {
$isforme->setIsSpam(false);
$em->persist($isforme);
}
break;
}
case 'viewed': {
if ($isforme->getSeenAt() == false) {
$isforme->setSeenAt(new \DateTime('now'));
$em->persist($isforme);
}
break;
}
case 'unviewed': {
if ($isforme->getSeenAt() != false) {
$isforme->setSeenAt(null);
$em->persist($isforme);
}
break;
}
default: {
$this->addFlash(
'error',
'There was an error!'
);
return;
}
}
$em->flush();
}
$this->addFlash(
'notice',
$good.' message'.($good == 1 ? '' : 's').' changed!'
);
}
}
if ($action == 'unspam') {
return $this->redirectToRoute('private_message_spam');
} else {
return $this->redirectToRoute('private_message_inbox');
}
}
作为symfony的新手,我不确定我的markAction功能有多好。我觉得它可以更简单,但我不确定如何制作它。
现在,我的实际问题。如何呈现我的捆绑包的其他页面,例如已发送或垃圾邮件?我必须更改的inboxAction中唯一的行是
$mymsg = $messages->findMyMessages($this->getUser());
例如,让它返回垃圾邮件或用户发送邮件。 和
return $this->render(
'@PrivateMessage/inbox.html.twig',...
所以我实际上返回了相应页面的视图。我已经制作了其他页面并在其他操作中复制了代码,但我想我可以这样做,所以我一次编写这段代码,但不知道如何。
其他一切都完全相同。如何在所有其他操作中复制并粘贴此代码并使其更具可重用性?
答案 0 :(得分:1)
你可以改变你的路线更加动态:
# app/config/routing.yml
mailclient:
path: /mailclient/{page}
defaults: { _controller: AppBundle:Mailclient:index, page: "inbox" }
结果是这条路线:
/mailclient
/mailclient/inbox
/mailclient/sent
/mailclient/trash
将全部调用相同的动作。
现在您的方法(Action)将获得一个额外的参数:
public function indexAction($page, Request $request)
{
// ...
}
通过此参数,您可以了解用户希望看到的内容。现在您可以开始编写更具动态性的代码了。您可以考虑在控制器类中添加一些可以从indexAction调用的私有函数 你也可以简单地创建自己的类。