2016-03-13 73 views
2

在表單事件,創下了場'attr' => array('readonly' => 'readonly')呈現爲"disabled" = "1"。這不是預期的效果。提交時,禁用的選擇字段會保留空值。只讀字段應保留並保留顯示的值。或者我想。那麼如何讓價值保持不變,不變?不能同時禁用實體領域,並保持其價值

編輯;

隱藏字段不會做的伎倆。 choice_attr也沒有幫助。

我投票關閉這個問題。我還沒有發現任何顯示禁用實體字段的方法,並保留該值。如果你對此有何想法......

一個例子(在Symfony 2.8.3中): 住戶實體有六個屬性,每個屬性都是與家庭的OneToMany關係中的一個實體。 (該應用程序具有其他具有類似屬性的實體。)住戶的住房實體/屬性具有兩個屬性:住房和啓用。如果應用程序的客戶不再打算跟蹤該屬性,則可以將該屬性設置爲enabled = no

如果某個屬性設置爲enabled = no,則通過在實體字段的查詢構建器中包含where子句(例如->where("h.enabled=1")),可以很容易地刪除其在新的或編輯的家庭表單中的可用性。但是,這樣做會導致禁用的財產被設置爲null。因此需要以某種方式保留價值。

理想的解決方案將是爲這些屬性實體字段將兩個顯示值的服務和保留如果已啓用是否定的。

我一直在使用一個事件監聽器,一個隱藏字段,choice_attr嘗試,修改表單模板和表單的主題都無濟於事。例如,當需要實體字段時,隱藏字段是文本。這並不意味着它不能完成,只是我沒有絆倒正確的方法。

+0

你可以顯示一個跨度或股利或什麼,但輸入/選擇元素的信息,並有一個隱藏的輸入與實際價值。但不是一個漂亮的解決方案 – Terminus

+0

在表單事件中甚至不那麼有趣。我還沒有試過一個帶有實體字段的隱藏字段。 – geoB

+0

'readonly'是否已被刪除爲允許屬性? – geoB

回答

0

最終的解決方案:使用Doctrine元數據來獲得殘疾實體領域,窗體類修改服務,並且,爲多對多的關係,一些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"); 
}); 
012對於多對多關係模板&的jQuery

例子:

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

的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'); 
     }); 
    }); 
}