abstract class CGraphGeneral extends CApiService {
public const ACCESS_RULES = [
'get' => ['min_user_type' => USER_TYPE_ZABBIX_USER],
'create' => ['min_user_type' => USER_TYPE_ZABBIX_ADMIN],
'update' => ['min_user_type' => USER_TYPE_ZABBIX_ADMIN],
'delete' => ['min_user_type' => USER_TYPE_ZABBIX_ADMIN]
protected const FLAGS = null;
const ERROR_TEMPLATE_HOST_MIX = 'templateHostMix';
const ERROR_MISSING_GRAPH_NAME = 'missingGraphName';
const ERROR_MISSING_GRAPH_ITEMS = 'missingGraphItems';
const ERROR_MISSING_REQUIRED_VALUE = 'missingRequiredValue';
const ERROR_GRAPH_SUM = 'graphSum';
public function update(array $graphs) {
$graphs = zbx_toArray($graphs);
$graphids = array_column($graphs, 'graphid');
$graphs = $this->extendObjects($this->tableName(), $graphs,
['name', 'graphtype', 'ymin_type', 'ymin_itemid', 'ymax_type', 'ymax_itemid', 'yaxismin', 'yaxismax']
$db_graphs = $this->get([
'output' => API_OUTPUT_EXTEND,
'selectGraphItems' => ['gitemid', 'itemid', 'drawtype', 'sortorder', 'color', 'yaxisside', 'calc_fnc',
$updateDiscoveredValidator = new CUpdateDiscoveredValidator([
'messageAllowed' => _('Cannot update a discovered graph.')
foreach ($db_graphs as &$db_graph) {
$db_graph['gitems'] = array_column($db_graph['gitems'], null, 'gitemid');
foreach ($graphs as $key => &$graph) {
if (!array_key_exists($graph['graphid'], $db_graphs)) {
self::exception(ZBX_API_ERROR_PARAMETERS, _('No permissions to referred object or it does not exist!'));
if ($db_graphs[$graph['graphid']]['templateid'] != 0
&& $db_graphs[$graph['graphid']]['flags'] == ZBX_FLAG_DISCOVERY_NORMAL) {
self::exception(ZBX_API_ERROR_PARAMETERS, _s('Cannot update a templated graph "%1$s".',
$this->checkPartialValidator($graph, $updateDiscoveredValidator, $db_graphs[$graph['graphid']]);
if ($db_graphs[$graph['graphid']]['templateid'] != 0) {
if ($db_graphs[$graph['graphid']]['flags'] == ZBX_FLAG_DISCOVERY_PROTOTYPE
&& array_key_exists('discover', $graph)) {
$graph = ['discover' => $graph['discover']] + $db_graphs[$graph['graphid']];