2016-01-04 2 views
1

Для одного из моих объектов мне нужно создать динамический рендеринг формы ... Но я не могу понять, как это сделать в Sonata Admin. Например, когда я создаю объект, у меня есть тип поля. В этом поле я выбираю тип, которым должен обладать мой объект. Теперь, когда я выбираю тип, я хочу создать поле, основанное на типе. Например, если я выбираю тип «Карусель», я хочу показать поле, которое выбирает всю галерею объектов объекта. Если я выберем тип «Продукт», я хочу отобразить поле со всеми продуктами, чтобы выбрать из ... Как я могу это узнать?Symfony2 Sonata admin динамически меняет входные данные на основе выбранного значения

Сейчас у меня есть это:

/** 
* @param FormMapper $formMapper 
*/ 
protected function configureFormFields(FormMapper $formMapper) 
{ 
    $formMapper 
     ->with('Module', array(
      'class' => 'col-md-6' 
     )) 
      ->add('position') 
      ->add('type', null, array(
       'attr' => array('class' => 'module_type') 
      )) 
      ->add('items', 'entity', array(
       'class' => 'ApplicationSonataMediaBundle:Gallery' 
      )) 
     ->end() 
    ; 
} 

И я перекрываться шаблон редактирования:

{% extends 'SonataAdminBundle:CRUD:edit.html.twig' %} 

{% block javascripts %} 
    {{ parent() }} 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $(".module_type").change(function() { 

      }); 

     }); 
    </script> 

{% endblock %} 

Как вы можете видеть галерея зашиты сейчас ..

Я не могу понять как это сделать сейчас ... Как сказать, что если выбранное значение - это, используйте этот объект в поле ... Проблема в том, что форма формы, отображаемая в Sonata, очень сложна ... Я ее не понимаю.

Возможно, я должен использовать ajax? Но опять же, когда я отправляю значение и получаю ответ, как добавить поле без обновления?

Любая помощь приветствуется.

ответ

0

Если я действительно понимаю вашу потребность, вы должны, конечно, использовать ajax, сначала вам нужно добавить новый админ-маршрут к этому EntityAdminController, чтобы сделать это, вам нужно переопределить метод configureRoutes и добавить новый маршрут следующим образом:

protected function configureRoutes(RouteCollection $collection) 
{ 
    $collection->add('reloadCities', 'realod-cities'); 
} 

Затем вы должны создать новый контроллер, который будет иметь определение действий для нового маршрута, как:

use Sonata\AdminBundle\Controller\CRUDController as BaseController; 


class CitiesController extends BaseController 
{ 
    public function reloadCitiesAction() 
    { 
     // some code 
     return $this->render(...); 
    } 
} 

Тогда вы должны переопределить SonataAdminBundle:CRUD:edit.html.twig шаблон и установить яваскрипт слушателя событий, как Тхи s:

{% extends 'SonataAdminBundle:CRUD:edit.html.twig' %} 

{% block form %} 
    {{ parent() }} 
<script type="text/javascript"> 

     $(document).ready(function() { 
      countries.change(function() { 
       $.ajax({ 
        url: "{{ admin.generateUrl('reloadCities') }}", 
        data: { 
         'id': $(this).val(), 
         'uniquid': '{{ admin.uniqid }}' 
        }, 
        method: 'POST', 
        success: function (html) { 
         // code... 
        }, 
        error: function (data) { 
         // more code 
        } 
       }); 
      }); 
     }); 
    </script> 
0

Sonata предоставляет типа «sonata_type_choice_field_mask», который позволяет изменять поля, отображаемые в форме динамически в зависимости от значения этого входа «sonata_type_choice_field_mask», поэтому вам не придется использовать Ajax.

Here is the doc где вы можете найти все о типах сонат и маске выбора поля.

protected function configureFormFields(FormMapper $formMapper) 
{ 
    $formMapper 
     ->add('type', 'sonata_type_choice_field_mask', array(
      'choices' => array(
       //The list of available 'Type' here 
       'choice1', 
       'choice2' 
      ), 
      'map' => array(
       //What you want to display depending of the selected option 
       'choice1' => array(
        // List of the fields displayed if choice 1 is selected 
        'field1', 'field3' 
       ), 
       'choice2' => array(
        // List of the fields displayed if choice 2 is selected 
        'field2', 'field3' 
       ) 
      ), 
      'placeholder' => 'Choose an option', 
      'required' => true 
     )) 
     ->add('field1', 'entity', array(/* Options for entity1 goes here */)) 
     ->add('field2', 'entity', array(/* Options for entity2 goes here */)) 
     ->add('field3') 
    ; 
} 

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

  • Нет связанных вопросов^_^