3

パネル選択ルールの ctools アクセス チェックを作成したいと考えています。私がやりたいのは、コンテンツ タイプのフィールド値をチェックすることです。フィールドの名前は field_layout で、オプションは 3、2、1 です。

アクセス チェックと設定を作成したところ、ルールが選択ルール オプションに表示されています。問題なく追加でき、思い通りに設定できます。

私が持っている唯一の問題は、ルールが有効にならないことです... :-/

私が使用するコードは次のとおりです。

<?php

/**
 * Plugins are described by creating a $plugin array which will
 * be used by the system that includes the file.
 */
$plugin = array(
    'title' => t('Node: field layout'),
    'description' => t('Controls access by field_layout'),
    'callback' => 'he_layout_field_layout_ctools_access_check',
    'settings form' => 'he_layout_field_layout_ctools_settings',
);

/**
 * Custom callback defined by 'callback' in the $plugin array.
 *
 * Check for access.
 */
function he_layout_field_layout_ctools_access_check($conf, $context) {
    // If for some unknown reason that $context isn't set, we just want to be sure.
    if (empty($context) || empty($context->data) || empty($context->data->field_layout)) {
        return FALSE;
    }

    // If the layout set in the panels visibility rule settings is different from the field_layout
    // access to the pane is denied.
    $layout = $context->data->field_layout;
    if ($layout !== $conf['field_layout'][$context->data->field_layout[field_language('node', $context->data, 'field_layout')][0]['value']]) {
        return FALSE;
    }
    return TRUE;
}

/**
 * Settings form for the 'field_layout' access plugin.
 */
function he_layout_field_layout_ctools_settings($form, &$form_state, $conf) {
    $form['settings']['field_layout'] = array(
        '#type' => 'radios',
        '#title' => t('Layout'),
         '#options' => array(
            0 => '3',
            1 => '2',
            2 => '1',
        ),
        '#default_value' => $conf['field_layout'],
    );
    return $form;
}

コードは次のチュートリアルに基づいています: http://ramlev.dk/blog/2012/03/30/create-a-ctools-access-plugin/

誰かがなぜこれがうまくいかないのか考えましたか?

4

1 に答える 1

1

@Bastiのコメントは正しいです。あと1ステップアップします。

$plugin = array(
    'title' => t('Node: field layout'),
    'description' => t('Controls access by field_layout'),
    'callback' => 'he_layout_field_layout_ctools_access_check',
    'settings form' => 'he_layout_field_layout_ctools_settings',
    // 'required context' => new ctools_context_required(t('Node'), 'node'),
);

プラグインのコンテキストが必要ない場合は問題ありません。しかし、$contextアクセスチェックの引数は、あなたが言及したコンテキストを正確に受け取ります。つまり、 no を指定すると常に null になりますrequired context

このようにfalseして、最初のチェックで常に次のことを行います。if (empty($context)

于 2014-06-01T14:59:47.947 に答える