yf_dashboards classDashboards for user.
| File | plugins/common/classes/common/yf_dashboards.class.php |
|---|---|
| Use | _class('dashboards', 'classes/common/') |
A site sets them in its config with $PROJECT_CONF['dashboards']['NAME'] = ...;
| Property | Default | Description |
|---|---|---|
$_auto_info |
null |
|
$_avail_widgets |
null |
|
$_dashboard_data |
null |
|
$_name |
null |
public function display($params = [])
Designed to be used by other modules to show configured dashboard.
public function display($params = [])
{
$name = null;
if (is_string($params)) {
$name = $params;
}
if ( ! is_array($params)) {
$params = [];
}
if ( ! $params['name'] && $name) {
$params['name'] = $name;
}
if ( ! $params['name']) {
return _e('Empty dashboard name');
}
$this->_name = $params['name'];
return $this->view($params);
}
public function view($params = [])
Similar to 'display', but for usage inside this module (action links and more).
public function view($params = [])
{
if ( ! is_array($params)) {
$params = [];
}
$ds_name = isset($params['name']) ? $params['name'] : ($this->_name ? $this->_name : ($_GET['id'] ?? null));
$ds = $this->_get_dashboard_data($ds_name);
if ( ! $ds['id']) {
return _e('No such record');
}
$items_configs = $ds['data']['items_configs'];
$ds_settings = $ds['data']['settings'];
$num_columns = isset($this->_col_classes[$ds_settings['columns']]) ? $ds_settings['columns'] : 3;
if ($ds_settings['full_width']) {
$filled_columns = 0;
foreach ((array) $ds['data']['columns'] as $column_id => $column_items) {
$empty_items = true;
foreach ((array) $column_items as $name_id) {
if ($name_id) {
$empty_items = false;
break;
}
}
if ( ! $empty_items) {
$filled_columns++;
}
}
$num_columns = $filled_columns;
}
$columns = null;
foreach ((array) $ds['data']['columns'] as $column_id => $column_items) {
$css_class_override = '';
// find grid classes inside items
foreach ((array) $column_items as $item_id) {
$item_config = $items_configs[$item_id . '_' . $item_id];
if ($item_config['grid_class']) {
$css_class_override = $item_config['grid_class'];
}
}
$columns[$column_id] = [
'num' => $column_id,
'class' => $css_class_override ?: $this->_col_classes[$num_columns],
'items' => $this->_view_widget_items($column_items, $items_configs),
];
}
$replace = [
'columns' => $columns,
];
return tpl()->parse(__CLASS__ . '/view_main', $replace);
}
_ hooks and helpers; not routable as page actionspublic function _get_available_widgets_hooks()
public function _get_available_widgets_hooks()
{
if (isset($this->_avail_widgets)) {
return $this->_avail_widgets;
}
$method_prefix = '_hook_widget_';
$r = [
'_hook_widget__' => '',
'_' => '',
':' => '',
];
$_widgets = [];
foreach ((array) _class('user_modules', 'admin_modules/')->_get_methods(['private' => '1']) as $module_name => $module_methods) {
foreach ((array) $module_methods as $method_name) {
if (substr($method_name, 0, strlen($method_prefix)) != $method_prefix) {
continue;
}
$full_name = $module_name . '::' . $method_name;
$_widgets[$module_name][$method_name] = $full_name;
}
}
$widgets = [];
foreach ((array) $_widgets as $module_name => $module_widgets) {
foreach ((array) $module_widgets as $method_name => $full_name) {
$auto_id = str_replace(array_keys($r), array_values($r), $full_name);
$widgets[$auto_id] = module_safe($module_name)->$method_name(['describe_self' => true]);
if ( ! $widgets[$auto_id]['name']) {
unset($widgets[$auto_id]);
continue;
$widgets[$auto_id]['name'] = str_replace('_', ' ', substr($method_name, strlen($method_prefix)));
}
if ( ! $widgets[$auto_id]['desc']) {
$widgets[$auto_id]['name'] = 'TODO: ' . str_replace('_', ' ', substr($method_name, strlen($method_prefix)));
}
$widgets[$auto_id]['full_name'] = $full_name;
$widgets[$auto_id]['auto_id'] = $auto_id;
}
}
if (is_array($widgets)) {
ksort($widgets);
}
$this->_avail_widgets = $widgets;
return $widgets;
}
public function _get_dashboard_data($id = '')
public function _get_dashboard_data($id = '')
{
$params = null;
if ( ! $id) {
$id = $this->_name ? $this->_name : $_GET['id'];
}
if ( ! $id) {
return false;
}
if (isset($this->_dashboard_data[$id])) {
return $this->_dashboard_data[$id];
}
$ds = db()->get('SELECT * FROM ' . db('dashboards') . ' WHERE name="' . db()->es($id) . '" OR id=' . (int) $id);
if ($ds) {
$ds['data'] = object_to_array(json_decode($ds['data']));
}
$this->_dashboard_data[$id] = $ds;
return $ds;
}
public function _init()
public function _init()
{
$this->_auto_info['php_item'] = [
'id' => 'php_item',
'name' => 'CLONEABLE: php item name',
'desc' => 'CLONEABLE: php item desc',
'configurable' => [],
'cloneable' => 1,
'auto_type' => 'php_item',
];
$this->_auto_info['block_item'] = [
'id' => 'php_item',
'name' => 'CLONEABLE: block item name',
'desc' => 'CLONEABLE: block item desc',
'configurable' => [],
'cloneable' => 1,
'auto_type' => 'block_item',
];
$this->_auto_info['stpl_item'] = [
'id' => 'stpl_item',
'name' => 'CLONEABLE: stpl item name',
'desc' => 'CLONEABLE: stpl item desc',
'configurable' => [],
'cloneable' => 1,
'auto_type' => 'stpl_item',
];
}
public function _view_widget_items($name_ids = [], $items_configs = [])
public function _view_widget_items($name_ids = [], $items_configs = [])
{
$list_of_hooks = $this->_get_available_widgets_hooks();
$_orig_object = ($_GET['object'] ?? null);
$_orig_action = ($_GET['action'] ?? null);
$items = [];
foreach ((array) $name_ids as $name_id) {
$saved_config = $items_configs[$name_id . '_' . $name_id];
$info = $list_of_hooks[$name_id];
$is_cloneable_item = (substr($name_id, 0, strlen('autoid')) == 'autoid');
if ($is_cloneable_item) {
$auto_type = $saved_config['auto_type'];
$info = $this->_auto_info[$auto_type];
// Merge default settings with saved override
foreach ((array) $saved_config as $k => $v) {
if (strlen($v)) {
$info[$k] = $v;
}
}
$info['auto_id'] = $name_id;
$info['auto_type'] = $auto_type;
}
if ( ! $info) {
continue;
}
$module_name = '';
$method_name = '';
$content = '';
if ($is_cloneable_item) {
if ($auto_type == 'php_item') {
if (strlen($info['code'])) {
// php_item code never ran: eval('<?php ...') is a ParseError since PHP 7, so it renders empty
$content = '';
} elseif ($info['method_name']) {
list($module_name, $method_name) = explode('.', $info['method_name']);
}
} elseif ($auto_type == 'block_item') {
$content = _class('core_blocks')->show_block(['block_id' => $info['block_name']]);
} elseif ($auto_type == 'stpl_item') {
if (strlen($info['code'])) {
$content = tpl()->parse_string($info['code']);
} elseif ($info['stpl_name']) {
$content = tpl()->parse($info['stpl_name']);
}
}
} else {
list($module_name, $method_name) = explode('::', $info['full_name']);
}
if ($module_name && $method_name) {
// This is needed to correctly execute widget (maybe not nicest method, I know...)
$_GET['object'] = $module_name;
$_GET['action'] = $method_name;
$module_obj = module_safe($module_name);
if (is_object($module_obj) && method_exists($module_obj, $method_name)) {
$content = $module_obj->$method_name($saved_config);
} else {
trigger_error(__CLASS__ . ': called module.method from widget not exists: ' . $module_name . '.' . $method_name . '', E_USER_WARNING);
}
$_GET['object'] = $_orig_object;
$_GET['action'] = $_orig_action;
}
$items[$info['auto_id']] = tpl()->parse(__CLASS__ . '/view_item', [
'id' => $info['auto_id'] . '_' . $info['auto_id'],
'name' => _prepare_html($info['name']),
'content' => $content,
'has_config' => $info['configurable'] ? 1 : 0,
'css_class' => $saved_config['color'],
'hide_header' => $saved_config['hide_header'],
'hide_border' => $saved_config['hide_border'],
]);
}
if ( ! $items) {
return '';
}
return implode(PHP_EOL, $items);
}