web-dev-qa-db-ja.com

ubercartの上書き-カートに追加ボタン

この関数を使用してカスタムモジュールのフックフォーム変更でカートに追加ボタンをオーバーライドしようとしましたが、エラーが発生しました致命的なエラー:致命的なフレックススキャナーの内部エラーバッファーの終わりがありません。問題は何ですか?

function uc_button_form_alter($form_id, &$form_state, $node) {
  if ($form_id == 'edit-submit-' . $node->nid) {
    $form['submit']['#attributes']=  array(
      'class' => 'node-add-to-cart',
      'xxx' => 'xxx',
    );
  }
};

ありがとうございました

2
loparr

D7では、さまざまな製品クラスのソリューションを以下に示します。

/* Overrides the Add to Cart form text*/
if ( !empty($form['nid']) ) {
  $node = $form['nid']['#value'];
}
else {
  $node = 0;
}
if (($form_id == 'uc_product_add_to_cart_form_'.$node) and ($form['node']['#value']->type =='uc_recurring_subscription')){
   $form['actions']['submit']['#value'] = t('Subscribe');     
}

if (($form_id == 'uc_product_add_to_cart_form_'.$node) and ($form['node']['#value']->type =='credit')){
   $form['actions']['submit']['#value'] = t('Buy');     
}

通常の製品または1つの製品クラスのみの場合、これでうまくいくはずです。

/* Overrides the Add to Cart form text*/
if ( !empty($form['nid']) ) {
  $node = $form['nid']['#value'];
}
else {
  $node = 0;
}
if (($form_id == 'uc_product_add_to_cart_form_'.$node){
   $form['actions']['submit']['#value'] = t('Buy now');     
}
3
Dee

関数の引数が間違っています。 hook_form_alter docs を参照してください。

したがって、基本的には次のように関数を書き直す必要があります。

まず、正しいフォームを取得します。ID.form_alter関数には$ nodeがありませんが、一部のフォームでは、完全なノードオブジェクトフォームが$ formにあります。したがって、次のコードを使用します。メッセージ領域にフォームIDと$ formの配列の説明を含む少なくとも2つのメッセージが表示されます。

function uc_button_form_alter(&$form, &$form_state, $form_id) {
  drupal_set_message($form_id);
  drupal_set_message('<pre>'.print_r($form, 1).'</pre>');
};

次に、探しているノードIDが$ form配列で使用できるかどうかを確認します。 (ほとんどの場合、それは$ form ['#node']にあります)。これで、関数を実際のコードに変更できます。

function uc_button_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['#node']->nid) && $form_id == 'edit-submit-' . $form['#node']->nid) {
    $form['submit']['#attributes']['class'] = 'node-add-to-cart';
    $form['submit']['#attributes']['xxx'] = 'xxx'; // we don't want  to clear existing values.
  }
};

ただし、この実装でさえも必要ありません。ボタンにクラスを追加するだけの場合は、トリッキーなネストでデフォルトクラスを使用できます。

3番目のコメントの後に更新:これを試してください:

function uc_button_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['nid']['#value']) && $form_id == 'edit-submit-' . $form['nid']['#value']) {
    $form['submit']['#attributes']['class'] = 'node-add-to-cart';
    $form['submit']['#attributes']['xxx'] = 'xxx'; // we don't want  to clear existing values.
  }
};
1
AyeshK