我想在sonata管理包中自定义编辑页面中表单字段的呈现, 以包含使用字段文本内容的applet.
我知道我必须configureFormFields在admin类中编辑该函数,但我需要知道3件事:
我将SonataAdminBunle与symfony 2.2结合使用时出现问题.我有一个Project实体和一个ProjectImage实体,并指定这两者之间的一对多关系,如下所示:
class Project
{
/**
* @ORM\OneToMany(targetEntity="ProjectImage", mappedBy="project", cascade={"all"}, orphanRemoval=true)
*/
private $images;
}
class ProjectImage
{
/**
* @ORM\ManyToOne(targetEntity="Project", inversedBy="images")
* @ORM\JoinColumn(name="project_id", referencedColumnName="id")
*/
private $project;
}
Run Code Online (Sandbox Code Playgroud)
我已经配置了ProjectAdmin和ProjectImageAdmin:
class ProjectAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title')
->add('website')
->add('description', 'textarea')
->add('year')
->add('tags')
->add('images', 'sonata_type_collection', array(
'by_reference' => false
), array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'id',
))
;
}
}
class ProjectImageAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('file', …Run Code Online (Sandbox Code Playgroud) 我想在Sonata Admin show模板中生成一个小表单.到目前为止,我所做的是在自定义CRUD中为从Sonata的默认CRUD扩展的特定实体(顺序)创建函数;
public function approveOrderAction($id = null)
{
$request = $this->getRequest();
$id = $request->get($this->admin->getIdParameter());
$order = $this->admin->getObject($id);
$approveForm = $this->createFormBuilder($order)
->add('reqSecondApprover', 'checkbox', array('label' => 'Require second Approval', 'required' => false))
->add('secondApprover', 'choice', array('choices' => Crud::getWhatever(array('Developer')), 'required' => false))
->getForm();
$approveForm->handleRequest($request);
if ($approveForm->isSubmitted() && $approveForm->isValid()) {
$secondApproval = $request->request->get('form');
$approval = $approveForm->getData();
if (isset($secondApproval['reqSecondApprover'])) {
$order->setStatus(PmodOrder::STATUS_PARTLY_APPROVED);
} else {
$order->setStatus(PmodOrder::STATUS_APPROVED);
$order->setSecondApprover(null);
}
$em->persist($approval);
$em->flush();
return new RedirectResponse($this->admin->generateUrl('show'));
}
return $this->render('AppBundle:PmodOrder:order_approve.html.twig', array(
'order' => $order,
'form' => $approveForm->createView(),
));
}
Run Code Online (Sandbox Code Playgroud)
在我的orderAdmin我有 …
在这个页面上,我找到了如何为自定义操作添加路由.
protected function configureRoutes(RouteCollection $collection) {
$collection->add('ispremium', $this->getRouterIdParameter().'/ispremium');
}
Run Code Online (Sandbox Code Playgroud)
之后,我在Admin类中添加自定义操作:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('code', null, array('label' => 'Code'))
->add('_action', 'actions', array(
'actions' => array(
'ispremium' => array(
'template' => 'AppMyBundleBundle:Admin:ispremium.html.twig'
)
)
))
;
}
Run Code Online (Sandbox Code Playgroud)
它生成的URL如下:
/app_dev.php/admin/mobispot/discodes/discode/300876/ispremium
Run Code Online (Sandbox Code Playgroud)
我的链接模板:
<a href="{{ admin.generateObjectUrl('ispremium', object) }}">Link</a>
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决这个问题:
如何为该路由传递定义自定义控制器?现在我有一个错误:
方法"Sonata\AdminBundle\Controller\CRUDController :: ispremiumAction"不存在.
我可以使用generateUrl方法更改生成的网址吗?
因此,在Sonata Admin的编辑操作中,我试图根据创建或编辑上下文显示不同的表单字段.
也许有些背景先..
我有一个Gallery实体和一个与OneToOne绑定的CoverPhoto实体.
画廊:
/**
* @ORM\OneToOne(targetEntity="CoverImage", mappedBy="gallery", cascade={"all"}, orphanRemoval=true)
**/
private $cover;
Run Code Online (Sandbox Code Playgroud)
封面图片:
/**
* @ORM\OneToOne(targetEntity="Gallery", inversedBy="cover")
**/
private $gallery;
Run Code Online (Sandbox Code Playgroud)
这是相应的GalleryAdmin类:
class GalleriesAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
-> add('name', null, array('label' => 'Nazwa'))
-> add('category', 'sonata_type_model', array('label' => 'Kategoria'), array('subject' => $this -> getSubject()))
-> add('cover', 'sonata_type_admin', array('label' => 'Ok?adka'))
-> add('images', 'sonata_type_collection', array('by_reference' => false, 'label' => 'Powi?zane zdj?cia'), array(
'edit' => 'inline',
'sortable' => false, …Run Code Online (Sandbox Code Playgroud) 我正在使用带有StofDoctrineExtensionsBundle的DoctrineExtensions来获取软删除行为.
它在我的应用程序的前端非常有效.
在后端我需要"硬"删除实体的选项.
我在管理员控制器中禁用了过滤器(我使用SonataAdmin):
$filters = $this->getModelManager()->getEntityManager($this->getClass())->getFilters();
if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) {
$filters->disable('softdeleteable');
}
Run Code Online (Sandbox Code Playgroud)
这工作(软删除的实体显示在列表中),但当我尝试删除它时,实体再次被软删除.我怎么能强行"硬"删除?
我目前正面临着SonataAdminBundle的挑战,一对多的关系和文件上传.我有一个实体叫Client,一个叫ExchangeFile.一个人Client可以有几个ExchangeFile,所以我们在这里有一对多的关系.我正在使用VichUploaderBundle进行文件上传.
这是Client班级:
/**
* @ORM\Table(name="client")
* @ORM\Entity()
* @ORM\HasLifecycleCallbacks
*/
class Client extends BaseUser
{
// SNIP
/**
* @ORM\OneToMany(targetEntity="ExchangeFile", mappedBy="client", orphanRemoval=true, cascade={"persist", "remove"})
*/
protected $exchangeFiles;
// SNIP
}
Run Code Online (Sandbox Code Playgroud)
这是ExchangeFile班级:
/**
* @ORM\Table(name="exchange_file")
* @ORM\Entity
* @Vich\Uploadable
*/
class ExchangeFile
{
// SNIP
/**
* @Assert\File(
* maxSize="20M"
* )
* @Vich\UploadableField(mapping="exchange_file", fileNameProperty="fileName")
*/
protected $file;
/**
* @ORM\Column(name="file_name", type="string", nullable=true)
*/
protected $fileName;
/** …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在sonata管理包的管理控制器中设置flash消息的方法,它们允许在CRUDController中设置flash消息
$this->get('session')->setFlash('sonata_flash_error', 'flash_batch_merge_error');
Run Code Online (Sandbox Code Playgroud)
但不在管理控制器中,
这是我的管理员控制器
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
class ConfigAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('System Settings')
->add('Name','text', array('label' => "Configuration Name"))
->add('Language', 'choice', array(
'label' => 'System Language',
'choices' => array(0 => 'English', 1 => 'Swedish'),
'preferred_choices' => array(0),
))
->add('commonmail','text', array('label' => "Common e-Mail"))
->add('dateformat','text', array('label' => "Date format"))
->add('currencyformat','text', array('label' => "Currency format"))
->end()
}
public function postUpdate($object) {
// here i need to perform some …Run Code Online (Sandbox Code Playgroud) 我使用sonata-admin包.我在PageEntity中与用户(FOSUserBundle)有关系.我想保存创建或更改页面的当前用户.
我的猜测是获取admin类的postUpdate和postPersist方法中的用户对象,并且此对象在setUser方法中传输.
但是如何实现呢?
在google的小组中,我看到了
public function setSecurityContext($securityContext) {
$this->securityContext = $securityContext;
}
public function getSecurityContext() {
return $this->securityContext;
}
public function prePersist($article) {
$user = $this->getSecurityContext()->getToken()->getUser();
$appunto->setOperatore($user->getUsername());
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用
我在Symfony 3中使用了SonataAdminBundle.因为我使用Symfony 3,我仍然无法使用SonataUserBundle.所以我只使用带有FOSUserBundle的SonataAdminBundle.
现在我试图实现的是隐藏每个角色的特定路线.例如,我只有三个角色;
超级管理员拥有管理员拥有的所有角色,管理员拥有所有第三个角色,第三个显然拥有ROLE_USER.超级管理员应该能够创建新用户并为他分配角色.超级管理员还应该能够更改用户的密码.用户应该能够更改自己帐户的密码.最后,超级管理员不应该更改自己的角色和创建新用户的其他角色.
如何在不使用SonataUserBundle的情况下实现此目的.为了删除路线部分我试过这样的事情:
protected function configureRoutes(RouteCollection $collection)
{
$securityContext = $this->getConfigurationPool()->getContainer()->get('security.authorization_checker');
if (!$securityContext->isGranted('ROLE_SUPER_ADMIN')) {
$collection->remove('create');
$collection->remove('edit');
}
}
Run Code Online (Sandbox Code Playgroud)
但我想有更好的解决方案.我完全了解有关安全性的官方文档,但我对此感到困惑,这是否意味着我必须对我security.yml文件中所有不同管理员的每个角色进行硬编码?没有SonataUserBundle,这甚至可以工作吗?我不想为ACL添加额外的数据库表.
有人可以帮助和/或提供一个很好的例子吗?我会非常感激的.
sonata-admin ×10
symfony ×9
php ×4
symfony-2.1 ×2
admin ×1
doctrine-orm ×1
forms ×1
soft-delete ×1
sonata ×1