.. index:: single: list List ==== Base config ----------- create .xml config in directory `config/crud/`. For example, `user.xml` :: Viewing user attributes Adding a new user Editing a user create controller, which will be used for crud operations. For example, `src/Controller/UserController.php` :: dispatcher = $dispatcher; $this->fmt = $fmt; $this->translator = $translator; $this->fields = $fields; } } create fields config. For example in file `src/Fields/UserFields.php` :: [ 'label' => 'Identificator', 'type' => 'number', 'widget' => 'number', 'sort' => false, 'show_list' => false, 'show_view' => false, 'load_list' => true, 'filter' => false, 'render_add' => false, 'show_edit' => false, 'show_print' => false, ], 'name' => [ 'label' => 'Name', 'type' => 'string', 'widget' => 'text', 'required' => 'required', 'sort' => true, 'show_list' => true, 'show_add' => true, 'show_edit' => true, ], 'login' => [ 'label' => 'Login', 'type' => 'string', 'widget' => 'text', 'required' => 'required', 'sort' => true, 'show_list' => true, 'show_add' => true, 'show_edit' => true, ], 'password' => [ 'label' => 'Password', 'repeat_label' => 'Confirm password', 'type' => 'string', 'widget' => 'password', 'required' => 'required', 'sort' => false, 'ignore_format' => true, 'show_list' => false, 'render_list' => false, 'load_list' => false, 'show_view' => false, 'show_add' => true, 'show_edit' => true, 'show_single' => false, 'show_print' => false, 'filter' => false, 'search' => false, ], 'roles' => [ 'label' => 'Roles', 'type' => 'json', 'widget' => 'multichoice', 'widget_params' => [ 'expanded' => true, // checkboxes 'choices' => [ 'Administrator' => 'ROLE_ADMIN', 'User' => 'ROLE_USER', ], ], 'required' => 'required', 'sort' => false, 'filter' => true, 'show_list' => true, 'show_add' => true, 'show_edit' => true, 'render_add' => true, 'render_edit' => true, 'show_single' => false, 'show_print' => false, ], ]; return $att; } } Changing rows ordering ---------------------- To enable changing rows order: 1. add new column in table :: 2. add field config for this column :: 'ordering' => [ 'label' => 'Ordering', 'type' => 'number', 'widget' => 'number', 'sort' => true, 'show_list' => false, 'show_view' => false, 'load_list' => true, 'change' => false, 'filter' => false, 'render_add' => false, 'show_edit' => false, 'show_print' => false, ], Table data must return column named `ordering`. If your column has different name, add config like this: :: 'ordering' => [ 'label' => 'Ordering', 'type' => 'number', 'widget' => 'number', 'sort' => true, 'show_list' => false, 'show_view' => false, 'load_list' => true, 'change' => false, 'filter' => false, 'render_add' => false, 'show_edit' => false, 'show_print' => false, 'format_func' => function($col_val) { return $col_val['num']; }, ], 3. add route for save ordering config/routes.yaml :: user_table_save_ordering: path: /user/table_save_ordering methods: [POST] options: expose: true controller: App\Controller\UserController::saveOrdering src/Controller/UserController.php :: public function saveOrdering(Request $request, EntityManagerInterface $em) { $toUpd = json_decode($request->get('toUpd'), true); $foundEntity = $this->userRepo->createQueryBuilder('e', 'e.id') ->where('e.id IN (:ids)')->setParameter('ids', array_column($toUpd, 'id')) ->getQuery()->getResult(); // set null value to escape unique constraint foreach ($foundEntity as $obj) { $obj->setOrdering(null); $em->persist($obj); } $em->flush(); foreach ($toUpd as $upd) { $obj = $foundEntity[$upd['id']]; $obj->setOrdering($upd['val']); $em->persist($obj); } $em->flush(); return $this->fmt->jsonResponse([ 'status'=>'success', 'message'=>'Successfully saved', ]); } also add in `beforeSave` method :: public function beforeSave($obj, $request, $formData) { if (!$obj->getId()) { // get max ordering $res = $this->userRepo->createQueryBuilder('u') ->select('MAX(u.ordering)') ->getQuery() ->getSingleScalarResult(); $maxOrdering = $res ? $res + 1 : 1; $obj->setOrdering($maxOrdering); } } templates/user/list.html.twig :: {% set save_ordering_route = 'user_table_save_ordering' %}