Build dashboard widgets with class registration, 3-column width rules, and panel-based management.
show_dashboard_widget("template.tpl") を使う実装を行うTemplates/*.tpl を用意する。assign を行い、最後に show_dashboard_widget("xxx.tpl") を呼ぶ。panel の Dashboard管理から class_name / function_name / column_width を登録する。sort で制御し、必要なら並び替えを使う。app_call で Dashboard表示を確認する。更新系を含む場合は data_get / data_list で反映確認する。function_name は原則 dashboard を使う。column_width の目安:
12: 通常サイズのチャート3: 横幅を使うワイド表示show_dashboard_widget() は各ウィジェット関数で必ず1回以上呼ぶ。column_width(1/2/3)を使う。関数側で幅を固定しない。class_name は ^[A-Za-z][A-Za-z0-9_-]*$、function_name は ^[A-Za-z][A-Za-z0-9_]*$ を守る。dashboard/page をウィジェット登録しない(再帰防止)。/common/menu.tpl は使わない。メニュー追加は DB追加 / Dashboard登録 / 設定の「ホームページを表示」で行う。fields_form_original / fields_form_direct / fields_view_direct)。show_multi_dialog() を基準にし、固定操作は fixed_bar_template に分離する。res_error_message() を返して即 return し、show_multi_dialog() 再実行や reload_area() で再描画しない。res_error_message() を使う場合、表示先タグ(error_項目名)が存在することを事前確認する。表示タグを設置できない導線(フォーム未描画前・一覧ボタン直叩き等)では show_notification_text() を使う。current + next_width <= 3 なら同一行、超える場合は改行。1,2 は同一行。1,3 は 1 の次に改行して 3。create_chart() と chart_draw() を使う。canvas id は重複を避けるため毎回一意にする(例: random_alphabet() を利用)。function dashboard(Controller $ctl) {
$canvas_id = "dashboard_chart_" . $ctl->random_alphabet(10);
$chart = $ctl->create_chart();
$chart->set_type("bar");
$chart->set_labels(["Jan", "Feb", "Mar"]);
$dataset = $chart->create_Dataset_Bar();
$dataset->set_label("Orders");
$dataset->set_data([12, 19, 9]);
$chart->add_dataset($dataset);
$ctl->chart_draw($canvas_id, $chart);
$ctl->assign("canvas_id", $canvas_id);
$ctl->show_dashboard_widget("sample.tpl");
}
column_width = 1, 2, 3 の3件で検証する。1 + 23php fbp/cli.php data_list --json='{"table":"dashboard","max":100}'invoke-function だけに依存せず、<button class="ajax-link" data-class="WidgetClass" data-function="func"> を優先する。dashboard クラスになるケースがあり、invoke-function だけだと意図したウィジェット関数が呼ばれないことがある。fields_view_direct の file 表示は download-link に data-class/data-function=download_file を付けて呼ぶため、表示元クラスに download_file(Controller $ctl) 実装が必要。path を decrypt し、is_saved_file で検証後に res_saved_file を返す。<img> 表示する場合:
public_media をテンプレートから直接呼ばず、表示元クラスに view_image(Controller $ctl) を実装してそこを通す。view_image() では is_saved_file() で検証後に res_saved_image() を返し、ダウンロードは download_file() で res_saved_file() を返す。max-width:500px; を付け、縦サイズは固定しない。