我使用SonataAdminBundle。我的目标是管理我的文章,从而允许管理员通过管理界面创建。
这是在我的User类中如何定义关系的。
所以我必须使用:
/**
* @var articles
*
* Here we will set the OneToMany relationship (Many: One - article : user)
* @ORMOneToMany(targetEntity="KarkRecetteBundleEntityArticle", mappedBy="user", cascade={"persist", "remove"})
*/
protected $articles;
public function __construct()
{
//Une classe à pour instrctruction dans sont constructeur, le constructeur du parent
parent::__construct();
$this->articles = new DoctrineCommonCollectionsArrayCollection();
}
/**
* Get articles
*
* @return ArrayCollection
*/
public function getArticles()
{
return
$articles;
}
/**
*
* @param $unArticle
*/
public function addArticle(KarkRecetteBundleEntityArticle $unArticle)
{
$this->articles[] = $unArticle;
$unArticle->setUser($this);
}
在我的class中Article:
/**
* @ORMManyToOne(targetEntity="KarkUserBundleEntityUser", inversedBy="articles")
*/
private $user;
/**
* Set user
*
* @param User
* @return article
*/
public function setUser(KarkUserBundleEntityUser $unUser)
{
$this->user = $unUser;
return $this;
}
/**
* Get user
*
* @return User
*/
public function getUser()
{
return $this->user;
}
在我的SonataAdminBundle我然后定义了两个实体CRUD控制器User和Article:
namespace KarkAdminBundleController;
use SonataAdminBundleControllerCRUDController as Controller;
class ArticleAdminController extends Controller
{
}
下面是CRUD用户:
<?php
namespace KarkAdminBundleController;
use SonataAdminBundleControllerCRUDController as Controller;
class UserAdminController extends Controller
{
}
和它们在admin.cfg中的配置:
# Kark/AdminBundle/Resources/config/admin.yml
services:
kark.admin.admin.article:
class: KarkAdminBundleAdminArticleAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: Article, label: articles }
arguments:
- ~
- KarkRecetteBundleEntityArticle
- KarkAdminBundle:ArticleAdmin
下面是User实体的部分:
kark.admin.admin.userarticle:
class: KarkAdminBundleAdminUserAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: user, label: users }
arguments:
- ~
- KarkUserBundleEntityUser
- KarkAdminBundle:UserAdmin
一切都设置好了,我在我的文章的Admin类中有以下定义:
<?php
namespace KarkAdminBundleAdmin;
use SonataAdminBundleAdminAdmin;
use SonataAdminBundleFormFormMapper;
use SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleDatagridListMapper;
use SonataAdminBundleShowShowMapper;
use KarkRecetteBundleEntityArticle;
use KarkRecetteBundleEntityImageArticle;
use KnpMenuItemInterface as MenuItemInterface;
class ArticleAdmin extends Admin
{
// setup the default sort column and order
protected $datagridValues = array(
'_sort_order' => 'ASC',
'_sort_by' => 'name'
);
// L'ensemble des champs qui seront montrer lors de la création ou de la modification d'une entité
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('General')
->add('titre', 'text')
->add('imageArticle', 'sonata_type_admin', array('delete' => false), array('required' => true, 'edit' => 'inline'))
->add('contenu','textarea');
}
/**
*
* Fonction qui va permettre d'afficher les différent filtres de recherche dans notre tableau
* de notre interface.
*
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('titre')
->add('user.username')
;
}
/**
* Fonction qui redéfini celle de la classe mère Admin. Cette fonction va nous permettre de préciser les
* champs qui seront affiché dans notre tableau lorsque l'on listera nos entités
*/
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('titre')
->add('date', null, array('route' => array('name' => 'show')))
->add('contenu')
->add('user.username')
->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'delete' => array()
)
))
;
}
/**
* Fonction qui redéfinie la fonction de la classe mère qui permet d'indiquer les champs qui seront affiché
* lorsque l'on consultera un article
*/
protected function configureShowFields(ShowMapper $showMapper)
{
$showMapper
->add('date')
->add('titre')
->add('contenu')
->add('imageArticle.getWebPath()', 'string', array('template' => 'KarkAdminBundle:ArticleAdmin:list_image.html.twig'))
->add('user.username')
;
}
/**
* {@inheritdoc}
*/
public function prePersist($object)
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
$user->addArticle($object);
}
/**
* {@inheritdoc}
*/
public function preUpdate($object)
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
$user->addArticle($object);
}
}
但是,文章没有插入,因为它执行了insert和UPDATE,并且在表'article_audit中它执行了两次相同的插入,因此存在一个重复主键…
[3/4] UniqueConstraintViolationException: An exception occurred while executing 'INSERT INTO article_audit (rev, revtype, imageArticle_id, user_id, id, date, titre, contenu, publication, dateEdition, slugTitre) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["545", "UPD", 43, 1, 43, "2014-06-16 23:28:40", "qsmodjqskdjqslkdqjsk", "<p>qsldkqsmldkqslmdkqsmdlqslk lmqskdmlqskdqsmld qskdjqslkdqjsldqksd</p>", 0, "2014-06-16 23:28:40", "qsmodjqskdjqslkdqjsk"]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '43-545' for key 'PRIMARY'
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '43-545' for key 'PRIMARY'
日志文件如下:
DEBUG - INSERT INTO article (date, titre, contenu, publication, dateEdition, slugTitre, imageArticle_id, user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - INSERT INTO article_audit (rev, revtype, imageArticle_id, user_id, id, date, titre, contenu, publication, dateEdition, slugTitre) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - UPDATE article SET date = ?, titre = ?, contenu = ?, publication = ?, dateEdition = ?, slugTitre = ?, imageArticle_id = ?, user_id = ? WHERE id = ?
DEBUG - INSERT INTO article_audit (rev, revtype, imageArticle_id, user_id, id, date, titre, contenu, publication, dateEdition, slugTitre) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - "ROLLBACK"
CRITICAL - Uncaught PHP Exception SonataAdminBundleExceptionModelManagerException: "Failed to create object: KarkRecetteBundleEntityArticle" at /var/www/recette-etudiant/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php line 142
UPDATE -
我尝试以传统的方式插入,也就是说,在我的ArticleController中插入一个操作,该操作如下:
ajouterNewsAction($_local){//整个创作将通过这个表单完成$monArticle = new Article();
// We create our form using an external class
$monFormulaire = $this->createForm(new ArticleType, $monArticle);
// Query is recovered
$request = $this->get('request');
// When sending a form, it is realized through transfer data from page to page via a method
//called POST. So we'll check when calling this function if this method is effective, if the case is
//data that have been transmitted via a data form.
if($this->get('request')->getMethod() == 'POST')
{
// Process the data here we will moisturize our form with what was before retrieving values
// my $ _POST superglobal via a rather fast function
$monFormulaire->bind($request);
// Check that the values entered are correct. Validation objects is via annotation
// Constraints our class Validator aliased via our @ Assert.
if($monFormulaire->isValid())
{
// If the item is actually add is that everything is good then created a Tag
$this->get('session')->getFlashBag()->add('AjoutRealise', 'L'article a été rajouté avec succès');
// Get the current utilistaeur
$user = $this->getUser();
// We persist then our body hydrated by Form
$entity_manager = $this->getDoctrine()->getManager();
// Get the service management of user FOSUserBundle
$userManager = $this->get('fos_user.user_manager');
//We add a user to our article
$user->addArticle($monArticle);
$userManager->updateUser($user);
$entity_manager->flush();
//We redirect to the page display section
return $this->redirect($this->generateUrl('karkrecette_voir_article', array("id" => $monArticle->getId(), "slugTitre" => $monArticle->getSlugTitre() )));
}
}
// If we're not in the presence of a méthde get is that the form is not sent, then it is blank
//Otherwise it is possible that the form is not valid, it displays the form hydrating value previously entered
return $this->render('KarkRecetteBundle:Article:ajouter.html.twig', array("form" => $monFormulaire->createView(), "langue" => $_local));
}
如果我在admin。为管理我的Article类而定义的服务;没有问题,因为SonataAdmin没有被触发。但是我真的需要管理我的文章对象。
谢谢。
问题出在你的用户类:
/**
*
* @param $unArticle
*/
public function addArticle(KarkRecetteBundleEntityArticle $unArticle)
{
$this->articles[] = $unArticle;
$unArticle->setUser($this);
}
应该是
/**
*
* @param $unArticle
*/
public function addArticle(KarkRecetteBundleEntityArticle $unArticle)
{
$this->articles[] = $unArticle;
}
因为你在User和Article之间有一对多的映射关系,根据上面的User类代码,它违反了完整性约束,因为它基本上试图为一篇文章设置多个用户。
当我更新Symfony 2.3到2.6@dev在我的作曲家。json,我解决了我的问题。当然,这只是一个内部问题。