8

如何为特定内容类型自定义创建内容表单。在这种情况下,我有一个 CCK 类型的产品,但每次创建产品时,我都会使用 4 个字段名称、价格、图片和尺寸。

有没有办法缩小创建内容的形式,只拥有这些选项?这是Contempt做的吗?

4

4 回答 4

7

你会想要使用hook_form_alter钩子。

在 Drupal 6 中,我使用它来隐藏节点编辑/添加表单中的大部分无关内容。

function mymodule_form_alter(&$form, $form_state, $form_id) {
  // hide extraneous options in the node form for nodetype nodes
  if($form_id == 'nodetype_node_form') {
    $form['path']['#access'] = FALSE;
    $form['menu']['#access'] = FALSE;
    $form['author']['#access'] = FALSE;
    $form['options']['#access'] = FALSE;
    $form['comment_settings']['#access'] = FALSE;
    $form['revision_information']['#access'] = FALSE;
  }
}

Contemplate 用于设置节点视图的样式,而不是节点表单。我不建议这样做 - 使用node-nodetype.tpl.php文件要好得多。

于 2009-02-04T17:56:31.747 回答
1

另一种选择——如果你真的想精简一些东西,这可能更简单——是从头开始创建自己的表单,并在表单的提交处理程序中自己创建一个节点对象。

于 2009-02-04T20:00:34.383 回答
1

找到了一个很好的资源:

http://www.lullabot.com/articles/modifying-forms-5-and-6

它提到的伊顿或 ceejayoz 未涵盖的一件事是隐藏主题层中的字段。

于 2009-02-04T20:31:48.283 回答
0

我创建了一个模块并使用 form_alter 和 nodeapi。

以下是您的模块需要的组件的基本概念。

我的 product.install 文件具有以下内容:

function product_install() {
  db_query("CREATE TABLE {product} (
    nid int(10) unsigned NOT NULL default '0',
    primary key (nid),
    price DECIMAL(7, 2) UNSIGNED NOT NULL DEFAULT 0.00
    ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */;"
  );
}

function product_uninstall() {
  db_query("DROP TABLE {product}");
}

然后 product.module 文件包含:

function product_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if($node->type != 'product') {
    return;
  }
  switch($op) {
    case 'load':
      return _product_load($node);
    case 'insert':
      _product_insert($node);
      break;
    case 'delete':
      _product_delete($node);
      break;
    case 'update':
      _product_delete($node);
      _product_insert($node);
      break;
    case 'view':
      //display your product 
      $node->content['price'] = array(
        '#value' => theme('transact_node_status', $node),
        '#weight' => 5,
      );
      break;
  }
}

function product_form_alter(&$form, $form_state, $form_id) {
  if($form_id == 'product_node_form'){
    $form['price'] = array(
      '#type' => 'textfield',
      '#title' => t('Price'),
      '#default_value' => $form['#node']->price,
    );
  }
  return $form;
}

function _product_load($node) {
  $result = db_query("SELECT * FROM {product} WHERE nid = %d", $node->nid);
  $arr = db_fetch_array($result);
  unset($arr['nid']);
  return $arr;
}

function _product_insert($node) {
  db_query("INSERT INTO {product} (nid, price) VALUES(%d, %d)", $node->nid, $node->price);
}

function _product_delete($node) {
  db_query("DELETE FROM {product} WHERE nid = %d", $node->nid);
}
于 2009-02-08T11:06:11.587 回答