2016-08-01 13 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); function errorHandler($ errno、$ errstr、$ err_file、$ err_line、$ err_context){ echo "エラー$ errno、errstr - $ errstr、err_file - $ errfile、err_line - $ err_line、コンテキスト - $ err_context);ダイ} ' – Janno

+0

私が掲載したコードは、すべてのエラーを表示してくれます。 – Janno

答えて

2

は、私のコメント1として、問題はライン420上で、次のコードによって解決されるべきである。あなたがチェックしていなかったので、キー「translation_domainは」[配列$ batchActionsに存在していた場合

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

問題が起こりました$アクション]。私が知る限り、三項演算子 '?'値を変数に適用しようとします。値が操作後に設定されなかった場合は、2番目の演算子が試行されます。だから、なぜ私はイメットがそれを修正すべきだと思うのですか?