$group = reset($groups);
         add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_HOST_GROUP, $group['groupid'], $group['name'], 'groups', array('name' => $old_group['name']), array('name' => $group['name']));
     }
     $msg_ok = S_GROUP_UPDATED;
     $msg_fail = S_CANNOT_UPDATE_GROUP;
 } else {
     if (!count(get_accessible_nodes_by_user($USER_DETAILS, PERM_READ_WRITE, PERM_RES_IDS_ARRAY))) {
         access_deny();
     }
     DBstart();
     $result = CHostgroup::create(array('name' => $_REQUEST['gname']));
     if ($result) {
         $options = array('groupids' => $result['groupids'], 'output' => API_OUTPUT_EXTEND);
         $groups = CHostGroup::get($options);
         $data = array('hosts' => $hosts, 'templates' => $templates, 'groups' => $groups);
         $result = CHostGroup::massAdd($data);
         if ($result) {
             $group = reset($groups);
             add_audit_ext(AUDIT_ACTION_ADD, AUDIT_RESOURCE_HOST_GROUP, $group['groupid'], $group['name'], null, null, null);
         }
     }
     if ($result === false) {
         error(CHostGroup::resetErrors());
     }
     $result = $result ? true : false;
     $result = DBend($result);
     $msg_ok = S_GROUP_ADDED;
     $msg_fail = S_CANNOT_ADD_GROUP;
 }
 show_messages($result, $msg_ok, $msg_fail);
 if ($result) {
 /**
  * Add Hosts to HostGroups. All Hosts are added to all HostGroups.
  *
  * @param array $data
  * @param array $data['groups']
  * @param array $data['templates']
  * @param array $data['macros']
  * @return array
  */
 public static function massAdd($data)
 {
     $data['hosts'] = zbx_toArray($data['hosts']);
     try {
         self::BeginTransaction(__METHOD__);
         $options = array('hostids' => zbx_objectValues($data['hosts'], 'hostid'), 'editable' => 1, 'preservekeys' => 1);
         $upd_hosts = self::get($options);
         foreach ($data['hosts'] as $hnum => $host) {
             if (!isset($upd_hosts[$host['hostid']])) {
                 self::exception(ZBX_API_ERROR_PERMISSIONS, 'You do not have enough rights for operation');
             }
         }
         if (isset($data['groups']) && !empty($data['groups'])) {
             $options = array('groups' => zbx_toArray($data['groups']), 'hosts' => $data['hosts']);
             $result = CHostGroup::massAdd($options);
             if (!$result) {
                 self::exception();
             }
         }
         if (isset($data['templates']) && !empty($data['templates'])) {
             $options = array('hosts' => $data['hosts'], 'templates' => zbx_toArray($data['templates']));
             $result = CTemplate::massAdd($options);
             if (!$result) {
                 self::exception();
             }
         }
         if (isset($data['macros']) && !empty($data['macros'])) {
             $options = array('hosts' => $data['hosts'], 'macros' => $data['macros']);
             $result = CUserMacro::massAdd($options);
             if (!$result) {
                 self::exception();
             }
         }
         self::EndTransaction(true, __METHOD__);
         return array('hostids' => zbx_objectValues($data['hosts'], 'hostid'));
     } catch (APIException $e) {
         self::EndTransaction(false, __METHOD__);
         $error = $e->getErrors();
         $error = reset($error);
         self::setError(__METHOD__, $e->getCode(), $error);
         return false;
     }
 }
 /**
  * Link Template to Hosts
  *
  * @param array $data
  * @param string $data['templates']
  * @param string $data['hosts']
  * @param string $data['groups']
  * @param string $data['templates_link']
  * @return boolean
  */
 public static function massAdd($data)
 {
     $templates = isset($data['templates']) ? zbx_toArray($data['templates']) : null;
     $templateids = is_null($templates) ? array() : zbx_objectValues($templates, 'templateid');
     try {
         self::BeginTransaction(__METHOD__);
         $upd_templates = self::get(array('templateids' => $templateids, 'editable' => 1, 'preservekeys' => 1));
         foreach ($templates as $tnum => $template) {
             if (!isset($upd_templates[$template['templateid']])) {
                 self::exception(ZBX_API_ERROR_PERMISSIONS, S_NO_PERMISSION);
             }
         }
         if (isset($data['groups']) && !empty($data['groups'])) {
             $options = array('groups' => $data['groups'], 'templates' => $templates);
             $result = CHostGroup::massAdd($options);
             if (!$result) {
                 self::exception(ZBX_API_ERROR_PARAMETERS, 'Can\'t link groups');
             }
         }
         if (isset($data['hosts']) && !empty($data['hosts'])) {
             $hostids = zbx_objectValues($data['hosts'], 'hostid');
             self::link($templateids, $hostids);
         }
         if (isset($data['templates_link']) && !empty($data['templates_link'])) {
             $templates_linkids = zbx_objectValues($data['templates_link'], 'templateid');
             self::link($templates_linkids, $templateids);
         }
         if (isset($data['macros']) && !empty($data['macros'])) {
             $options = array('templates' => zbx_toArray($data['templates']), 'macros' => $data['macros']);
             $result = CUserMacro::massAdd($options);
             if (!$result) {
                 self::exception(ZBX_API_ERROR_PARAMETERS, 'Can\'t link macros');
             }
         }
         $result = self::EndTransaction(true, __METHOD__);
         return array('templateids' => zbx_objectValues($data['templates'], 'templateid'));
     } catch (APIException $e) {
         self::EndTransaction(false, __METHOD__);
         $error = $e->getErrors();
         $error = reset($error);
         self::setError(__METHOD__, $e->getCode(), $error);
         return false;
     }
 }