Form feldolgozása kódból

Balogh Zoltán képe

Az lenne a cél, hogy kódból hozzunk létre és dolgozzunk is fel (submit) egy űrlapot. Sajnos nem találtam túl sok érdemi infót d7-re, pedig kerestem bőszen. Az alábbi kódrészlet futtatásával próbálkozom, egyelőre csak egy Devel blokkban:

$search_form_state['build_info']['args'] = array();
$search_form = drupal_build_form('search_block_form', $search_form_state);
form_set_value($search_form['search_block_form'], 'drupal', $search_form_state);
$search_form_state['submitted'] = TRUE;
$search_form_state['programmed'] = TRUE;
$search_form_state['process_input'] = TRUE;
drupal_process_form('search_block_form', $search_form, $search_form_state);

A cél az lenne, hogy a kód hatására fusson le a keresés, vagyis a Drupal hajtson végre egy keresést a „drupal” szóra, és ennek eredménye jelenjen meg, pontosan úgy, mintha a felhasználó begépelte volna ezt a szót a kereső blokkba. A fenti kód eredménye viszont csak egy „Please enter some keywords.” hibaüzenet (és nincs redirect sem), vagyis mintha a drupal_process_form futása a !form_get_errors() résznél elakadna. Ezek szerint a form_set_value()-t nem használom helyesen? Mivel nem állítódik be a keresett kifejezés, pedig a drupal_process_form() hívása előtt mintha jó lenne az érték egy dsm($search_form_state) szerint.

Drupal verzió: 
fox mulder képe

Nem válasz a kérdésre, de az nem elég, hogy
drupal_goto('search/node/drupal');
?

A drupal_process_form() helyett a drupal_form_submit('search_block_form', $search_form_state) sem irányít át, de legalább nem okoz hibát.

0
0

Fox Mulder

pp képe

Balogh Zoltán képe

A jelzett probléma persze a végtelenül leegyszerűsített változat volt. A valós helyzetben - entity_translation modul, a hozzászólások fordítása kódból a Bing Translation API hívogatásával - a drupal_form_submit() használata tényleg a megoldáshoz vezet, bár van még néhány - egyelőre - érthetetlen PHP notice a megoldandó feladatok között, de nagyjából működik.

Kösz.

0
0
aries képe

Rágd meg jól a dolgot, mert sok esetben módosítanod kell a $GLOBALS['user']-t és függetleníteni kell magad a $_SESSION-től is.

0
0
Balogh Zoltán képe

No, minden notice drupalish módon elhárítva, de nem akarok nagyon offolni. A drupal_form_submit() használata valóban A nagybetűs megoldás az eredeti kérdésemre, bár kétségtelen, hogy igen nagy mértékben kell túrni még hozzá, a Drupal forrásától kezdve a doksikon át a fél webet, és nagyon meg kell érteni sokminden egyebet is ahhoz, hogy stabil, működőképes legyen a produktum.

1
0
nevergone képe

Balogh Zoltán képe

/**
 * Process the kezinfo_comment_autotranslate form submissions.
 * - Translate the comment using the Bing Translation API. 
 * - Submit the entity_translation_edit_form with the translated comment.
 */
function kezinfo_comment_autotranslate_form_submit($form, &$form_state) {
  global $language;
  module_load_include('inc', 'entity_translation', 'entity_translation.admin');
  $comment = $form['#comment'];
  $translate_form_state['build_info']['args'] = array('comment', $comment, $language->language, $comment->language);
  $translate_form = drupal_build_form('entity_translation_edit_form', $translate_form_state);
  $translate_form_state['values']['comment_body'][$language->language][0]['value'] = bing_translate_api_translate($comment->comment_body[$comment->language][0]['value'], $comment->language, $language->language);
  $translate_form_state['values']['op'] = t('Save translation');
  drupal_form_submit('entity_translation_edit_form', $translate_form_state);
  cache_clear_all();
  $form_state['redirect'] = "node/{$comment->nid}" . (variable_get('comment_talk_' . node_load($comment->nid)->type, 0) ? '/talk' : '');
}
1
0