web-dev-qa-db-ja.com

チャートモジュールのビューの統合のみを使用して特定のチャートのプロパティを設定する方法

charts モジュールと Views モジュールとの統合を使用してグラフを作成しています。

一部のグラフのみにオプションを設定したいのですが、charts.api.phpでそれを見つけました。

_/**
 * Alter an individual chart before it is printed.
 *
 * @param $chart
 *   The chart renderable. Passed in by reference.
 * @param $chart_id
 *   The chart identifier, pulled from the $chart['#chart_id'] property (if
 *   any). Not all charts have a chart identifier.
 */
function hook_chart_alter(&$chart, $chart_id) {
  if ($chart_id === 'view_name__display_name') {
    // Individual properties may be modified.
    $chart['#title_font_size'] = 20;
  }
}
_

特定のビューのif ($chart_id === 'view_name__display_name') {行があるので、私が望むものに最適のようですが、ここに(charts.api.phpに)_$chart['#title_font_size'] = 10;_などの設定コードを直接追加するか、またはこれを行う他の方法はありますか?

chartsモジュール内のcharts.api.phpをオーバーライドしても問題ないか、またはこれらのコードを他の場所で記述して実行する必要がありますか?

[〜#〜]編集[〜#〜]

Roobyのコメントに基づいて、これらは(viewsモジュールで作成された)各グラフのプロパティを設定しようとした2つの方法です:

1.カスタムモジュール

benimというカスタムモジュールを作成しました。

これは、benim.infoファイルです。

_name = Benim
description = Override charts properties.
package = Other
core = 7.x
_

そして、これはbenim.moduleファイルです:

_<?php

function benim_hook_chart_alter(&$chart, $chart_id) {
  if ($chart_id === 'chartim__block_1') {
    // Individual properties may be modified.
    $chart['#title_font_size'] = 50;
    $chart['subtitle'] = array(
    '#text' => 'Source:',
    );
    $chart['xaxis'] = array(
    '#type' => 'chart_xaxis',
    '#allowDecimals' => 'true',

    );

  }
}



function benim_hook_chart_definition_alter(&$definition, $chart, $chart_id) {
  if ($chart['#chart_library'] === 'highcharts') {
  if ($chart_id === 'chartim__block_1') {
    $definition['title']['style']['fontSize'] = 100;
  }
}
}
_

2. Template.php

以下の行をテーマのtemplate.phpに追加しました。

_function mytheme_hook_chart_alter(&$chart, $chart_id) {
  if ($chart_id === 'chartim__page') {
    // Individual properties may be modified.
    $chart['#title_font_size'] = 150;
    $chart['subtitle'] = array(
    '#text' => 'Source:',
    );
    $chart['xaxis'] = array(
    '#type' => 'chart_xaxis',
    '#allowDecimals' => 'false',

    );

    $chart['yaxis'] = array(
    '#type' => 'chart_yaxis',
    '#allowDecimals' => 'false',

    );

  }
}

function mytheme_hook_chart_definition_alter(&$definition, $chart, $chart_id) {
  if ($chart['#chart_library'] === 'highcharts') {
  if ($chart_id === 'chartim__page') {
    $definition['title']['style']['fontSize'] = 100;
  }
}
}
_

(mythemeの上は実際のテーマの名前です)

残念ながら、どちらの方法でもうまくいきませんでした。 $ chart_idパラメータが正しく、さまざまなビューをチェックしたかどうか疑問に思いましたが、結果は変わりませんでした。

:キャッシュをクリアして、別のテーマを試してみました。

4
herci

いいえ、chartsモジュールではなく、独自のカスタムモジュールです。

drupalフックをテーマのtemplate.phpファイルから変更することも可能ですが、テーマに何を入れるか注意する必要があります。ビジュアルに関連するコードのみをテーマに入れる必要があります、より機能的なコードを実行している場合は、モジュール内に配置する必要があります。

大まかな目安としては、テーマを変更した場合にその機能を維持するかどうかです。それを維持したい場合は、それが機能的であり、視覚的ではなく、モジュール内にある必要があることを示す可能性のある指標です。

.api.phpファイルは、モジュールが他のユーザーが利用できるようにする関数とフックに関する情報を開発者に提供するファイルです。

それは基本的には単なるドキュメントなので、編集しても何も起こりません(ただし、そのドキュメントを間違ったものにすることを除いて、他の誰かがそれを使用したい場合は悪いことです)。

モジュール自体を変更するのが一般に良い考えではないいくつかの理由は なぜコアをハックしないのですか? (それはdrupalコアについて話している) drupalフックがある主な理由の1つは、変更を加える場合に元のモジュールを変更する必要がないためです。

だから、あなたは カスタムdrupal module を作成し、そのモジュールに次のようなフックを実装します(MODULENAMEをモジュールの名前に変更し、チャートIDを特定のチャートのID):

/**
 * Alter an individual chart before it is printed.
 *
 * @param $chart
 *   The chart renderable. Passed in by reference.
 * @param $chart_id
 *   The chart identifier, pulled from the $chart['#chart_id'] property (if
 *   any). Not all charts have a chart identifier.
 */
function MODULENAME_chart_alter(&$chart, $chart_id) {
  if ($chart_id === 'view_name__display_name') {
    // Individual properties may be modified.
    $chart['#title_font_size'] = 20;
  }
}

Drupal.org docs以外にも、他にも多くのdrupalモジュール開発リソースがあります。手頃な価格の教科書や有料トレーニングタイプのウェブサイトがいくつかあります。インターネット。

定義変更フックを使用するより機能的な例を次に示します。

/**
 * Alter an individual chart's raw library representation.
 *
 * This hook is called AFTER hook_chart_alter(), after Charts module has
 * converted the renderable into the chart definition that will be used by the
 * library. Note that the structure of $definition will differ based on the
 * charting library used. Switching charting libraries may cause your code
 * to break when using this hook.
 *
 * Even though this hook may be fragile, it may provide developers with access
 * to library-specific functionality.
 *
 * @param $definition
 *   The chart definition to be modified. The raw values are passed directly to
 *   the charting library.
 * @param $chart
 *   The chart renderable. This may be used for reference (or read to add
 *   support for new properties), but any changes to this variable will not
 *   have an effect on output.
 * @param $chart_id
 *   The chart ID, derived from the $chart['#chart_id'] property. Note that not
 *   all charts may have a $chart_id.
 */
function THEMENAME_chart_definition_alter(&$definition, $chart, $chart_id) {
  // For the portfolio charts.
  if ($chart_id == 'MY_CHART_ID') {
    $definition['legend']['borderRadius'] = 0;
    $definition['legend']['borderColor'] = NULL;
    $definition['legend']['style']['fontFamily'] = 'Helvetica,Arial,"Nimbus Sans L",sans-serif';
    $definition['legend']['backgroundColor'] = 'transparent';
    $definition['legend']['layout'] = 'vertical';
    $definition['legend']['verticalAlign'] = 'top';
    $definition['legend']['padding'] = 0;
    $definition['legend']['margin'] = 0;
    $definition['legend']['itemStyle']['color'] = '#555555';
    $definition['legend']['itemStyle']['fontSize'] = '12px';
  }
}
2
rooby

興味深い質問と、さらに興味深い答え(ルービーから...もう一度!ありがとうございます!)。

ただ気をつけて、この答えを取るために、おそらくさらに少しステップを踏んでください):チェックアウトしたい場合があります issue#2347721 、タイトルが 'チャートにビュー情報を渡す(さらなる処理のため) '、私は最近、最新のDEVバージョンにコミットしました。これで、グラフの作成時に実際に処理しているビュー/ディスプレイもわかりました。課題(Roobyの場合?):これの適切な使用例を示す別のサンプル(バリエーション)を作成しますか?

開示:私はチャートモジュールの共同メンテナです。

1
Pierre.Vriens