2012-03-27 2 views
0

동적 필드 설정에 대한 질문 (Javascript Function to add/remove fields 참조)을 통해 JavaScript에서 사용자가 추가 및 삭제할 수있는 양식을 제공하는 좋은 해결책이라고 생각했던 것을 생각해 냈습니다. 필드 그룹을 제거하십시오. 여기에 자바 스크립트 함수는 다음과 같습니다JavaScript 함수에서 PHP의 필드 이름 재정의

var fieldcount = 2; 
var count = 2; 
window.createinput = function (field1, field2, field3, area, limit) { 
    if (count > limit) return; 
    field_area = document.getElementById(area); 
    var qty = document.createTextNode("Quantity"); 
    var msr = document.createTextNode(" Measure"); 
    var ing = document.createTextNode(" Ingredient Name"); 
    var li = document.createElement("li"); 
    var input = document.createElement("input"); 
    input.id = field1 + fieldcount; 
    input.name = field1 + fieldcount; 
    input.size = "10"; 
    input.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc. 
    li.appendChild(qty); 
    li.appendChild(input); 
    var input2 = document.createElement("input"); 
    input2.id = field2 + fieldcount; 
    input2.name = field2 + fieldcount; 
    input2.size = "20"; 
    input2.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc. 
    li.appendChild(msr); 
    li.appendChild(input2); 
    var input3 = document.createElement("input"); 
    input3.id = field3 + fieldcount; 
    input3.name = field3 + fieldcount; 
    input3.size = "30"; 
    input3.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc. 
    li.appendChild(ing); 
    li.appendChild(input3); 
    field_area.appendChild(li); 
    //create the removal link 
    var removalLink = document.createElement('a'); 
    removalLink.className = "remove"; 
    removalLink.onclick = function() { 
     this.parentNode.parentNode.removeChild(this.parentNode); 
     count = count - 1; 
    } 
    var removalText = document.createTextNode('Remove Field Group'); 
    removalLink.appendChild(removalText); 
    li.appendChild(removalLink); 
    fieldcount++ //loop in php to handle renaming variables for database entry based on total number of field groups 
    count++ 
} 

이 기능이 될 것이다 참조하는 HTML 코드 :

<ul id="ingredients"> 
    <li>Quantity<input type="text" name="ingredient_quantity_1" id="ingredient_quantity_1" size="10" /> Measure<input type="text" name="ingredient_measure_1" id="ingredient_measure_1" size="20" /> Ingredient Name<input type="text" name="ingredient_name_1" id="ingredient_name_1" size="30" /></li> 
</ul> 
<input type="button" value="Add Ingredient" onclick="createinput('ingredient_quantity_','ingredient_measure_','ingredient_name_','ingredients', 5)" /> 

또한 http://jsfiddle.net/wtX7Y/82/

문제에서 볼 수 있습니다입니다 내가 얻고 싶은 경우 이러한 폼 값은 PHP에서 필드 이름은 함수 호출에 정의 된 제한에 도달 할 수 있지만 값은 필드에 필드를 제거 할 수 있기 때문에 시퀀스에 갭 (예 : 성분 __name_1, 성분 __name, 성분 _4)이있을 수 있습니다. 일 removeLink.onclick 함수.

데이터베이스에 보내거나 JavaScript 기능을 다시 작성하여 필요를 없애고 PHP의 정상적인 순서로 POST 할 수 있도록 일부 필드 형식 값에서이 필드 이름 값을 검색/재정의 할 수있는 메커니즘을 작성해야합니다. 간단한 반복 루프를 사용하여 값을 검색하십시오. 나는이 특정 질문을 어디에서든지 내 검색에서 발견하지 못했다. 그러나 나는 사람들이 가변 변수의 이름을 처리 할 수있는 배열을 제안하고 이것이 적절한 접근법인지 궁금해하고있다.

내 기존 코드 - 다음과 같이 PHP for 루프를 사용하여 문제점을 해결하려고 시도했지만 루프 내에서 두 개의 개별 카운트를 처리하는 방법을 알 수 없습니다 (하나는 새로운 필드 이름 값을 검색하기위한 변수 이름 및 하나) 재정의 할 :

$field_count = 1; 
for($i = 1; $i <= 25; $i++) 
{ 
    if(isset($_REQUEST['ingredient_quantity_' . $field_count])) 
    { 
     ${'ingredient_quantity_' . $i} = $_REQUEST['ingredient_quantity_' . $field_count]; 
     ${'ingredient_measure_' . $i} = $_REQUEST['ingredient_measure_' . $field_count]; 
     ${'ingredient_name_' . $i} = $_REQUEST['ingredient_name_' . $field_count]; 
     echo $i . ". Field Count:" . $field_count . " - " . ${'ingredient_quantity_' . $i} . " " . ${'ingredient_measure_' . $i} . " " . ${'ingredient_name_' . $i} . "<br />"; 
    } 
    $field_count++; 
} 

결론 난 그냥 특정 필드 이름 접두사로 설정 필드의 수를 계산하는 방법이 필요하다 (예를 들어, 'ingredient_quantity_ ')와 그들의 특정 번호, 그래서 나는 데이터를 삽입하는 데이터베이스 쿼리를 실행할 수 있습니다. 입력란에서 배열을 만듭니 까? 다른 것?

답변

1

입력 요소의 이름 (ID가 아님)에 []을 추가 할 수 있습니다. 입력 요소의 개수에 관계없이 PHP는 깔끔한 배열로 변환합니다.

하지만 그 방법에는 문제가 있습니다. 어떤 성분 _ 이름이 어떤 성분 _ 성분과 성분 _ 성분과 일치 하는지를 추적 할 필요가 있습니다. 배열에서 모든 것을 버리면 한 성분의 이름이 다른 성분의 양과 섞일 수 있습니다. 그거 좋지 않아? 한마디로

$ingredients = array(); // Initialize array 
foreach ($_POST as $key => $value) { 
    if (!strncmp($key, 'ingredient_name_', 16)) { // If field name begins with "ingredient_name_" 
     $ingredients[] = array(
      'name' => $_POST[$key], 
      'quantity' => $_POST[('ingredient_quantity_'.substr($key, 16))], 
      'measure' => $_POST[('ingredient_measure_'.substr($key, 16))], 
     ); 
    } 
} 

가, 대답은 제출 된 데이터에 반복하여 자신 $ingredients 배열을 구축하는 것입니다 :

그래서 당신의 최선의 방법은 다음과 같이 될 것이다. 이름이 고정 된 다른 모든 필드는 정상적으로 처리 될 수 있습니다. 얼마나 많은 성분이 있는지 알고 싶다면 count($ingredients)을 이용하십시오. 인위적인 제한이 25 인 현재 코드와 달리 수백 가지 성분이 있더라도 작동합니다.

이 솔루션에서는 성분 _ 이름 (수)이라는 필드가있을 때마다 성분 _quantity_ (동일한 번호)와 해당 데이터가 저장되는 성분 _measure_ (동일한 번호). 그렇지 않은 경우 (예 : 일부 입력란이 선택 사항 인 경우) 필수 입력란을 선택하고 $_POST 배열에서 해당 입력란을 찾아 누락 된 입력란을 처리하는 조건을 추가하십시오.

+0

감사합니다. 나는 이것을 시도 할 것이다. 필자는 배열 작성에 익숙하지 않지만 필드 이름 값을 찾기 위해 복잡한 메커니즘을 만들고 값을 재 할당하려고 시도하는 것이 아니라 문제에 접근하는 것이 가장 좋은 방법이라고 생각했습니다. 세 가지 필드 ('ingredients_quantity_', 'ingredient_measure_', 'ingredient_name_')에 모두 해당 데이터가 있다고 가정하면 양식의 유효성을 검사해야합니다. 그래서 그것은 좋은 해결책입니다. 그러나 위의 코드에서 값 16을 이해할 수 있는지 확실하지 않습니다. –

+1

필드 이름의 처음 16자를 "성분 __name"(길이가 16 자임)과 비교하도록 'strncmp'에게 말하고 있기 때문에 처음 16 명이 있습니다. 처음 16 문자가 일치하면 함수는 0을 반환합니다. 문자열이 다른 문자열로 시작하는지 확인하는 것은 깔끔한 방법입니다. 나머지 두 16은'substr'에게 "ingredients_name_"다음에 나오는 숫자를 추출하도록 지시합니다 (처음 16자를 무시 함). 문자열을 자르는 것은 PHP의 빵과 버터입니다! – kijin

+0

설명해 주셔서 감사합니다. –

관련 문제