Php 不能同时禁用实体字段和保留其值

Php 不能同时禁用实体字段和保留其值,php,symfony,Php,Symfony,在表单事件中,设置字段'attr'=>数组('readonly'=>'readonly')将呈现为“disabled”=“1”。这不是期望的效果。禁用的选择字段在提交时保留空值。只读字段应保留并保持显示的值。至少我是这么想的。那么,如何使值保持不变和不变呢 编辑 隐藏字段不起作用选择属性也没有帮助 我投票结束这个问题。我还没有发现任何显示禁用实体字段并保留该值的方法。如果你知道怎么做的话 例如(在Symfony 2.8.3中): 家庭实体有六个属性,每个属性都是与家庭有一对一关系的实体。(应用程

在表单事件中,设置字段
'attr'=>数组('readonly'=>'readonly')
将呈现为
“disabled”=“1”
。这不是期望的效果。禁用的选择字段在提交时保留空值。只读字段应保留并保持显示的值。至少我是这么想的。那么,如何使值保持不变和不变呢

编辑

隐藏字段不起作用<代码>选择属性也没有帮助

我投票结束这个问题。我还没有发现任何显示禁用实体字段并保留该值的方法。如果你知道怎么做的话

例如(在Symfony 2.8.3中): 家庭实体有六个属性,每个属性都是与家庭有一对一关系的实体。(应用程序具有具有类似属性的其他实体。)Househous的住房实体/属性有两个属性:住房和启用。如果应用程序的客户端不再打算跟踪某个属性,则可以将该属性设置为
enabled=no

如果属性设置为
enabled=no
,则通过在实体字段的查询生成器中包含where子句,即可消除其在新的或编辑的家庭表单中的可用性,例如,
->where(“h.enabled=1”)
。但是,这样做会导致禁用的属性设置为
null
。因此,需要以某种方式保留该值

理想的解决方案是为这些属性实体字段提供一个服务,如果启用则显示值并保留为否


我尝试使用事件侦听器、隐藏字段、
choice\u attr
,修改表单模板和表单主题,但都没有效果。例如,当需要实体字段时,隐藏字段是文本。这并不意味着它不能完成,只是我没有偶然发现正确的方法。

最终的解决方案是:使用条令元数据获取禁用的实体字段、表单类修改,以及对于许多关系,一些jquery和不可见的模板条目的服务

服务功能:

/**
 * Create array of disabled fields of an entity object
 * 
 * @param type $object
 * @return array
 */
public function getDisabledOptions($object) {
    $values = [];
    $className = get_class($object);
    $metaData = $this->em->getClassMetadata($className);
    foreach ($metaData->associationMappings as $field => $mapping) {
        if (8 > $mapping['type']) {
            $fieldName = ucfirst($field);
            $method = 'get' . $fieldName;
            if (method_exists($object->$method(), 'getEnabled') && false === $object->$method()->getEnabled()) {
                $values[] = $fieldName;
            }
        }
    }
    $manyToMany = json_decode($this->getMetaData($object), true);
    foreach(array_keys($manyToMany) as $key) {
        $values[] = $key;
    }

    return $values;
}

/**
 * Get array of disabled ManyToMany options
 *
 * @param Object $object
 * @return array
 */
public function getMetaData($object) {
    $data = array();
    $className = get_class($object);
    $metaData = $this->em->getClassMetadata($className);
    foreach ($metaData->associationMappings as $field => $mapping) {
        if (8 === $mapping['type']) {
            $data[$field] = $this->extractOptions($object, $field);
        }
    }

    return json_encode($data);
}
控制器使用服务:

    $searches = $this->get('mana.searches');
    $disabledOptions = $searches->getDisabledOptions($household);
    $metadata = $searches->getMetadata($household);
    ...
    $form = $this->createForm(HouseholdType::class, $household, $formOptions);
    ...
    return $this->render('Household/edit.html.twig',
            array(
            'form' => $form->createView(),
            ....
            'metadata' => $metadata,
    ));
表单类字段的示例:

        ->add('housing', EntityType::class,
            array(
            'class' => 'TruckeeProjectmanaBundle:Housing',
            'choice_label' => 'housing',
            'placeholder' => '',
            'attr' => (in_array('Housing', $options['disabledOptions']) ? ['disabled' => 'disabled'] : []),
            'label' => 'Housing: ',
            'query_builder' => function (EntityRepository $er) use ($options) {
            if (false === in_array('Housing', $options['disabledOptions'])) {
                return $er->createQueryBuilder('alias')
                    ->orderBy('alias.housing', 'ASC')
                    ->where('alias.enabled=1');
            } else {
                return $er->createQueryBuilder('alias')
                    ->orderBy('alias.housing', 'ASC');
            }
        },
        ))
        ...

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Truckee\ProjectmanaBundle\Entity\Household',
        'required' => false,
        'disabledOptions' => [],
    ));
}
Jquery删除禁用的属性:

$("input[type=Submit]").click(function () {
    $("input").removeAttr("disabled");
    $("select").removeAttr("disabled");
});
多个关系的模板和jquery示例:

<div id="household_options" style="display:none;">{{ metadata }}</div>
{{metadata}
jquery:

if (0 < $("#household_options").length) {
    var house_options = JSON.parse($("#household_options").text());
    $.each(house_options, function (index, item) {
        $.each(item, function (k, v) {
            var formAttr = 'household_' + index + '_' + v.id;
            $("#" + formAttr).attr('disabled', 'disabled');
        });
    });
}
if(0<$(“家庭选项”).长度){
var house_options=JSON.parse($(“#house_options”).text();
$。每个(房屋选项、功能(索引、项目){
$。每个(项目、功能(k、v){
var formAttr=‘住户’;
$(“#”+formAttr.attr('disabled','disabled');
});
});
}

您可以在span或div中显示信息,也可以在input/select元素之外的任何内容中显示信息,并使用实际值隐藏输入。虽然这不是一个很好的解决方案,但在形式活动中就更没意思了。我以前也没有尝试过包含实体字段的隐藏字段。是否已将
只读
作为允许的属性删除?我不是symfony2用户,但快速谷歌会显示
只读
属性。也许你只是缺少了
?也许你可以让它不包含在表单中,并且,仅仅为了可视化访问
{{form.vars.value.title}
,(这是一个小树枝示例)