在奏鸣曲管理器上创建批量操作管理
问题描述:
我试图在奏鸣曲管理器上添加新的批量操作。但是,当我实现我的项目例如在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)
...
}
注:收件人是多对多场。
答
按我的意见,问题应该通过下面的代码上线420解决:
$translationDomain = isset($batchActions[$action]['translation_domain']) ? $batchActions[$action]['translation_domain'] : $this->admin->getTranslationDomain();
问题发生,因为你没有检查,如果这个键值“translation_domain”在数组$ batchActions存在[ $行动。据我所知,三元运算符'?'试图将该值应用于该变量,如果该值在操作之后没有被设置,则它尝试第二个操作符。因此,为什么我认为isset应该解决它。
也添加一些代码。简单地说,在你试图获得'translation_domain'的数组中,该键不存在。在使用之前检查isset。 – Janno
在哪个页面发生此错误?尝试将错误处理设置为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
我发布的代码会打印出所有的错误,它可能会让你更接近 – Janno