首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony 2更新出口数据

Symfony 2更新出口数据
EN

Stack Overflow用户
提问于 2016-02-17 09:04:18
回答 1查看 484关注 0票数 1

我有SonataAdminBundle 2.4.*@dev版本的后端。

在更新版本和从2.7到2.8的symfony核心之前,我的代码工作过。

解释:我有一个订阅者列表,其中有一个标志isNew,用于新用户或旧用户的单独导出。默认为1,在导出时,如果列表中存在新用户,则需要将其更改为0。

但现在不管用了。因为如果此字段设置了网格筛选器isNew并导出,则在DB字段中更改之前和以后。

代码语言:javascript
运行
复制
return $this->get('sonata.admin.exporter')->getResponse(
        $format,
        $filename,
        $this->admin->getDataSourceIterator()
    );

getDataSourceIterator从DB获取数据,而不是从结果中获取数据。这样就没有新用户了,文件也是空的。

出口后如何更新数据,有什么想法吗?

更新:

出口职能:

代码语言:javascript
运行
复制
/**
 * Export data to specified format.
 *
 * @param Request $request
 *
 * @return Response
 *
 * @throws AccessDeniedException If access is not granted
 * @throws \RuntimeException     If the export format is invalid
 */
public function exportAction(Request $request = null)
{
    $request = $this->resolveRequest($request);

    $this->admin->checkAccess('export');

    $format = $request->get('format');

    $allowedExportFormats = (array) $this->admin->getExportFormats();

    if (!in_array($format, $allowedExportFormats)) {
        throw new \RuntimeException(
            sprintf(
                'Export in format `%s` is not allowed for class: `%s`. Allowed formats are: `%s`',
                $format,
                $this->admin->getClass(),
                implode(', ', $allowedExportFormats)
            )
        );
    }

    $filename = sprintf(
        'export_%s_%s.%s',
        strtolower(substr($this->admin->getClass(), strripos($this->admin->getClass(), '\\') + 1)),
        date('Y_m_d_H_i_s', strtotime('now')),
        $format
    );


    //my code to update field isNew of subscribers
    $this->get('cfw.subscription')->processExportEmails($controller->admin->getFilterParameters());

    return $this->get('sonata.admin.exporter')->getResponse(
        $format,
        $filename,
        $this->admin->getDataSourceIterator()
    );
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-18 10:52:35

好的,我找到了一个解决办法,也许有人知道的更好,请在这里发帖。我通过在侦听器onTerminate中更新数据来解决问题。看代码:

服务配置:

代码语言:javascript
运行
复制
sonata.admin.subscription.listener:
        class: SiteBundle\Listener\ExportSubscriptionListener
        arguments: [@service_container]
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
            - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate }

在控制器中,我删除了重写的方法exportAction()并添加了小方法

代码语言:javascript
运行
复制
/**
 * @return AdminInterface
 */
public function getAdmin()
{
    return $this->admin;
}

ExportSubscriptionListener:

代码语言:javascript
运行
复制
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Sonata\AdminBundle\Controller\CRUDController;
use SiteBundle\Controller\SubscriptionAdminController;

class ExportSubscriptionListener
{
    /**
     * @var CRUDController
     */
    protected $controller;

    /**
     * @var ContainerInterface
     */
    protected $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        $this->controller = $event->getController();
    }

    /**
     * Update new subscribers on export
     */
    public function onKernelTerminate()
    {
        $controller = $this->controller[0];

        if (!$controller instanceof SubscriptionAdminController) {
            return;
        }

        if ($this->controller[1] !== 'exportAction') {
            return;
        }

        //here we update in service data
        /** $var SubscriptionAdminController $controller */
        $this->container->get('service.subscription')->processExportEmails($controller->getAdmin()->getFilterParameters());
    }
}

和更新服务中的数据:

代码语言:javascript
运行
复制
/**
 * @param array $subscriptions
 */
public function processExportEmails(array $filterParameters)
{
    $criteria = [];

    if(!empty($filterParameters['locale']) && $filterParameters['locale']['value'] !== "") {
        $criteria['locale'] = $filterParameters['locale']['value'];
    }

    if(!empty($filterParameters['new']) && $filterParameters['new']['value'] !== "") {
        $criteria['new'] = $filterParameters['new']['value'];
    }

    $subscriptionRepository = $this->getRepositorySubscription();

    $subscriptions = null;
    if (count($criteria) > 0) {
        $subscriptions = $subscriptionRepository->findBy($criteria);
    } else {
        $subscriptions = $subscriptionRepository->findAll();
    }

    /** @var array|null $subscriptions */
    foreach ($subscriptions as $subscription) {
        /** @var Subscription $subscription */
        if ($subscription->isNew()) {
            $subscription->setNew(false);
            $this->getEntityManager()->persist($subscription);
        }
    }

    $this->getEntityManager()->flush();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35452079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档