2016-08-01 113 views
2

我试图在奏鸣曲管理器上添加新的批量操作。但是,当我实现我的项目例如在Sonata-Project,它说:在奏鸣曲管理器上创建批量操作管理

注意:未定义指数:translation_domain

如何解决呢?

某些代码件:

AdminClass.php

<?php 
use Sonata\AdminBundle\Admin\Admin; 

class AdminClass extends Admin { 
    //Other variables, functions 
    public function getBatchActions() { 
     // retrieve the default batch actions (currently only delete) 
     $actions = parent::getBatchActions(); 
     if (
      $this->hasRoute('edit') && $this->isGranted('EDIT') && 
      $this->hasRoute('delete') && $this->isGranted('DELETE') 
     ) { 
      $actions['merge'] = array(
       'label' => 'Мэйл илгээх', 
       'ask_confirmation' => true 
      ); 

     } 

     return $actions; 
    } 

    /*protected function configureRoutes(RouteCollection $collection) { 
     $collection->add('sendAction'); 
     $collection->add('send-mail', $this->getRouterIdParameter().'/send-mail'); 
    }*/ 
} 

CRUDController.php

<?php 

use Sonata\AdminBundle\Controller\CRUDController as BaseController; 
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 

class CRUDController extends BaseController 
{ 
    /** 
    * @param ProxyQueryInterface $selectedModelQuery 
    * @param Request    $request 
    * 
    * @return RedirectResponse 
    */ 
    public function batchActionMerge(ProxyQueryInterface $selectedModelQuery) 
    { 
     if ($this->admin->isGranted('EDIT') === false || $this->admin->isGranted('DELETE') === false) 
     { 
      throw new AccessDeniedException(); 
     } 

     $request = $this->get('request'); 
     $modelManager = $this->admin->getModelManager(); 

     $target = $modelManager->find($this->admin->getClass(), $request->get('targetId')); 

     if($target === null){ 
      $this->get('session')->setFlash('sonata_flash_info', 'flash_batch_merge_no_target'); 

      return new RedirectResponse($this->admin->generateUrl('list', array('filter' => $this->admin->getFilterParameters()))); 
     } 

     $selectedModels = $selectedModelQuery->execute(); 

     // do the merge work here 

     try { 
      foreach ($selectedModels as $selectedModel) { 
       $modelManager->delete($selectedModel); 
      } 

      $modelManager->update($selectedModel); 
     } catch (\Exception $e) { 
      $this->get('session')->setFlash('sonata_flash_error', 'flash_batch_merge_error'); 

      return new RedirectResponse($this->admin->generateUrl('list', array('filter' => $this->admin->getFilterParameters()))); 
     } 

     $this->get('session')->setFlash('sonata_flash_success', 'flash_batch_merge_success'); 

     return new RedirectResponse($this->admin->generateUrl('list', array('filter' => $this->admin->getFilterParameters()))); 
    } 
} 

EDIT

试图从上多对多字段另一个实体类设置的值。但它说数组必须是实体类型。

CRUDController.php

public function batchActionSend(ProxyQueryInterface $selectedModelQuery) { 
     ... 
     $request = $this->get('request'); 
     $modelManager = $this->admin->getModelManager(); 
     $selectedModels = $selectedModelQuery->execute(); 

     return new RedirectResponse($this->container->get('router')->generate('route_name', array('mails' => $selectedModels))); 
    } 

AdminClass.php

public function getNewInstance() { 
    $instance = parent::getNewInstance(); 
    $mailadds = $this->getRequest()->query->get('mails'); 
    foreach ($mailadds as $mailadd) { 
     $instance->addRecipient($mailadd); 
    } 

    return $instance; 
} 
protected function configureFormFields(FormMapper $formMapper) { 
     $formMapper 
      ->add('recipients', 'sonata_type_model', array('label' => 'Хүлээн авагчид', 'multiple' => true, 'by_reference' => false) 
... 
} 

注:收件人是多对多场。

+0

也添加一些代码。简单地说,在你试图获得'translation_domain'的数组中,该键不存在。在使用之前检查isset。 – Janno

+0

在哪个页面发生此错误?尝试将错误处理设置为E_ALL,也许可能会创建一个自定义错误处理程序,通过它您可以在发生此问题的位置获取特定文件行。例如:'error_reporting(E_ALL); set_error_handler(“errorHandler”,E_ALL); 函数errorHandler($ errno,$ errstr,$ err_file,$ err_line,$ err_context){ echo“Error $ errno,errstr - $ errstr,err_file - $ errfile,err_line - $ err_line,context - $ err_context); die (); }' – Janno

+0

我发布的代码会打印出所有的错误,它可能会让你更接近 – Janno

回答

2

按我的意见,问题应该通过下面的代码上线420解决:

$translationDomain = isset($batchActions[$action]['translation_domain']) ? $batchActions[$action]['translation_domain'] : $this->admin->getTranslationDomain(); 

问题发生,因为你没有检查,如果这个键值“translation_domain”在数组$ batchActions存在[ $行动。据我所知,三元运算符'?'试图将该值应用于该变量,如果该值在操作之后没有被设置,则它尝试第二个操作符。因此,为什么我认为isset应该解决它。

相关问题