1

他のアクションで使用する置換パターンとして値を正常に保存するカスタム Rule-Action を作成するにはどうすればよいですか?

ここでは、Product-Order から Product-Display 情報を取得する際に非常に役立ちました。

私が言ったように、リンクされた回答は大いに役立ちましたが、Product-Display の返されたパス データはhttp://www.mysite/node/77形式で返されます。ただし、実際には数値のみが必要なので、Fetch entity by idアクションを実行して数値を指定し、Product-Display ノードなどを公開することでノードをロードできます。

そこで、Product-Display URL(node/77) を取得して 77 を返すカスタム アクションを実装しました。Fetch エンティティを IDコードでコピーして変更し、返された数値を保存して他のアクションで使用できるようにしました。コードは以下のとおりです。

function my_custom_action_info(){
   $actions['publish_product_display_node'] = array(
      'label' => t('Fetch product-display id'),
      'parameter' => array(
        'type' => array(
          'type' => 'uri',
          'label' => t('My Action'),
          'options list' => 'rules_entity_action_type_options2',
          'description' => t('Specifies the product-display url.'),
        ),
      ),
      'provides' => array(
        'entity_fetched' => array('type' => 'integer', 'label' => t('Fetched entity')),
      ),
      'group' => t('Entities'),
      'access callback' => 'rules_entity_action_access',
    );

    return $actions;
}

function publish_product_display_node($path = null){
    $parts = explode('node/', $path);
    return $parts[1];
}

function rules_entity_action_type_options2($element, $name = NULL) {
  // We allow calling this function with just the element name too. That way
  // we ease manual re-use.
  $name = is_object($element) ? $element->getElementName() : $element;
  return ($name == 'entity_create') ? rules_entity_type_options2('create') : rules_entity_type_options2();
}

function rules_entity_type_options2($key = NULL) {
  $info = entity_get_info();
  $types = array();
  foreach ($info as $type => $entity_info) {
    if (empty($entity_info['configuration']) && empty($entity_info['exportable'])) {
      if (!isset($key) || entity_type_supports($type, $key)) {
        $types[$type] = $entity_info['label'];
      }
    }
  }
  return $types;
}

function rules_action_entity_createfetch_access2(RulesAbstractPlugin $element) {
  $op = $element->getElementName() == 'entity_create' ? 'create' : 'view';
  return entity_access($op, $element->settings['type']);
}

私が言ったように、変更したコードをコピーしたので、publish_product_display_node以外のすべての機能を完全に理解しているとは言えません。

私のコード変更は、Product-Display URL トークンを引数として設定し、エンティティ変数ラベル (Display NID) と値 (display_nid) を設定する限り機能します。問題は、新しく作成されたアクションでdisplay_nidをチェックすると、値が空になることです。

次のアクションで使用できるように、エンティティ値を正常に保存する方法を理解するのに助けが必要です。

4

1 に答える 1

0

関数では、代わりに をpublish_product_display_node返す必要がないことを確認できますか?$parts[0]$[parts[1]

Drupal のパスは「node/7」または「taxonomy/term/6」の形式であることが多く、「node/」を区切り記号として展開すると、index で始まる単一の値しか得られないだけです。ノードの場合は 0...

それで、それがあなたの問題を解決するかどうか疑問に思っています...

于 2013-07-30T21:28:42.933 に答える