首先,我不确定这是Sonata问题还是Symfony2问题,这是我第一次使用Sf2表单来编辑关系.
这是问题所在:
我有两个课程,让我们称之为旧的最爱:Car和Wheel.Car与Wheel有一个可选的一对一关系(举个例子,就这么说吧......).我已经设置了SonataAdmin,CarAdmin其中包含一个嵌入WheelAdmin使用的类,sonata_type_admin并尝试创建一个Car而不输入任何Wheel数据.
但是,在提交时(在$ form-> bind()/ $ form-> submit()的某个地方,我可以跟踪)Symfony和/或Sonata实例化一个Wheel并试图保持它(其所有值为null) .由于Wheel具有一些非null约束,因此抛出DBALException,抱怨您无法使用null值来插入Wheel.
这很顽皮,我想阻止它发生.如果我没有输入Wheel的任何细节,我不希望幻影轮对我的代码和数据库造成威胁.我期望的是,如果我没有输入任何数据,就没有任何内容可以插入/保留,所以它不会被单独留下.但这不是正在发生的事情...... 任何想法如何将其驯服成合情合理的东西?
这是长版本,包含代码块和所有内容:
ORM定义首先:
# MyNS\MyBundle\Resources\Config\Doctrine\Car.orm.yml
MyNS\MyBundle\Entity\Car:
  type: entity
  repositoryClass: MyNS\MyBundle\Entity\Repositories\CarRepository
  table: test_cars
  id:
    id:
      type:                     integer
      generator:                { strategy: AUTO }
  fields:
    color:
      type:                     string
      length:                   50
    owner:
      type:                     string
      length:                   50
      nullable:                 true
  oneToOne:
    leftFrontWheel:
      targetEntity:             Wheel
      cascade:                  [ persist ]
      joinColumn:
        name:                   leftFrontWheelId
        referencedColumnName:   id
# MyNS\MyBundle\Resources\Config\Doctrine\Wheel.orm.yml
MyNS\MyBundle\Entity\Wheel:
  type: entity
  repositoryClass: MyNS\MyBundle\Entity\Repositories\WheelRepository
  table: test_wheels …如何更改SonataAdminBundle中的默认实体顺序以进行列表操作?
回答:)将此添加到您的管理类
Run Code Online (Sandbox Code Playgroud)protected $datagridValues = array( '_page' => 1, '_sort_order' => 'DESC', // sort direction '_sort_by' => 'id' // field name );
我按照这个文档来安装SonataMediaBundle但是我收到了这个错误:
PHP Fatal error:  Class 'Application\Sonata\MediaBundle\ApplicationSonataMediaBundle' not found in /var/www/znata.com/app/AppKernel.php on line 47
使用sonata命令后生成应用程序:
php app/console sonata:easy-extends:generate SonataMediaBundle
新目录生成于:
apps/Application/Sonata/MediaBundle
一切都已完成,但当我在AppKernel.php中注册生成的应用程序时,我收到了该错误.
public function registerbundles()
{
    return array(
        ...
        new Application\Sonata\MediaBundle\ApplicationSonataMediaBundle(),
        ...
    );
}
你知道如何解决这个问题吗?
我正在扩展Sonata用户包并在新用户实体中创建一些额外的字段.这些字段仅在用户下的Sonata管理区域内更新,因此不需要在编辑配置文件表单中提供这些字段.我无法通过Sonata用户管理器更新这些字段,并尝试了几种不同的方法在Application\Sonata\UserBundle中扩展/实现该类.有没有人遇到过这个,可以给我一个教程或一步一步的过程,以最简洁的方式来扩展新的用户实体?
我的实体上有一些不可变的属性来管理sonata-admin包.
我想在实体的编辑视图中显示它们,但不想提供任何改变它的机制(例如,值不应在输入字段内)
除了这个,我找不到任何东西:
$formMapper
    ->add('post', 'entity', 
        array(
            'label' => 'Some post', 
            'attr' => array(
                'readonly' => true,
                'disabled' => true
            ),
            'class' => 'Acme\DemoBundle\Entity\Post'
        )
    )
;
我尝试过了有read_only,readonly,disabled等所有的东西.它看起来不错,它现在位于下拉列表中(因为它是一个实体),我无法修改它.
但我甚至不希望如此.我真的需要它作为文本(当前的一个).
特别是如果你使用具有softdeletable,timestampable的DoctrineExtensions,这很烦人,因为每次"保存"也会保存表单数据.
将类型更改为"text"而不是"entity"会将输入字段替换为下拉列表.那么,这里最好的方法是什么?
我正在使用SonataAdminBundle我的应用程序中管理实体.该网站的管理员可以添加视频,其中一些首先需要由他们的扬声器批准.已经有一个授权系统正在运行 - 我有一个工作代码,它将生成一个特殊链接,并通知可以批准或拒绝视频的发言人,并自动通知管理员.
我想自定义我的管理部分,因此ask for authorization视频旁边会有一个按钮.我可以在list action(/admin/acme/videos/list)或右边nav(/admin/acme/videos/x/edit/)中的某个编辑操作中使用它
这样做的最佳方法是什么?文档对块自定义说的很少,但我发现这个例子可能是我正在寻找的东西,但我无法弄清楚如何使用它.
一个选项是使用preUpdate钩子,并为编辑操作添加一个复选框,但按钮会更好.
我安装了SonataAdmin Bundle.一切正常,但是当我从仪表板添加任何用户时,它会抛出一个警告:
警告:IntlDateFormatter :: format():datefmt_format:在C:\ wamp\www\sonata-sandbox\vendor\symfony\symfony\src\Symfony\Component\Form \中获取数组或整数时间戳值或DateTime对象第260行的Extension\Core\Type\DateType.php
我已经创建了一个自定义的Sonata页面
简单的路线
medapp_adminStreamCommands:
    path:     /admin/stream
    defaults: { _controller: MedAppBundle:VideoChat/VideoChat:adminStreamCommands }
返回管理池的控制器
  public function adminStreamCommandsAction(Request $request)
    {
        return $this->render('@MedApp/AdminSonata/Stream/stream_commands.html.twig', array(
            'admin_pool' => $this->get('sonata.admin.pool')));
    }
普通视图模板
{% extends '@MedApp/AdminSonata/standard_layout.html.twig' %}
{% block content %}
foobar
{% endblock content 
这是有效的,我可以在我的网站上访问它/admin/foo,我得到一个页面,其中包含Sonata管理模板和我的'foobar'内容.
我的问题是,如何在不修改默认模板的情况下将此路线添加到左侧和顶部导航栏?这是因为左侧菜单由KNP菜单呈现:
{% block side_bar_nav %}
    {% if app.user and is_granted('ROLE_SONATA_ADMIN') %}
        {{ knp_menu_render('sonata_admin_sidebar', {template: admin_pool.getTemplate('knp_menu_template')}) }}
    {% endif %}
{% endblock side_bar_nav %}
我不知何故需要添加我的新页面以通过此菜单呈现.
通常,页面是通过服务添加的,但这些页面是在实体之上构建的:
servicename:
     class: Bundle\Class
     arguments: [~, Bundle\Entity\Entityname, ~]
     tags:
         - { name: sonata.admin, manager_type: orm, group: admin, …我想在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(),
    ));
}
在我的orderAdmin我有 …
我正在尝试通过FOSRestBundle和JMS Serializer将带有ManyToOne链接的JSON对象('Module')返回到Sonata\MediaBundle\Entity.我应该怎么做呢?
这是我做过的黑客攻击,但不认为这是最好的做法.
class Module
{
    ...
    /**
     * @var Application\Sonata\MediaBundle\Entity\Media
     *
     * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media",  inversedBy="module")
     * @ORM\JoinColumn(name="hero_image_id", referencedColumnName="id")
     * @JMS\Expose()
     */
    private $heroImage;
    ...
}
class Media extends BaseMedia
{
   ...
   /**
     * A Quick hack not the best method.
     *
     * @JMS\VirtualProperty
     * @JMS\SerializedName("url")
     *
     * @return string
     */
    public function getUrlMethod()
    {
        global $kernel;
        $imageProvider = $kernel->getContainer()->get('sonata.media.provider.image');
        return $imageProvider->generatePublicUrl($this, 'reference');
    }
    ...
}
谢谢!
编辑 感谢Tautrimas Pajarskas和他提到的帖子.这是班级.
<?php
namespace AXO\APIBundle\Listener\Serialization;
use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;
use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams; …symfony-sonata ×10
sonata-admin ×8
symfony ×8
php ×5
sonata ×2
symfony-2.3 ×2
intl ×1
jms ×1
symfony-2.1 ×1