2012-02-13 5 views
1

양식을 편집하고 삭제할 수있는 항목이 있습니다. 이제 모든 itms가 필드 세트로 목록에 표시됩니다. 다음 폼이 함수 생성Drupal 데이터베이스에서 잘못된 행을 삭제/업데이트 중

$venues = db_query('SELECT vid, name, address, postcode, city FROM venues v WHERE v.uid = :uid', array(':uid' => $user->uid)); 
if($venues->rowCount() != 0) { 
    foreach($venues as $venue) { 
    $page['venue_editing_form'][] = drupal_get_form('venue_editor_form', $venue->vid, $venue->name, $venue->address, $venue->postcode, $venue->city); 
    } 
} 

:

function venue_editor_form($form, &$form_state, $vid, $vname, $vadd, $vpostc, $vcity) { 
$form['#prefix'] = '<div class="vedit">'; 
$form['#suffix'] = '</div>'; 
$form['edit_fieldset_'.$vname] = array(
    '#type' => 'fieldset', 
    '#title' => t($vname), 
    '#collapsible' => TRUE, 
    '#collapsed' => TRUE, 
    '#attributes' => array('class' => array('venue-edit')), 
); 
$form['edit_fieldset_'.$vname]['venue_name'] = array(
    '#type' => 'textfield', 
    '#title' => t('Venue name:'), 
    '#description' => t('Enter the venue name.'), 
    '#default_value' => $vname, 
    '#attributes' => array('onfocus' => 'this.value=""') 
); 
$form['edit_fieldset_'.$vname]['address'] = array(
    '#type' => 'textfield', 
    '#title' => t('Address:'), 
    '#description' => t('The address of this venue.'), 
    '#default_value' => $vadd, 
    '#attributes' => array('onfocus' => 'this.value=""') 
); 
$form['edit_fieldset_'.$vname]['postcode'] = array(
    '#type' => 'textfield', 
    '#title' => t('Postcode'), 
    '#description' => t('Enter the postcode for this event, so planB can position it on the map'), 
    '#default_value' => $vpostc, 
    '#attributes' => array('onfocus' => 'this.value=""', 'onblur' => 'getLatLong(this)') 
); 
$form['edit_fieldset_'.$vname]['city'] = array(
    '#type' => 'textfield', 
    '#title' => t('City'), 
    '#description' => t('The city this venue is in.'), 
    '#default_value' => $vcity, 
    '#attributes' => array('onfocus' => 'this.value=""') 
); 
$form['edit_fieldset_'.$vname]['edit_submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Submit changes'), 
    '#validate' => array('venue_creation_form_validate') 
); 
$form['edit_fieldset_'.$vname]['delete_venue'] = array(
    '#type' => 'submit', 
    '#value' => t('Delete venue'), 
    '#submit' => array('venue_form_delete') 
); 
$form['edit_fieldset_'.$vname]['venueid'] = array(
    '#type' => 'value', 
    '#value' => $vid 
); 
return $form; 

}

후 제출 핸들러 중 하나

function venue_form_delete($form, &$form_state) { 
    $deleted = db_delete('venues') 
    ->condition('vid', $form['#venueid'], '=') 
    ->execute(); 
    drupal_set_message('Venue deleted successfully.'); 
} 

필드 셋은이 방법으로 생성 된 이제 문제는 어떤 장소의 삭제 버튼을 눌러도 Drupal은 항상 첫 번째 삭제 버튼을 삭제한다는 것입니다. 목록에있는 것들 중. $form['#venueid']은 어떤 이유로 든 제출 처리자 목록의 첫 번째 개최지로 항상 설정되지만 양식을 생성 할 때 메시지를 인쇄하면 각 양식마다 다른 ID가 있습니다.

이전에이 문제가 발생 했습니까? (주요

$form['#venueid'] = $vid; 

이 그냥 '만들어'형태의 속성에 값을 할당합니다

+0

어디서 오는가? 알았 니? – SpaceBeers

+0

vid는 모든 장소의 세부 정보를 얻기 위해 데이터베이스 쿼리에서 온 장소 ID입니다. 그런 다음 foreach 루프를 사용하여 모든 결과를 확인하고 drupal_get_form ('venue_editor_form', $ venue-> vid ...) – KerrM

+0

질문을 다시 읽으면 여러 필드 세트와 여러 개의 제출/삭제 버튼 (즉, 장소 당 하나의 필드 세트)? –

답변

1

몇 주 전에 동료 중 한 명이이 문제에 부딪혔습니다. 이 문제가 발생하는 이유는 같은 양식을 한 페이지에 여러 데이터로 여러 번로드하려고하기 때문입니다. 이것이 작동해야하는 것처럼 보이지만 모든 양식이 동일한 토큰/ID로 끝나기 때문에 그렇지 않습니다. 각 양식을 제출할 때 시스템은 실제로 클릭 한 것을 알지 못하므로 적절한 조치를 취할 수 없습니다. 이 모든 일 개 대신 여러

2) '기본 형태'를 만들 hook_forms(...)를 사용의 형태로 처리 될 수 있도록)

1 양식을 재 작업이 문제를 해결하기 위해이 개 방법이 있습니다

그런 다음 '기본 양식'에 매핑되는 각 장소에 대해 고유 한 양식을 생성하십시오. 이렇게하면 각 양식이 각각의 양식을 작성하지 않고도 고유 한 ID를 얻게됩니다.

나는 drupal 7 예제가 없지만 여기에는 hook_forms http://www.computerminds.co.uk/drupal-6-multiple-instances-same-form-one-page을 사용하여 drupal 6의 문제를 해결하는 방법을 보여주는 페이지가 있습니다.당신은

가이 코드를 테스트 havent 한 동일한 기술을 적용 할 수 있어야한다, 그러나 이것은 기본적인 생각이다 :

는 고유 ID를 사용하도록 get_form을 수정

foreach($venues as $venue) { 
    $page['venue_editing_form'][] = drupal_get_form('venue_editor_form_'. $venue->vid, $venue->vid, $venue->name, $venue->address, $venue->postcode, $venue->city); 
    } 

Impliment이

을 hook_forms
function MODULENAME_forms($form_id) { 
    $forms = array(); 
    if (preg_match('/venue_editor_form_/', $form_id) { 
    $forms[$form_id] = array(
     'callback' => 'venue_editor_form', 
    ); 
    } 
    return $forms; 
} 

그리고 나서 폼의 submit 매개 변수를 수정하여 모두 동일한 submit 핸들러로 라우트되도록해야한다고 생각합니다. 당신이 버튼마다 다른 제출하기를 추가하는 것처럼 보이는 않지만 당신이 아무것도 또한 유효성 검사 기능이 동일한 작업을 수행해야 할 수도 있습니다

$form['#submit'] => array('venue_editing_form_submit'); 

을 할 필요가되지 않을 수도 있습니다.

그렇게해야합니다.

+0

감사합니다. 문제가 해결되었습니다. 드루팔 (Drupal은 같은 양식 ID를 가진 제출물을 식별 할 수 없으므로 잘못된 장소를 삭제하는 것입니다! 다시 한번 감사드립니다. – KerrM

0

나는 문제는 당신이 명시 적 값 필드를 사용하지 않고 폼 처리를 통해 venueid 값을 전달하려고한다는 것입니다 생각 '#'). 보통 존재하지 않습니다. 대신 명시 적 value field type를 사용해보십시오 :

$form['venueid'] = array(
    '#type' => 'value', 
    '#value' => $node->vid 
); 

을이 함께, VID는 $form_state['values']에, 즉 다른 모든 형태의 값처럼 제출 기능에서 사용할 수 있어야합니다 :

function venue_form_delete($form, &$form_state) { 
    $deleted = db_delete('venues') 
    ->condition('vid', $form_state['values']['venueid'], '=') 
    ->execute(); 
    drupal_set_message('Venue deleted successfully.'); 
} 

참고 제거 '#'문자 - 선행 '#'은 양식 처리 중에 Drupal이 해석하려고하는 양식 및 양식 요소의 속성을 나타내며 '#venueid'는 정의 된 속성이 아닙니다.

+1

맞춤 FAPI 속성을 사용하는 것은 매우 일반적인 표준입니다 (예 : Date의'# date_format '키와 같이 수십 개의 기여 모듈이 그렇게합니다). 배열에서'#' 'd 속성을 사용할 때의 유일한 문제점은 기존의 명명 된 속성과의 충돌 가능성입니다. 이것은 속성의 이름 앞에 구현을 담당하는 모듈의 이름을 붙여서 피할 수 있습니다. '# mymodule_venueid'. 이 방법 외에는 100 % 유효하며 설명 된 문제를 일으키지 않습니다. – Clive

+2

@Clive : 맞습니다. 많은 contrib 모듈이이 방법을 사용합니다. 그러나 저는 이것을 '표준 사례'라고 부르지 않을 것입니다. 이와 같이 FAPI 속성을 사용하면 공식적이고 문서화 된 권장 대체 방법 ('#value'형식 요소)을 사용하는 대신 문서화되지 않은 기능 (언제든지 변경 될 수 있음)에 의존하게됩니다. 그래서 제 제안은 문서화되지 않은 '기능'에 대한 문제를 찾기 전에 '정상적인'방법을 먼저 시도하는 것을 목표로했습니다. –

+1

@Clive : 그리고 오해를 피하기 위해 - '문서화되지 않은'것으로, 나는 자체 FAPI 속성의 개념을 의미하지는 않습니다. 맞춤 모듈에서 FAPI 기능을 확장하려는 경우 (예 : 새로운 요소 유형을 제공함으로써, 그는 필요하다면 (예 : date 모듈이'# date_format'과 같이) 사용자 정의 속성을 사용할 수 있고 사용해야합니다. 그러나이 속성의 사용은 형식을 처리하기 위해 값을 전달하는 것이 아니라 양식의 수명 동안 양식 요소 처리/처리를 목표로합니다. –

관련 문제