web-dev-qa-db-ja.com

コマースフック機能からチェックアウトボタン

私はDrupal Commerceの初心者です。基本的なカートシステムは正常に機能していますが、カスタムコードを取得する必要があります。コードが少し複雑すぎる。

チェックアウトボタンのあるショッピングカートページがあります。そのCheckoutボタンに接続したいと思います。

そのボタンがクリックされたときに実行されるphp関数(すでに持っているもの)を追加する必要がありますが、チェックアウトページがレンダリングされる前に。

そして、チェックアウトボタンが実行するデフォルトのアクションを無効にすることなく、これを実行する必要があります。

SO:デフォルトの動作を無効にせずにこのボタンにフックするにはどうすればよいですか?

私の初心者のため、できる限り完全な例を示したいと思います。私は怠惰ではありません、答えが「速記」である場合、私が必要なすべてをキャッチすることを当然のことと考えることはできません。

TIA、

--- JC

1
jchwebdev

チェックアウトフォームは他のフォームと同じなので、( hook_form_alter() を使用して)変更し、送信ハンドラを追加できます。

_function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'views_form_commerce_cart_form_default') {
    $form['#submit'][] = 'MYMODULE_some_function';
  }
}

function MYMODULE_some_function($form, &$form_state) {
  drupal_set_message('This was run after the cart form was submitted, before the checkout page was rendered.');
}
_

コメントへの対応...

カスタムのショッピングカートフォームがあり、送信ボタンの代わりにリンクがあるため、追加の処理は行われないため、リンクされたページ(/ checkout /%)のページビルドにフックして、そこで操作を実行できます。同じ効果があります。

あなたがこれを行うことができるいくつかの場所があります(どちらも実際には他よりも「より良い」ではありません) hook_page_alter() および hook_init() 。他の場所(テーマの前処理関数)もありますが、ロジックを処理するには、少し前のほうがおそらくより適切です。基本的な例(おそらく、ニーズに合わせて調整する必要があります):

_function MYMODULE_init() {
  if (arg(0) == 'checkout' && $some_other_pertinent_condition) {
    // Do some processing.
  }
}
_

コマースを学ぶことに関しては-それはトリッキーなことです。 CommerceはDrupalと密接に統合されており、他のモジュールと同じように、その機能/フック/統合の多くを使用します。そのため、Drupalのワークフローを知ってから、Commerceのワークフローを上に重ねる必要があります。私ができる最善のアドバイスは、Drupal本( Pro Drupal開発 は素晴らしいです)を入手することです。ワークフローに満足している場合は、Drupal Commerceサポートページにアクセスして、読んで、読んで、読んでください。

Drupalの学習曲線は非常に急であり、全体としてどのように機能するかを理解するための近道はありません。 Drupalは素晴らしいです。それだけの価値はあります。

2
Clive

うわぁ。私の知る限り、チェックアウトボタンをクリックするための直接のフックはありません。 Drupal Commerceチェックアウトモジュール ここにあります に提供されるフック、一般的なフックリスト ここ があり、実際のチェックアウトフォーム出力は生成された here これはオーバーライドできます。

これはトリッキーなリクエストで、私は途方に暮れています。 私が設定したテストサイト は、チェックアウトボタンをフォームに表示しません。これは単なるリンクです。そのため、hook_form_alter()を使用することはできません。

これを追いかけるための私の考えは次のとおりです。

  • いくつかのカスタムJSを追加し、次のページの条件を開始するボタンクリックでajax呼び出しを行います
  • 前のページをセッション変数に記録し始め、チェックアウトページにアクセスしたときに比較を行います。チェックアウトボタンのあるページからアクセスした場合は、アクションを実行します。 (適応できる可能性があります 前のページ 使用)
  • ルールを使用して、チェックアウトページの パス条件 で「商品が表示されました」アクションをトリガーします
  • checkout_page_info_alter 関数にフックして、正しいページにいるかどうかを判断します
  • 実際のチェックアウトページに到達する前に、ユーザーをある種のステージングページにリダイレクトします-カートページを任意の選択ページに変更し、データを収集し、?destinationパラメータをURLに追加して、新しい情報でロールスルーします。

私は途方に暮れています。これは実際の答えではないので、詳細を説明せずにこれを実行する方法の優れた例を示すことはできません。私はあなたのためにコマースフックを理解しました:

hook_commerce_cart_order_is_cart_alterYOURTHEME_commerce_cart_order_is_cart_alterになります

笑。もっと役に立たなくてすみません...頑張ってください。

1
emc