- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有这个 Alias
实体:
use Gedmo\Timestampable\Traits\TimestampableEntity;
class Alias
{
use IdentifierAutogeneratedTrait;
use TimestampableEntity;
use ActiveTrait;
/**
* @var string
* @ORM\Column(type="string", length=150)
*/
private $name;
/**
* Command associated to the alias.
*
* @var Command[]
* @ORM\ManyToMany(targetEntity="Command", mappedBy="aliases", cascade={"persist"})
*/
private $commands;
...
}
我有这个管理 Controller :
class AliasAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', null, array('required' => true))
->add('active', null, array('required' => false));
}
...
public function prePersist($alias)
{
// remove extra white spaces
$noWhiteSpaces = str_replace(' ', '', $alias->getName());
// split into several names
$aliasArr = explode(',', $noWhiteSpaces);
}
public function preUpdate($alias)
{
...
}
}
当我在 View 上添加一个新的 Alias
- 即表单本身 - 我可以在 name
输入字段上写一个值,例如: value1
或者我可以写多个逗号分隔的值:value1, value2, value3, value4
。如果我在提交表单时 name
字段上只有一个值,那么就没有问题,但如果我有多个逗号分隔,如第二个示例,那么我应该在 上检查它们prePersist/preUpdate
方法来拆分它们并为每个 name
创建一个 Alias
,我该怎么做?如果您查看 prePersist
方法,您会更清楚地了解如何在新的 $aliasArr
中为每个名称创建新的别名,任何帮助?
更新:TimestampableEntity 没有被处理,为什么?
在尝试了@m-khalid-junaid 的解决方案后,由于 NOT NULL
约束,我以下面的错误结束,但我不知道为什么。看一下代码:
class AliasAdminController extends Controller
{
/**
* {@inheritdoc}
*/
public function createAction(Request $request = null)
{
// the key used to lookup the template
$templateKey = 'edit';
if (false === $this->admin->isGranted('CREATE')) {
throw new AccessDeniedException();
}
$object = $this->admin->getNewInstance();
$this->admin->setSubject($object);
/** @var $form \Symfony\Component\Form\Form */
$form = $this->admin->getForm();
$form->setData($object);
if ($this->getRestMethod() == 'POST') {
$form->submit($this->get('request'));
$isFormValid = $form->isValid();
// persist if the form was valid and if in preview mode the preview was approved
if ($isFormValid && (!$this->isInPreviewMode() || $this->isPreviewApproved())) {
if (false === $this->admin->isGranted('CREATE', $object)) {
throw new AccessDeniedException();
}
try {
$aliasArr = $this->toStrings($object->getName());
if (count($aliasArr) > 1) {
$object->setName($aliasArr[0]);
$object = $this->admin->create($object);
unset($aliasArr[0]);
$entityManager = $this->getDoctrine()->getManager();
foreach ($aliasArr as $alias) {
$newAlias = new Alias();
$newAlias->setName($alias);
$entityManager->persist($newAlias);
}
$entityManager->flush();
} else {
$object = $this->admin->create($object);
}
if ($this->isXmlHttpRequest()) {
return $this->renderJson(array(
'result' => 'ok',
'objectId' => $this->admin->getNormalizedIdentifier($object),
));
}
$this->addFlash(
'sonata_flash_success',
$this->admin->trans(
'flash_create_success',
array('%name%' => $this->escapeHtml($this->admin->toString($object))),
'SonataAdminBundle'
)
);
// redirect to edit mode
return $this->redirectTo($object);
} catch (ModelManagerException $e) {
$this->logModelManagerException($e);
$isFormValid = false;
}
}
// show an error message if the form failed validation
if (!$isFormValid) {
if (!$this->isXmlHttpRequest()) {
$this->addFlash(
'sonata_flash_error',
$this->admin->trans(
'flash_create_error',
array('%name%' => $this->escapeHtml($this->admin->toString($object))),
'SonataAdminBundle'
)
);
}
} elseif ($this->isPreviewRequested()) {
// pick the preview template if the form was valid and preview was requested
$templateKey = 'preview';
$this->admin->getShow();
}
}
$view = $form->createView();
// set the theme for the current Admin Form
$this->get('twig')->getExtension('form')->renderer->setTheme($view, $this->admin->getFormTheme());
return $this->render($this->admin->getTemplate($templateKey), array(
'action' => 'create',
'form' => $view,
'object' => $object,
));
}
/**
* {@inheritdoc}
*/
public function editAction($id = null)
{
// the key used to lookup the template
$templateKey = 'edit';
$id = $this->get('request')->get($this->admin->getIdParameter());
$object = $this->admin->getObject($id);
if (!$object) {
throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
}
if (false === $this->admin->isGranted('EDIT', $object)) {
throw new AccessDeniedException();
}
$this->admin->setSubject($object);
/** @var $form \Symfony\Component\Form\Form */
$form = $this->admin->getForm();
$form->setData($object);
if ($this->getRestMethod() == 'POST') {
$form->submit($this->get('request'));
$isFormValid = $form->isValid();
// persist if the form was valid and if in preview mode the preview was approved
if ($isFormValid && (!$this->isInPreviewMode() || $this->isPreviewApproved())) {
try {
$aliasArr = $this->toStrings($object->getName());
if (count($aliasArr) > 1) {
$object->setName($aliasArr[0]);
$object = $this->admin->update($object);
unset($aliasArr[0]);
$entityManager = $this->getDoctrine()->getManager();
foreach ($aliasArr as $alias) {
$newAlias = new Alias();
$newAlias->setName($alias);
$entityManager->persist($newAlias);
}
$entityManager->flush();
} else {
$object = $this->admin->update($object);
}
if ($this->isXmlHttpRequest()) {
return $this->renderJson(array(
'result' => 'ok',
'objectId' => $this->admin->getNormalizedIdentifier($object),
));
}
$this->addFlash(
'sonata_flash_success',
$this->admin->trans(
'flash_edit_success',
array('%name%' => $this->escapeHtml($this->admin->toString($object))),
'SonataAdminBundle'
)
);
// redirect to edit mode
return $this->redirectTo($object);
} catch (ModelManagerException $e) {
$this->logModelManagerException($e);
$isFormValid = false;
}
}
// show an error message if the form failed validation
if (!$isFormValid) {
if (!$this->isXmlHttpRequest()) {
$this->addFlash(
'sonata_flash_error',
$this->admin->trans(
'flash_edit_error',
array('%name%' => $this->escapeHtml($this->admin->toString($object))),
'SonataAdminBundle'
)
);
}
} elseif ($this->isPreviewRequested()) {
// enable the preview template if the form was valid and preview was requested
$templateKey = 'preview';
$this->admin->getShow();
}
}
$view = $form->createView();
// set the theme for the current Admin Form
$this->get('twig')->getExtension('form')->renderer->setTheme($view, $this->admin->getFormTheme());
return $this->render($this->admin->getTemplate($templateKey), array(
'action' => 'edit',
'form' => $view,
'object' => $object,
));
}
private function logModelManagerException($e)
{
$context = array('exception' => $e);
if ($e->getPrevious()) {
$context['previous_exception_message'] = $e->getPrevious()->getMessage();
}
$this->getLogger()->error($e->getMessage(), $context);
}
private function toStrings($string)
{
$noWhiteSpaces = str_replace(' ', '', $string);
return explode(',', $noWhiteSpaces);
}
}
这是错误:
[2016-02-28 11:10:36] doctrine.DEBUG: "START TRANSACTION" [] []
[2016-02-28 11:10:36] doctrine.DEBUG: INSERT INTO cm_alias (name, created_at, updated_at, active) VALUES (?, ?, ?, ?) {"1":"alias1","2":null,"3":null,"4":true} []
[2016-02-28 11:10:36] doctrine.DEBUG: "ROLLBACK" [] []
[2016-02-28 11:10:36] app.ERROR: Failed to create object: PlatformAdminBundle\Entity\Alias {"exception":"[object] (Sonata\\AdminBundle\\Exception\\ModelManagerException(code: 0): Failed to create object: PlatformAdminBundle\\Entity\\Alias at /var/www/html/platform.sonata/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php:142, Doctrine\\DBAL\\Exception\\NotNullConstraintViolationException(code: 0): An exception occurred while executing 'INSERT INTO cm_alias (name, created_at, updated_at, active) VALUES (?, ?, ?, ?)' with params [\"alias1\", null, null, 1]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1048 Column 'created_at' cannot be null at /var/www/html/platform.sonata/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:112, Doctrine\\DBAL\\Driver\\PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'created_at' cannot be null at /var/www/html/platform.sonata/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:93, PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'created_at' cannot be null at /var/www/html/platform.sonata/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:91)","previous_exception_message":"An exception occurred while executing 'INSERT INTO cm_alias (name, created_at, updated_at, active) VALUES (?, ?, ?, ?)' with params [\"alias1\", null, null, 1]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1048 Column 'created_at' cannot be null"} []
为什么 TimestampableEntity
特性没有被新的管理 Controller 处理?我在这里缺少什么?
最佳答案
如果您想添加具有不同别名的相同对象,最好创建一个 CRUDController
管理类的 Controller ,一旦有了 CRUDController,就可以覆盖 createAction
& editAction
基类的基类并在此处实现您的逻辑 prePresist/preUpdate 事件,供您当前的对象使用,以使用 Controller 为您的对象创建具有不同信息的副本。我在下面只提到了必要的代码,您可以从 sonata 的 CRUDController 复制并在 editAction
中实现相同的逻辑。
public function createAction(Request $request = null)
{
// .. some code here copy from base class
try {
$noWhiteSpaces = str_replace(' ', '', $object->getName());
// split into several names
$aliases = explode(',', $noWhiteSpaces);
if (count($aliases) > 1) {
$object->setName($aliases[0]);
$object = $this->admin->create($object);
unset($aliases[0]);
$DM = $this->getDoctrine()->getManager();
foreach ($aliases as $alias) {
$newAlias = new Alias();
$newAlias->setName($alias);
$DM->persist($newAlias);
}
$DM->flush();
} else {
$object = $this->admin->create($object);
}
} catch (ModelManagerException $e) {
$this->handleModelManagerException($e);
$isFormValid = false;
}
// .. some code here copy from base class
}
为 created_at
编辑非空错误
您需要在您的别名实体中定义一个构造函数并在那里初始化您的 createdAt
属性(property) DateTime
对象
/**
* Constructor
*/
public function __construct()
{
$this->createdAt = new \DateTime('now');
}
关于php - 我可以在 Sonata Admin Controller 中使用 prePersist/preUpdate 来持久化多个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684643/
我在继承和 方面遇到了一些问题@PrePersist 注解。 我的源代码如下所示: _带有带注释的 updateDates() 方法的“基”类: @javax.persistence.Entity @
我有 GenericEntity 类,其中包含 @PrePersist 方法 onCreate(),它在将实体保存到数据库之前设置时间戳。它运行良好,但当我尝试测试我的 DAO 类时,我遇到了问题。
我是 Symfony2 的新手,我想知道 prePersist 和 preUpdate 事件有什么区别。看起来 prePersist 在我“保留”记录之前被“触发”,但是 preUpdate 什么时候
我如何模拟 @PrePersist 方法,例如我实例化的实体的 preInit() ? 我正在使用 TestNG。 EasyMock 是首选。 @Test(enabled = true) public
我的实体的 prePersist() 方法没有被调用。 username = $username; return $this; } /** * Get use
我用这段线来合并: partner = em.merge(partner); 这是在我的实体中: @PrePersist public void updateModificationDate(){
我有以下用于将用户存储在数据库中的实体,目前它仍然是 WIP,但我在创建新用户时遇到重复问题。每次我使用注册表单和 prePersist 添加新用户时,它都会复制 Roles 表中的值。在 addUs
我正在使用 Hibernate 和 MySQL 在 Spring MVC 中开发一个应用程序,但我遇到了一个问题。我正在尝试使用 @PrePersist 注释在我的 Java 实体中填充我最后修改的字
我在实现 Doctrine EventListener 时遇到问题。创建新发票时,InvoiceType 表单中包含一组项目(标题、价格、金额)。对于发票,在 price 字段中,我想插入所有购买产品
假设以下代码片段使用 @PrePersist 和 @PreUpdate 注释和 Joined-type 继承: @Entity @Inheritance(strategy=InheritanceTyp
根据doctrine documentary : The prePersist event occurs for a given entity before the respective Entity
我的 Symfony2 项目中有一个 Doctrine2 实体(称之为实体 A)。该实体与项目中的另一个实体(称为实体 B)具有 ManyToOne 关系。 实体 A 的状态属性为“事件”或“非事件”
根据doctrine documentary : The prePersist event occurs for a given entity before the respective Entity
如果未手动设置,我想自动设置其中一个实体字段。有没有办法检查这个?这些字段有一个默认值,所以我不能简单地比较这个值。我想知道学说是否维持值(value)是否改变以及我是否可以访问该信息。 此外,Doc
我编写了一个 @PrePersist 方法,该方法在保留我的 User 对象之前调用。该方法的目的是为用户进行一种预订,因此其他人无法获取他的电子邮件地址。因此,当用户即将被保留时,我说,“为用户#x
我有这个“架构”的“发布”实体/表: @Id @GeneratedValue(strategy = GenerationType.AUTO) int id; @GeneratedValue(strat
我有一个事务性警报表和一个主警报类型表。我想在表中添加警报时发送一封电子邮件,所以我想我会使用 PrePersist。但是,在我的电子邮件中,我想包含一些包含在警报类型表中的信息。 我试图在 Aler
我的代码 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class SiteMessage imple
我正在使用基本实体: @MappedSuperclass public class BaseEntity { private static final Logger L = LoggerFac
好吧,我是 symfony 的初学者,到目前为止,我开发了一个网站,用户可以在其中注册自己,并在登录后动态创建表单,但我的注册表单无法按预期工作。我的基本想法是当用户尝试注册自己时,预先检查他输入的客
我是一名优秀的程序员,十分优秀!