2017-12-19 16 views
1

에 실패한 많은 많은 질문이 제대로 ( example는, example, example ),이 질문은 그것에 대해 아닙니다 양식 제출 후 Laravel에서 체크 박스 필드를 유지하는 방법에 대해 여기에 SO에 있습니다.Laravel 체크 박스 상태는 후 확인

또한 과 그 it accepts a default value을 잘 알고 있습니다. 제 질문은 old()이 체크 박스로 작동하지 않는 특별한 경우에 관한 것입니다.

DB에 이미있는 데이터를 업데이트하는 편집 폼 작업 중입니다. 양식은 처음에 DB의 값으로 채워집니다.

유효성 검사 실패 후 양식 입력을 다시 채우는 표준 방법은 old()입니다. (양식을 제출하기 전에) 초기 페이지로드에이 작품을

<input type='text' name='unicorns' value='{{ old('unicorns', $model->unicorns) }}'> 

: 항상 다음 작품 같은 것을 (텍스트 필드 등) 제출 된 값이 비어있는 경우에도 값을 반환 필드의 모든 종류의 old('unicorns')null이므로 기본값은 $model->unicorns이며 텍스트 필드의 값은 DB 상태를 반영합니다.

유효성 검사에 실패한 새 값을 제출하면 old('unicorns')은 새로운 값인 경우에도 새로운 값이되며, 원하는 경우 텍스트 필드의 값이 제출 된 상태를 반영합니다.

그러나 체크되지 않은 체크 박스가 요청에 전혀 표시되지 않는 경우 체크 박스가 분류됩니다. 다음을 고려하십시오.

<input type='checkbox' name='unicorns' value='1' @if old('unicorns', $model->unicorns) checked @endif> 

초기 페이지로드시 텍스트 필드와 마찬가지로 정상적으로로드됩니다. 그러나 실패 검증 후 :

  • 사례 1 : 0 (체크) DB 상태, 제출 된 상태 확인. old('unicorns')1이므로 테스트 결과는 true이며 확인란이 선택되어 있는지 확인합니다.

  • 사례 2 : DB 상태 1 (선택), 제출 된 상태가 선택 취소되었습니다. old('unicorns')이 null이므로 old()은 기본값 $model->unicorns (1)으로 폴백되므로 테스트 결과는 true이며 확인란이 선택되어 있음 - FAIL!

어떻게 해결할 수 있습니까?

처음에는 유효성 검사 오류가 있었는지 테스트하는 것이 가장 좋은 방법이라고 생각합니다. 그렇다면 old() 값을 기본 폴백없이 사용하십시오. 그렇지 않은 경우 old()에 기본 폴백을 사용합니다. 확인 실패를 테스트하는 한 가지 방법은 $errors을 확인하는 것입니다.

$ 오류 변수가보기에 바인딩 ...

나는 이것에 대한 글로벌 도우미를 작성하고 싶습니다, 그리고 $errors원 :이, 그것은 only works within a view AFAICT 작동하는 것 같다,하지만 거기서 일하지 마라.어쨌든,이 접근법은 ... clunky하고 너무 복잡합니다.

내가 누락 된 항목이 있습니까? 이 문제를 해결할 수있는 깔끔한 Laravel 방식이 있습니까? 이 특별한 경우에는 old()이 작동하지 않는다는 것이 이상하게 보입니다.

이것은 새로운 문제는 아니며 다른 사람들이이를 어떻게 처리합니까?

지속 확인란 상태 때 실제로 간단한 삼항 연산자를 할
+0

어떤 종류의 양식을 사용하고 있습니까? 편집 양식입니까 아니면 새로운 빈 양식입니까? –

+0

@Shubhampokhriyal 편집 양식입니다. 나는이 질문을 명확하게 만들었다 고 생각했다. (기존 값인'$ model-> unicorns '이 믹스에 포함되어있다.) 나는 그것을 더 많이 만들도록 업데이트했다. –

+0

@Shubhampokhriyal OK - 설명해 주시겠습니까? 유효성 검사 실패 후 새 상태로 체크 박스를 어떻게 다시 채울 수 있습니까? –

답변

0

이것은 내가 질문에 언급 된 투박하고 복잡한 솔루션 난하는 것입니다 내가 더 좋은 것을 찾을 수없는 것처럼 사용하기. 누구든지 더 나은 솔루션을 제안 할 수 있다면 받아 들여서 기쁘게 생각합니다!).

described in this question으로 생성되고 this answer to that question의 첫 번째 부분에서 설명한대로 config/app.php에 별칭이 지정되는 Html 헬퍼가 있습니다. 나는 그것을 정적 메서드를 추가 :

내보기에 지금
namespace App\Helpers; 
use Illuminate\Support\ViewErrorBag; 

class Html { 
    /** 
    * Shortcut for populating checkbox state on forms. 
    * 
    * If there are failed validation errors, we should use the old() state 
    * of the checkbox, ignoring the current DB state of the field; otherwise 
    * just use the DB value. 
    * 
    * @param string $name The input field name 
    * @param string $value The current DB value 
    * @return string 'checked' or null; 
    */ 
    public static function checked($name, $value) { 
     $errors = session('errors'); 

     if (isset($errors) && $errors instanceof ViewErrorBag && $errors->any()) { 
      return old($name) ? 'checked' : ''; 
     } 

     return ($value) ? 'checked' : ''; 
    } 
} 

내가 지금처럼 사용할 수 있습니다

<input type='checkbox' name='unicorns' value='1' {{ \Html::checked('unicorns', $model->unicorns) }}> 

이 올바르게 초기로드에 모든 DB의 조합과 제출 된 상태를 처리하고 이후 실패 확인.

-1

:

<input name='remember' type='checkbox' value='1' {{ old('remember') ? 'checked' : '' }}> 

편집 :

<input name='remember' type='checkbox' value='yes' {{ old('remember') == 'yes' ? 'checked' : '' }}> 
+0

그러나 이것은 DB에 현재 값이 무엇이든 초기 상태를 설정하지 않습니다. –

+0

물론 DB에 저장된 값을 다룰 때 약간 조정해야합니다. 나는 보통'create '형식으로 사용되는 예제를 제공했다. 레코드를 검색하려면'old '('remember ', YOUR_VALUE)' –

+0

으로 변경 한 '편집'양식을 표시하십시오. 입력을 보내 주셔서 감사합니다. 그러나 질문을 읽거나 이해할 수 있을지 확신하지 못합니다. 당신이 설명하는대로 기본값을 사용하는 것이 왜 효과가 없을지 설명합니다. 나는 틀 렸음을 보여주고 싶다. pls가 나에게 보여줄 수 있다면, 내가 여기있는 이유 다! :-). 그것이 그대로, 당신의 대답과 의견은 당신이 그 문제를 이해하지 못했음을 암시합니다. –

0

비슷한 상황이었고 해결 방법은 확인란 필드 바로 앞에 숨겨진 필드를 추가하는 것이 었습니다. 확인란이 선택되지 않았

<input type='hidden' name='unicorns' value='0'> 
<input type='checkbox' name='unicorns' value='1' {!! old('unicorns', $model->unicorns) ? ' checked' : '' !!}> 

그런 식으로, 해당 필드에 대한 0의 값은 여전히 ​​POST 요청에 존재합니다 : 그래서, 당신의 경우는 같은 것이 될 것이다. 체크가되면 체크 박스의 값이 숨겨진 필드의 값을 덮어 쓰므로 순서가 중요합니다. 이 방법으로 사용자 정의 클래스를 사용할 필요는 없습니다.

그게 효과가 있습니까?

+0

시도해 주셔서 감사 합니다만, 아니요,이 질문에 전혀 대답하지 않습니다. 질문의 ** 맨 처음 문장 **은 당신이 대답 한 질문을하지 않고 있다고 설명합니다. 문제는 프런트 엔드에서 확인란 상태를 올바르게 유지하는 것입니다.이 대답은이를 해결하지 못합니다. –

+0

Hmmm, 공정한, 미안, 나는 더 많은 도움이 될 수 없었다 :-) –