2015-02-06 1 views
2

나는 다 - 대 - 다 관계를 가지고 있으며이를 업데이트 할 수있는 폼을 작성 중입니다.Laravel Form Model 바인딩 기본값을 덮어 쓰는 것

관계는 일련의 확인란을 사용하여 설정됩니다.

모델은 PostCategory이며 일반적인 mtm 관계가 정의되어 있습니다.

내 편집 게시물 양식에서 현재 선택한 카테고리를 내 게시물 모델로로드하는 것은 물론 카테고리 목록도 얻게됩니다. 형태는 다음과 같다 :

{!! Form::model($post, ['route' => ['admin.posts.update', $post->id], 'method' => 'PATCH']) !!} 

// .. some fields 

@foreach ($categoryList as $categoryId => $category) 
    <div class="checkbox"> 
    <label> 
    {!! Form::checkbox('category[]', $categoryId, in_array($categoryId, $selected_categories)) !!} {{ $category }} 
    </label> 
    </div> 
@endforeach 

선택된 카테고리가 다음과 같이 정의된다 : 단지 관련 카테고리의 ID의 간단한 배열을 제공

$selected_categories = $post->categories->lists('id'); 

을 ....

in_array($categoryId, $selected_categories)) 문에도 불구하고 모든 범주 확인란이 기본적으로 선택되며 범주 ID가 관련 될 때만 true로 평가됩니다. 확인란의 첫 번째 (이름) 매개 변수를 category[]이 아닌 다른 것으로 변경하면 해당 매개 변수가 올바르게 검사됩니다.

양식 모델 바인딩이 모든 확인란을 선택하는 이유는 무엇이며 왜 제 3 인수를 확인란에 전달해도 재정의해도 아무런 효과가 없습니까?

답변

1

Illuminate의 FormBuilder 생성 체크 박스 방법에 버그가있는 것 같습니다. 다중 선택 요소 (category[])를 메서드에 전달하면 해당 배열에서 "on"이라는 단어를 찾으며 물론 하나의 확인란 만 선택하여 게시하더라도 생성되는 모든 확인란에 대해 해당 단어를 찾습니다. .

protected function getCheckboxCheckedState($name, $value, $checked) { 
    if (isset($this->session) && ! $this->oldInputIsEmpty() && is_null($this->old($name))) return false; 
    if ($this->missingOldAndModel($name)) return $checked; 
    $posted = $this->getValueAttribute($name); 

    return is_array($posted) ? in_array($value, $posted) : (bool) $posted; 
} 

하나의 체크 박스 만 선택했다고 가정 해 봅니다. 게시 된 체크 박스 배열 :

checkbox[0] 
checkbox[1] 
checkbox[2] 
checkbox[3] = 'on'  // only value that is ever posted 
checkbox[4] 
checkbox[5] 

배열은 다음과 같습니다

array('checkbox' => [3 => 'on'])는 따라서 in_array('on', [3 => 'on']) 모든 체크 박스에 대한 true를 반환합니다.

+0

흠, 이것이 버그 보고서를 게시해야하는 것입니까? 나는 그렇게 할 수도있다. – harryg

+0

Repo가 읽기 전용 인 것 같습니다. 문제를 제출할 방법이 없습니다. – harryg

+0

하지만이 문제가 실제로 발생한 것인지에 대해서는 아직 조금 혼란 스럽습니다. 체크 박스의 이름은 당신이 체크하고 싶은지 아닌지와 아무런 관련이 없어야합니다 ... – silkfire