2016-12-19 6 views
3

Хотелось бы иметь красивый вид EntityType для multiple выбор как соната с sonata_type_model (ModelType).Symfony2 - используйте Sonata field type вне комплекта

Вопрос будет, как я могу использовать sonata_type_model снаружи на моей собственной форме?

Я пробовал:

->add('countries', 'sonata_type_model', array(
    'label' => 'Countries', 
    'property' => 'name', 
    'multiple' => true 
)) 

Также я попробовал:

use Sonata\AdminBundle\Form\Type\ModelType; 

... 

->add('countries', ModelType::class, array(
    'label' => 'Countries', 
    'property' => 'name', 
    'multiple' => true 
)) 

Но, к сожалению, я получаю сообщение об ошибке:

Catchable Fatal Error: Argument 1 passed to Sonata\AdminBundle\Form\ChoiceList\ModelChoiceLoader::__construct() must implement interface Sonata\AdminBundle\Model\ModelManagerInterface, null given, called in C:\xampp\htdocs\trainingexperience_symfony\app\cache\dev\classes.php on line 18005 and defined

UPDATE

я последовал совет, чтобы определить model_manager свойство внутри вариантов формы типа:

protected $modelManager; 

function __construct(ModelManager $modelManager) 
{ 
    $this->modelManager = $modelManager; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('preferredCountries', ModelType::class, array(
      'label' => 'Countries', 
      'property' => 'name', 
      'multiple' => true, 
      'model_manager' => $this->modelManager 
     )); 

    ... 
} 

я передать его от контроллера, как:

/** @var ModelManager $modelManager */ 
$modelManager = $this->get('sonata.media.admin.media.manager'); 
$formType = new FormType($modelManager); 

... 

Но теперь я получаю сообщение об ошибке:

Class does not exist

500 Internal Server Error - ReflectionException

Трассировка стека

in vendor\doctrine\common\lib\Doctrine\Common\Persistence\AbstractManagerRegistry.php at line 197 - 

    $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; 
     } 
     $proxyClass = new \ReflectionClass($class); 
     if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { 
      if (! $parentClass = $proxyClass->getParentClass()) { 

at ReflectionClass ->__construct ('') 
in vendor\doctrine\common\lib\Doctrine\Common\Persistence\AbstractManagerRegistry.php at line 197 + 
at AbstractManagerRegistry ->getManagerForClass (null) 
in vendor\sonata-project\doctrine-orm-admin-bundle\Model\ModelManager.php at line 272 + 
at ModelManager ->getEntityManager (null) 
in vendor\sonata-project\doctrine-orm-admin-bundle\Model\ModelManager.php at line 64 + 
at ModelManager ->getMetadata (null) 
in vendor\sonata-project\doctrine-orm-admin-bundle\Model\ModelManager.php at line 377 + 
at ModelManager ->getIdentifierFieldNames (null) 
in vendor\sonata-project\admin-bundle\Form\ChoiceList\ModelChoiceLoader.php at line 75 + 
at ModelChoiceLoader ->__construct (object(ModelManager), null, 'name', null, array(), object(PropertyAccessor)) 
in vendor\sonata-project\admin-bundle\Form\Type\ModelType.php at line 113 + 
at ModelType ->Sonata\AdminBundle\Form\Type\{closure} (object(OptionsResolver), null) 
in vendor\symfony\symfony\src\Symfony\Component\OptionsResolver\OptionsResolver.php at line 859 + 
at OptionsResolver ->offsetGet ('choice_loader') 
in vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\Type\ChoiceType.php at line 320 + 
at ChoiceType ->Symfony\Component\Form\Extension\Core\Type\{closure} (object(OptionsResolver), null) 
in vendor\symfony\symfony\src\Symfony\Component\OptionsResolver\OptionsResolver.php at line 965 + 
at OptionsResolver ->offsetGet ('choice_list') 
in vendor\symfony\symfony\src\Symfony\Component\OptionsResolver\OptionsResolver.php at line 791 + 
at OptionsResolver ->resolve (array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\ResolvedFormType.php at line 156 + 
at ResolvedFormType ->createBuilder (object(FormFactory), 'preferredCountries', array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeDataCollectorProxy.php at line 89 + 
at ResolvedTypeDataCollectorProxy ->createBuilder (object(FormFactory), 'preferredCountries', array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormFactory.php at line 114 + 
at FormFactory ->createNamedBuilder ('preferredCountries', 'Sonata\AdminBundle\Form\Type\ModelType', null, array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php at line 106 + 
at FormBuilder ->create ('preferredCountries', 'Sonata\AdminBundle\Form\Type\ModelType', array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php at line 269 + 
at FormBuilder ->resolveChildren() 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php at line 215 + 
at FormBuilder ->getForm() 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormFactory.php at line 40 + 
at FormFactory ->create (object(InternshipType), object(Internship), array()) 
in vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php at line 282 + 
at Controller ->createForm (object(InternshipType), object(Internship)) 
in src\IndexBundle\Controller\TraineeController.php at line 194 + 
at TraineeController ->internshipsAction (object(Request)) 
at call_user_func_array (array(object(TraineeController), 'internshipsAction'), array(object(Request))) 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php at line 144 + 
at HttpKernel ->handleRaw (object(Request), '1') 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php at line 64 + 
at HttpKernel ->handle (object(Request), '1', true) 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel.php at line 69 + 
at ContainerAwareHttpKernel ->handle (object(Request), '1', true) 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Kernel.php at line 185 + 
at Kernel ->handle (object(Request)) 
in web\app_dev.php at line 30 + 

ответ

0

Вам следует попробовать предоставить вариант model_manager. Это может быть услуга, поэтому взгляните на debug:container и попытайтесь ее обнаружить.

+0

Вы были правы, я нашел его в качестве службы и передается для формирования типа, но к сожалению, я получаю сообщение об ошибке. Не могли бы вы проверить мой обновленный вопрос? –

+0

Вам нужно будет предоставить полную трассировку стека, я не могу помочь вам с «ReflectionException» – greg0ire

+0

Отредактировано, пожалуйста, проверьте это :) –

0

Вы получаете эту ошибку, потому что sonata_type_model нуждается в диспетчере модели целевого администратора для управления объектами.

Итог: вы не можете использовать sonata_type_model на лиц, которые не имеют служба администратора определяется

Вот обходной путь я использовал:

Тип Форма:

<?php 

namespace Blast\BaseEntitiesBundle\Form\Type; 

use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\OptionsResolver\Options; 
use Blast\CoreBundle\Form\AbstractType; 

class NestedTreeableType extends AbstractType 
{ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $queryBuilder = function (Options $options) 
     { 
      return $options['em'] 
       ->getRepository($options['class']) 
       ->getNodesHierarchyQueryBuilder(); 
     }; 

    $choiceLabel = function($choice) 
    { 
     return str_repeat(' - ', $choice->getTreeLvl()) . (string) $choice; 
    }; 

    $resolver->setDefaults([ 
     'query_builder' => $queryBuilder, 
     'choice_label' => $choiceLabel, 
     'btn_add' => 'link_add', 
     'btn_list' => 'link_list', 
     'btn_delete' => 'link_delete', 
     'btn_catalogue' => 'SonataAdminBundle', 
    ]); 
} 

public function buildView(FormView $view, FormInterface $form, array $options) 
{ 
    parent::buildView($view, $form, $options); 

    $object_id = ($view->vars['name'] == 'treeParent') ? $form->getParent()->getData()->getId() : null; 

    $choices = []; 

    foreach ($view->vars['choices'] as $choice) { 
      if ($object_id && $choice->data->getId() == $object_id) 
       $choice->attr['disabled'] = 'disabled'; 

     $choices[] = $choice; 
    } 

    $view->vars['choices'] = $choices; 
    $view->vars['btn_add'] = $options['btn_add']; 
    $view->vars['btn_list'] = $options['btn_list']; 
    $view->vars['btn_delete'] = $options['btn_delete']; 
    $view->vars['btn_catalogue'] = $options['btn_catalogue']; 
} 

public function getParent() 
{ 
    return 'entity'; 
} 

public function getBlockPrefix() 
{ 
    return 'blast_nested_treeable'; 
} 

}

как вы можете видеть, я определяю параметры и виды переменных, которые необходимы sonata_type_model, и теперь шаблон для формы типа

{% extends 'SonataDoctrineORMAdminBundle:Form:form_admin_fields.html.twig' %} 

{% block blast_nested_treeable_widget %} 
    {{ block('sonata_type_model_widget') }} 
{% endblock %} 

Просто визуализируйте блок sonata_type_model и ваш товар, чтобы идти. если вы хотите взглянуть на реальный пример: https://github.com/blast-project/BaseEntitiesBundle

Надежда, что помогает

+0

кстати, если вы хотите упростить использование администратора сонаты, просто сконфигурировав его в yaml, взгляните на https://github.com/blast-project/CoreBundle, документ до сих пор довольно плох, но функциональные функции являются удивительными – Mawcel

0

Я не знаю, если кто-то еще ищет, но я обнаружил, что вам нужно это иметь modelManager (по крайней мере, в 2.версия 7 из Symfony):

/** @var ModelManager $modelManager */ 
$modelManager = $this->get('sonata.admin.manager.orm'); 
$formType = new FormType($modelManager); 

... 

byez

Смежные вопросы