Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Sonata管理员:如何验证删除操作?_Php_Symfony_Sonata Admin - Fatal编程技术网

Php Sonata管理员:如何验证删除操作?

Php Sonata管理员:如何验证删除操作?,php,symfony,sonata-admin,Php,Symfony,Sonata Admin,如何在删除操作和设置sonata admin中的flash消息之前检查条件 我不想删除超级用户。我当前的代码: public function preRemove($object) { parent::preRemove($object); if ($object->getId() === User::SUPER_USER_ID) { throw new AccessDeniedException(); }

如何在删除操作和设置sonata admin中的flash消息之前检查条件

我不想删除超级用户。我当前的代码:

public function preRemove($object)
    {
        parent::preRemove($object);
        if ($object->getId() === User::SUPER_USER_ID) {
            throw new AccessDeniedException();
        }
    }

它抛出异常。我需要在管理面板发送闪光消息

这是覆盖功能。如果您想停止删除或删除,如果一切正常,您只需放置
parent::preRemove($object)
parent::remove($object)位于函数末尾

public function preRemove($object)
{
    if ($object->getId() === User::SUPER_USER_ID) {
        $this->getRequest()->getSession()->getFlashBag()->add(
            'error',
            'Title, Abstract and Small tile Media are required'
        );
        return;
    }
    //other code to check here

    parent::preRemove($object); 
}

public function remove($object)
{
    if ($object->getId() === User::SUPER_USER_ID) {
        $this->getRequest()->getSession()->getFlashBag()->add(
            'error',
            'Title, Abstract and Small tile Media are required'
        );
        return;
    }
    //other code to check here

    parent::remove($object); 
}

谢谢你Ryuk Lee,他让我研究代码:)

解决方案:

public function preRemove($object)
    {
        parent::preRemove($object);
        if ($object->getId() === User::SUPER_USER_ID) {
            $this->getRequest()->getSession()->getFlashBag()->add('sonata_flash_error','Not delete super user');
            throw new ModelManagerException();
        }
    }
ModelManagerException-这是一个例外,它将使奏鸣曲正常工作。如果没有“成功”消息,请不要删除对象并在管理面板中写入错误消息。仅工作调试=错误

$kernel = new AppKernel('dev', false);
但我遇到了一个问题,toogle错误消息(“更多”):

2种解决方案:

1)覆盖模板

config.xml

sonata_admin:
    templates:
        layout: 'admin/layout.html.twig'
layout.html.twig

{% extends '@SonataAdmin/standard_layout.html.twig' %}

{% block notice %}
    {% include 'admin/flash_messages.html.twig' %}
{% endblock notice %}
{% for type in sonata_flashmessages_types() %}
    {% set domain = domain is defined ? domain : null %}
    {% set messages = sonata_flashmessages_get(type, domain) %}
    {% if messages|length > 0 %}
        {% for message in messages %}
            <div class="alert alert-{{ type|sonata_status_class }} alert-dismissable">
                <button
                        type="button"
                        class="close"
                        data-dismiss="alert"
                        aria-hidden="true"
                        aria-label="{{ 'message_close'|trans({}, 'SonataCoreBundle') }}">
                    &times;
                </button>
                {{ message | raw }}
            </div>
        {% endfor %}
    {% endif %}
{% endfor %}
flash_messages.html.twig

{% extends '@SonataAdmin/standard_layout.html.twig' %}

{% block notice %}
    {% include 'admin/flash_messages.html.twig' %}
{% endblock notice %}
{% for type in sonata_flashmessages_types() %}
    {% set domain = domain is defined ? domain : null %}
    {% set messages = sonata_flashmessages_get(type, domain) %}
    {% if messages|length > 0 %}
        {% for message in messages %}
            <div class="alert alert-{{ type|sonata_status_class }} alert-dismissable">
                <button
                        type="button"
                        class="close"
                        data-dismiss="alert"
                        aria-hidden="true"
                        aria-label="{{ 'message_close'|trans({}, 'SonataCoreBundle') }}">
                    &times;
                </button>
                {{ message | raw }}
            </div>
        {% endfor %}
    {% endif %}
{% endfor %}
AdminUserCRUDController

class AdminUserCRUDController extends CRUDController
{
   public function deleteAction($id)
   {
       $redirectResponse = parent::deleteAction($id);
       /** @var FlashBagInterface $flashBag */
       $flashBag = $this->container->get('session')->getFlashBag();
       if($errors = $flashBag->get('sonata_flash_error')){
           $flashBag->set(
               'sonata_flash_error',
               implode('. ',array_unique($errors))
           );
       }
       return $redirectResponse;
   }
结果:


这是否回答了您的问题@卡梅隆赫德50/50。我找到了如何在持久化和更新操作上设置flash消息。我不知道,如何停止删除操作,并设置flash消息。我想停止删除,重定向回flash消息。如果我抛出异常,这段代码不会执行。如果我没有抛出异常,我会删除我的对象(我不想要这个)。如果你抛出异常,这意味着你期望代码不会执行,对吗?是的。我想检查一下情况。如果“确定”-删除对象,否则在管理面板中显示错误消息,而不删除对象。现在我抛出一个异常(=HTTP500错误)P.s.parent::preRemove($object)和parent::remove($object);-空方法使用会话并在添加错误消息后返回。查看我的更新答案谢谢!你给出了一个想法,我可以重写“delete”方法。