0

私はDrupalにまったく慣れていないので、編集可能な列、チェックボックスを変更する他の列などを含むカスタムグリッドを作成したいと思います。

このtheme()関数を使用してテーブルを作成し、設定でレンダリングしています。form / settings変数にアクセスする方法が見つからないため、theme関数内で、drupalデータベースにgid値を含むカスタムテーブルを作成し、それらの行をレンダリングします。テストの目的で、「変数」テーブルの行をフェッチします。これまでのコードは次のとおりです。

 $form['module_settings']['profile_grid'] = array(
        '#type' => 'item',
        '#title' => t('Profile Mapping'),
        '#theme' => 'profile_mapping_grid'
    );


function theme_profile_mapping_grid($sender) {
    $header = array('', t('name'), t('value'));
    $result = db_query('SELECT v.name, v.value from {variable} v');
    while ($pair = db_fetch_object($result)) { 
        $format = array(
            '#type' => 'textfield',
            '#size' => 30,
            '#value' => $pair->name
        );
        $hhfield = array(
            '#type' => 'textfield',
            '#size' => 30,
            '#value' => $pair->value
        );
        $row = array('');
        $row[] = drupal_render($format);
        $row[] = drupal_render($hhfield);
        $rows[] = array('data' => $row);    
    }

    $output = theme('table', $header, $rows, array('id' => 'gridErrors'));
    return $output;
}

グリッドは正しく生成されますが、問題があります。後で送信アクションでその値を収集するために、「name」属性をテキストフィールドに設定できません。さらに、これが設定グリッドを作成するための最良の方法であるかどうかはわかりません。

どんなアイデア、意見なども大歓迎です。

4

2 に答える 2

0

テーマ関数でフィールドを生成していますが、送信関数はフォーム関数によって生成されたフィールドにのみ作用するため、機能しません。

正しい方法は、フォーム関数 (基本的にテーマ関数で現在行っていること) ですべてのフィールドを生成し、drupal_render を使用してテーマでレンダリングすることです。

フォーム/設定変数にアクセスする方法が見つからないため、テーマ関数内

フォームは引数としてテーマ関数に渡されます。あなたの場合は $sender です。それがそれらにアクセスする方法です。

これはテストされていないコードですが、アイデアはわかります。この呼び出し$output .= drupal_render($form);は、form_id や CSRF 保護などのフォーム API に必要な非表示フィールドをレンダリングするため、非常に重要であることに注意してください。この呼び出しなしでは、submit は機能しません。

function mymodule_grid_form($form_state) {
    $form = array();
    $form['variables'] = array();

    $result = db_query('SELECT v.name, v.value from {variable} v');
    while ($pair = db_fetch_object($result)) { 
        $form['variables'][$pair->name][$pair->name . '_name'] = array(
            '#type' => 'textfield',
            '#size' => 30,
            '#value' => $pair->name
        );
        $form['variables'][$pair->name][$pair->name . '_value'] = array(
            '#type' => 'textfield',
            '#size' => 30,
            '#value' => $pair->value
        );
    }

    return $form;
}

function theme_mymodule_grid_form($form) {
    $header = array('', t('name'), t('value'));

    foreach ($form['variables'] as $variable => $values) {
        $row = array('');
        $row[] = drupal_render($values[$variable . '_name']);
        $row[] = drupal_render($values[$variable . '_value']);
        $rows[] = array('data' => $row); 
    }

    $output = theme('table', $header, $rows, array('id' => 'gridErrors'));
    $output .= drupal_render($form);
    return $output;
}

function mymodule_theme() {
  return array(
    'mymodule_grid_form' => array(
      'arguments' => array('form' => NULL),
    ),
  );
}
于 2012-06-29T21:29:33.627 に答える
0

Drupal 6 フォーム API クイックスタート ガイドによると:

  1. ユーザーが変更できるフォーム要素には、'#value' 属性を使用しないでください。代わりに「#default_value」属性を使用してください。$form_state['values'] (または $_POST) からの値をここに置かないでください! FormsAPI がそれを処理します。ここにはフィールドの元の値のみを入力してください。

'#default_value' => $pair->namenotを使用する必要があり'#value' => $pair->valueます。

これは、設定テーブルを含むサンプル モジュールです。

インストールファイル:

<?php
// $Id$

/**
 * @file
 * The your_module module install file, which handles the install/uninstall tasks.
 *
 */

function your_module_install() {
  // Create tables.
  drupal_install_schema('your_module');
}

/**
 * Implementation of hook_schema().
 */
function your_module_schema() {

/* Settings table */
$schema['your_module_settings'] = array(
    'description' => 'Stores module settings.',
    'fields' => array(
        'record_id' => array(
            'description' => 'The primary identifier for a record.',
            'type' => 'serial', 
            'unsigned' => TRUE, 
            'not null' => TRUE),
        'item_code' => array(
            'type' => 'varchar', 
            'length' => '255', 
            'not null' => TRUE),
        'setting_one' => array(
            'type' => 'varchar', 
            'length' => '255', 
            'not null' => TRUE),
        'setting_two' => array(
            'type' => 'varchar', 
            'length' => '255')),
    'unique keys' => array(
        'record_id' => array('record_id')),
    'primary key' => array('record_id')
);

  return $schema;
}

/**
 * Implementation of hook_uninstall().
 */
function your_module_uninstall() {
  // Remove tables.
  drupal_uninstall_schema('your_module');
}

モジュールファイル:

<?php

/**
 * Implementation of hook_help()
 */
function your_module_help($path, $arg) 
{
  switch ($path) 
  {
    case 'admin/help#your_module':
      return '<p>'. t('Module description.') .'</p>';
  }
}

/**
 * Implementation of hook_menu()
 */
function your_module_menu()
{
  $items = array();

  /* module settings page */
  $items['admin/settings/your_module'] = array(
    'description' => 'Administer your_module module settings.',
    'title' => 'Some title',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('your_module_admin_settings'),
    'access arguments' => array('access administration pages'),
    'type' => MENU_NORMAL_ITEM,
    );

  return $items;
}

/**
 * Implementation of hook_theme().
 */
function your_module_theme() {
  return array(
    'your_module_products_settings' => array(
      'arguments' => array('form' => NULL),
    ),
  );
}

/**
 * Settings form
 */
function your_module_admin_settings(&$form_state)
{
  $form['your_module'] = array(
      '#type' => 'fieldset',
      '#title' => t('Settings'),
      '#description' => t('Settings description.'),
    );

  $form['your_module']['products_settings_table'] = array(
      '#theme' => 'your_module_products_settings',
      '#tree' => TRUE,
    );

  $form['your_module']['products_settings_table']['products_settings'] = array();

  $result = db_query('SELECT record_id, item_code, setting_one, setting_two  FROM {your_module_settings} ORDER BY item_code');

  while ($product_setting = db_fetch_object($result)) {
    $form['your_module']['products_settings_table']['products_settings'][$product_setting->record_id] = array();

    $form['your_module']['products_settings_table']['products_settings'][$product_setting->record_id]['item_code'] = array(
      '#type' => 'textfield',
      '#default_value' => $product_setting->item_code,
      '#size' => 8,
      '#maxlength' => 16,
    );

    $form['your_module']['products_settings_table']['products_settings'][$product_setting->record_id]['setting_one'] = array(
      '#type' => 'textfield',
      '#default_value' => $product_setting->setting_one,
      '#size' => 16,
      '#maxlength' => 16,
    );

    $form['your_module']['products_settings_table']['products_settings'][$product_setting->record_id]['setting_two'] = array(
      '#type' => 'textfield',
      '#default_value' => $product_setting->setting_two,
      '#size' => 40,
      '#maxlength' => 255,
    );
  }

  /* "add new row" fields */
  $form['your_module']['products_settings_table']['products_settings_new'] = array();

  /* new item_code */
  $form['your_module']['products_settings_table']['products_settings_new']['item_code'] = array(
    '#type' => 'textfield',
    '#size' => 8,
    '#maxlength' => 16,
    '#description' => t('description'),
  );

  /* new setting_one */
  $form['your_module']['products_settings_table']['products_settings_new']['setting_one'] = array(
    '#type' => 'textfield',
    '#size' => 16,
    '#maxlength' => 16,
    '#description' => t('description'),
  );

  /* setting_two */
  $form['your_module']['products_settings_table']['products_settings_new']['setting_two'] = array(
    '#type' => 'textfield',
    '#size' => 40,
    '#maxlength' => 255,
    '#description' => t('description'),
  );

  /* Submit button */
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save Settings'),
    '#name' => 'SubmitButton',
  );

  return $form;
}

/**
 * Custom theme function for a table of products settings
 */
function theme_your_module_products_settings($form) {
  $header = array(t('Item Code'), t('Setting One'), t('Setting Two'));
  $rows = array();

  /* saved rows */
  foreach (element_children($form['products_settings']) as $key) {
    $row = array();
    $row[] = drupal_render($form['products_settings'][$key]['item_code']);
    $row[] = drupal_render($form['products_settings'][$key]['setting_one']);
    $row[] = drupal_render($form['products_settings'][$key]['setting_two']);
    $rows[] = $row;
  }

  /* new row to add */
  $row = array();
  $row[] = drupal_render($form['products_settings_new']['item_code']);
  $row[] = drupal_render($form['products_settings_new']['setting_one']);
  $row[] = drupal_render($form['products_settings_new']['setting_two']);
  $rows[] = $row;

  $output = theme('table', $header, $rows);
  return $output;
}

/**
 * Submission function for your_module_admin_settings form.
 */
function your_module_admin_settings_submit($form, &$form_state) {

  /* processing changes */
  if (isset($form_state['values']['products_settings_table']['products_settings'])) {
    foreach ($form_state['values']['products_settings_table']['products_settings'] as $record_id => $data) {
      if (empty($data['item_code']) && empty($data['setting_one']) && empty($data['setting_two'])) {
        /* delete saved row if all fields are empty */
        db_query("DELETE FROM {your_module_settings} WHERE record_id=%d", $record_id);

        drupal_set_message(t('Deleted.'), 'status');
      }
      else {
        /* update */
        db_query("UPDATE {your_module_settings} SET item_code='%s', setting_one='%s', setting_two='%s' WHERE record_id=%d",
          $data['item_code'], $data['setting_one'], $data['setting_two'], $record_id);
      }
    }
  }

  /* adding new row */
  $item_code = $form_state['values']['products_settings_table']['products_settings_new']['item_code'];
  $setting_one = $form_state['values']['products_settings_table']['products_settings_new']['setting_one'];
  $setting_two = $form_state['values']['products_settings_table']['products_settings_new']['setting_two'];

  if (!empty($item_code) && !empty($setting_one) && !empty($setting_two)) {

    db_query("INSERT INTO {your_module_settings} (item_code, setting_one, setting_two) VALUES ('%s', '%s', '%s')",
        $item_code, $setting_one, $setting_two);

    drupal_set_message(t('Added new setting.'), 'status');
  }

  drupal_set_message(t('Settings updated.'), 'status');
}
于 2015-08-28T14:47:09.813 に答える