- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我的一个对象,我需要创建一些动态表单渲染...但我不知道如何在 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?但是,当我发送一个值并获得响应时,如何在不刷新的情况下添加字段?
感谢任何帮助。
最佳答案
在不断研究找到一种使用ajax和奏鸣曲与symfony4使用动态下拉菜单的方法之后,我想分享我的解决方案,它对我来说是如何实际工作的。
就我而言,我有一个区,这个区有不同的城市。我有一家公司,首先选择一个地区,然后根据该地区选择城市。
我做了什么:
为地区创建实体
为城市创建实体
进入您的主类(在我的例子中,这是公司实体,并为地区和城市添加两个实体
/**
* @ORM\ManyToOne(targetEntity="App\Wdm\MainBundle\Entity\Model\Cities", inversedBy="id")
*/
private $city;
/**
* @ORM\ManyToOne(targetEntity="App\Wdm\MainBundle\Entity\Model\Districts", inversedBy="id")
*/
private $district;
更新您的数据库架构并使用一些示例数据填充城市和地区字段
进入configureFormFields函数中的AdminClass并添加以下内容(确保将“choice_label”选项与您所在地区或城市实体中的相应字段正确使用。
protected function configureFormFields(FormMapper $formMapper)
{ $formMapper
// Some other added fields
->add('district', EntityType::class, [
'choice_label' => 'name',
'class' => Districts::class,
'placeholder' => '',
])
->add('city', EntityType::class, [
'choice_label' => 'name',
'class' => Cities::class,
'placeholder' => '',
])
;
这应该已经可以很好地工作了。您现在应该能够拥有一个依赖字段。现在让我们来看看 AJAX 的魔力。
进入您的 AdminClass(与 configureFields-Class 相同)并添加以下内容
protected function configureRoutes(RouteCollection $collection)
{ $collection->add('reloadCities', 'reload-cities');
}
<?php
namespace App\Wdm\MainBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sonata\AdminBundle\Controller\CRUDController as BaseController;
use App\Wdm\MainBundle\Entity\Model\Cities;
class CitiesController extends BaseController
{
public function reloadCitiesAction(Request $request)
{ $districtid = $request->request->get('id');
$cities = $this->getDoctrine()->getRepository(Cities::class)->findBy(array("district" => $districtid));
return $this->render("company/cities.html.twig", array("cities" => $cities));
}
}
...并且不要忘记在您的 services.yaml 中注册此 Controller ...
admin.company:
class: App\Wdm\MainBundle\Admin\CompanyAdmin
arguments:
- ~
- App\Wdm\MainBundle\Entity\Model\Company
- App\Wdm\MainBundle\Controller\CitiesController (THIS IS THE NEW ROW)
...最后是这个函数中调用的小模板...
// THIS IS THE cities.html.twig
{% for city in cities %}
<option value="{{ city.id }}">{{ city.name }}</option>
{% endfor %}
进入您的 AdminClass 并插入以下代码(例如在 configureFormFields 之前)
public function getTemplate($name)
{
switch ($name) {
case 'edit':
return 'company/cities_admin.html.twig';
break;
default:
return parent::getTemplate($name);
break;
}
}
现在我们创建这个city_admin.html.twig模板来覆盖默认模板
{% extends 'SonataAdminBundle:CRUD:edit.html.twig' %}
{% block form %}
{{ parent() }}
<script type="text/javascript">
$(document).ready(function () {
$("#ID_OF_YOUR_DISTRICT_SELECT_FIELD").change(function () {
$.ajax({
url: "{{ admin.generateUrl('reloadCities') }}",
data: {
'id': $(this).val(),
'uniquid': '{{ admin.uniqid }}'
},
method: 'POST',
success: function (html) {
$("#ID_OF_YOUR_CITY_SELECT_FIELD").html(html);
},
error: function (data) {
// more code
}
});
});
});
</script>
{% endblock %}
就是这样。应该像魅力一样发挥作用。
关于php - Symfony2 Sonata 管理员根据所选值动态更改输入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34587631/
我使用 Sonata EasyExtends 包扩展了 Sonata 项目中的用户包。 默认放在 src/Application/Sonata/UserBundle 下 现在我想自定义扩展类并添加一些
我已经设置了一个奏鸣曲管理界面,它允许用户创建特定的内容,但是如何限制用户编辑其他用户创建的内容? 为了争论起见,用户登录并创建博客。 在博客 ListView 中,应该只显示用户创建的博客。 目前,
我正在使用奏鸣曲管理,并且我正在覆盖模板。 我在这个模板中创建了一个选择,当我显示页面时,我看不到我的选择,而是一个带有 UL 和 LI 的 html 代码。 Sonata 似乎通过他的代码覆盖了他模
我尝试在 Sonata Admin Bundle 的 sidebad 中配置自定义管理菜单,但我不明白该怎么做? 谢谢 卓 最佳答案 侧边栏导航没有特定的配置,它使用仪表板配置来生成。 要查看它,您必
我遵循了安装指南中的所有说明,但仍然在 Symfony 4 应用程序上安装 Sonata User Bundle 时出现此错误: Column name `id` referenced for rel
我在 Symfony 4 应用程序上安装 Sonata Media Bundle 时遇到一些错误,这些错误不适用于 Symfony 2.8。 第一个错误: sensio/generator-bund
我是 Sonata Admin 的新手。 我在里面有仪表盘模板,但是找不到仪表盘的 Controller ,我需要仪表盘文件中的动态数据。 谁能帮帮我? 谢谢。 最佳答案 /dashboard 默认由
我在 Symfony 4 应用程序上安装 Sonata Media Bundle 时遇到一些错误,这些错误不适用于 Symfony 2.8。 第一个错误: sensio/generator-bund
我知道这个主题已经开放,但几个月后他们根本没有答案,当我尝试回答以了解这位作者是否有任何解决方案时......我的评论被删除了。所以我要再次发布这个问题。 我正在使用 SonataAdminBunbd
我试图让奏鸣曲像这样工作: - 如果普通用户登录,他将被重定向到“/” - 如果管理员登录,他将被重定向到“/admin/dashboard” 我尝试使用 app/config/security.ym
我已按照本教程进行操作,并成功运行:http://sonata-project.org/bundles/admin/master/doc/reference/getting_started.html
我在 sonata admin 中更改文档的父级时遇到问题。 我的文档有这样的属性: /** * @PHPCRODM\Children(filter="teaserimage*", cascade
我在使用 Sonata Formatter Bundle 时遇到问题. 在我的 config.yml 中,我有以下内容(除其他外): imports: - { resource: sonata
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
我正在尝试设置表单类型“sonata_type_immutable_array”,如下所示: ->add('metadatos', 'sonata_type_immutable_array', arr
我想将奏鸣曲媒体包用于我的包中的媒体。 我有一个实体应该有一个画廊。安装奏鸣曲媒体包并生成 easy:extends 后,有 3 个不同的实体: 媒体.php Gallery.php GalleryH
以前,我们可以执行以下操作: ->add('workDate', 'doctrine_orm_date_range', array(), null, array('format' => 'dd-MM
我安装了 Sonata Media Bundle,但我没有使用该 bundle 的图库部分。 如何禁用图库? 我使用的是 Symfony 2.3,并且根据文档安装了标准的 Media Bundle。
如何从奏鸣曲管理面板中删除奏鸣曲项目链接。 感谢您的帮助。谢谢 最佳答案 您需要覆盖 sonata-project/admin-bundle/Resources/views/standard_layo
我安装了来自同一供应商的 sonata 管理包和通知包。但是我不想在管理面板上显示通知包。 我知道,为了做到这一点,我可以使用: show_in_dashboard="false" 我已将它放在 ve
我是一名优秀的程序员,十分优秀!