kin->options['extra']['slug'];
} else {
// Bulk installer contains less info, so fall back on the info registered here.
foreach ( $this->plugins as $slug => $plugin ) {
if ( ! empty( $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) && $plugin['name'] === $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) {
$desired_slug = $slug;
break;
}
}
unset( $slug, $plugin );
}
if ( ! empty( $desired_slug ) ) {
$subdir_name = untrailingslashit( str_replace( trailingslashit( $remote_source ), '', $source ) );
if ( ! empty( $subdir_name ) && $subdir_name !== $desired_slug ) {
$from_path = untrailingslashit( $source );
$to_path = trailingslashit( $remote_source ) . $desired_slug;
if ( true === $GLOBALS['wp_filesystem']->move( $from_path, $to_path ) ) {
return trailingslashit( $to_path );
} else {
return new WP_Error( 'rename_failed', esc_html__( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.', 'tgmpa' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'tgmpa' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) );
}
} elseif ( empty( $subdir_name ) ) {
return new WP_Error( 'packaged_wrong', esc_html__( 'The remote plugin package consists of more than one file, but the files are not packaged in a folder.', 'tgmpa' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'tgmpa' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) );
}
}
return $source;
}
/**
* Activate a single plugin and send feedback about the result to the screen.
*
* @since 2.5.0
*
* @param string $file_path Path within wp-plugins/ to main plugin file.
* @param string $slug Plugin slug.
* @param bool $automatic Whether this is an automatic activation after an install. Defaults to false.
* This determines the styling of the output messages.
* @return bool False if an error was encountered, true otherwise.
*/
protected function activate_single_plugin( $file_path, $slug, $automatic = false ) {
if ( $this->can_plugin_activate( $slug ) ) {
$activate = activate_plugin( $file_path );
if ( is_wp_error( $activate ) ) {
echo '
';
return false; // End it here if there is an error with activation.
} else {
if ( ! $automatic ) {
// Make sure message doesn't display again if bulk activation is performed
// immediately after a single activation.
if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK.
echo '
';
}
}
} elseif ( $this->is_plugin_active( $slug ) ) {
// No simpler message format provided as this message should never be encountered
// on the plugin install page.
echo '
';
} elseif ( $this->does_plugin_require_update( $slug ) ) {
if ( ! $automatic ) {
// Make sure message doesn't display again if bulk activation is performed
// immediately after a single activation.
if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK.
echo '
',
$color,
$item['available_version']
);
}
if ( empty( $output ) ) {
return ' '; // Let's not break the table layout.
} else {
return implode( "\n", $output );
}
}
/**
* Sets default message within the plugins table if no plugins
* are left for interaction.
*
* Hides the menu item to prevent the user from clicking and
* getting a permissions error.
*
* @since 2.2.0
*/
public function no_items() {
echo esc_html__( 'No plugins to install, update or activate.', 'tgmpa' ) . ' ' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . '';
echo '';
}
/**
* Output all the column information within the table.
*
* @since 2.2.0
*
* @return array $columns The column names.
*/
public function get_columns() {
$columns = array(
'cb' => '',
'plugin' => __( 'Plugin', 'tgmpa' ),
'source' => __( 'Source', 'tgmpa' ),
'type' => __( 'Type', 'tgmpa' ),
);
if ( 'all' === $this->view_context || 'update' === $this->view_context ) {
$columns['version'] = __( 'Version', 'tgmpa' );
$columns['status'] = __( 'Status', 'tgmpa' );
}
return apply_filters( 'tgmpa_table_columns', $columns );
}
/**
* Get name of default primary column
*
* @since 2.5.0 / WP 4.3+ compatibility
* @access protected
*
* @return string
*/
protected function get_default_primary_column_name() {
return 'plugin';
}
/**
* Get the name of the primary column.
*
* @since 2.5.0 / WP 4.3+ compatibility
* @access protected
*
* @return string The name of the primary column.
*/
protected function get_primary_column_name() {
if ( method_exists( 'WP_List_Table', 'get_primary_column_name' ) ) {
return parent::get_primary_column_name();
} else {
return $this->get_default_primary_column_name();
}
}
/**
* Get the actions which are relevant for a specific plugin row.
*
* @since 2.5.0
*
* @param array $item Array of item data.
* @return array Array with relevant action links.
*/
protected function get_row_actions( $item ) {
$actions = array();
$action_links = array();
// Display the 'Install' action link if the plugin is not yet available.
if ( ! $this->tgmpa->is_plugin_installed( $item['slug'] ) ) {
/* translators: %2$s: plugin name in screen reader markup */
$actions['install'] = __( 'Install %2$s', 'tgmpa' );
} else {
// Display the 'Update' action link if an update is available and WP complies with plugin minimum.
if ( false !== $this->tgmpa->does_plugin_have_update( $item['slug'] ) && $this->tgmpa->can_plugin_update( $item['slug'] ) ) {
/* translators: %2$s: plugin name in screen reader markup */
$actions['update'] = __( 'Update %2$s', 'tgmpa' );
}
// Display the 'Activate' action link, but only if the plugin meets the minimum version.
if ( $this->tgmpa->can_plugin_activate( $item['slug'] ) ) {
/* translators: %2$s: plugin name in screen reader markup */
$actions['activate'] = __( 'Activate %2$s', 'tgmpa' );
}
}
// Create the actual links.
foreach ( $actions as $action => $text ) {
$nonce_url = wp_nonce_url(
add_query_arg(
array(
'plugin' => urlencode( $item['slug'] ),
'tgmpa-' . $action => $action . '-plugin',
),
$this->tgmpa->get_tgmpa_url()
),
'tgmpa-' . $action,
'tgmpa-nonce'
);
$action_links[ $action ] = sprintf(
'' . esc_html( $text ) . '', // $text contains the second placeholder.
esc_url( $nonce_url ),
'' . esc_html( $item['sanitized_plugin'] ) . ''
);
}
$prefix = ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN ) ? 'network_admin_' : '';
return apply_filters( "tgmpa_{$prefix}plugin_action_links", array_filter( $action_links ), $item['slug'], $item, $this->view_context );
}
/**
* Generates content for a single row of the table.
*
* @since 2.5.0
*
* @param object $item The current item.
*/
public function single_row( $item ) {
parent::single_row( $item );
/**
* Fires after each specific row in the TGMPA Plugins list table.
*
* The dynamic portion of the hook name, `$item['slug']`, refers to the slug
* for the plugin.
*
* @since 2.5.0
*/
do_action( "tgmpa_after_plugin_row_{$item['slug']}", $item['slug'], $item, $this->view_context );
}
/**
* Show the upgrade notice below a plugin row if there is one.
*
* @since 2.5.0
*
* @see /wp-admin/includes/update.php
*
* @param string $slug Plugin slug.
* @param array $item The information available in this table row.
* @return null Return early if upgrade notice is empty.
*/
public function wp_plugin_update_row( $slug, $item ) {
if ( empty( $item['upgrade_notice'] ) ) {
return;
}
echo '
',
esc_html__( 'Upgrade message from the plugin author:', 'tgmpa' ),
' ', wp_kses_data( $item['upgrade_notice'] ), '
';
}
/**
* Extra controls to be displayed between bulk actions and pagination.
*
* @since 2.5.0
*
* @param string $which 'top' or 'bottom' table navigation.
*/
public function extra_tablenav( $which ) {
if ( 'bottom' === $which ) {
$this->tgmpa->show_tgmpa_version();
}
}
/**
* Defines the bulk actions for handling registered plugins.
*
* @since 2.2.0
*
* @return array $actions The bulk actions for the plugin install table.
*/
public function get_bulk_actions() {
$actions = array();
if ( 'update' !== $this->view_context && 'activate' !== $this->view_context ) {
if ( current_user_can( 'install_plugins' ) ) {
$actions['tgmpa-bulk-install'] = __( 'Install', 'tgmpa' );
}
}
if ( 'install' !== $this->view_context ) {
if ( current_user_can( 'update_plugins' ) ) {
$actions['tgmpa-bulk-update'] = __( 'Update', 'tgmpa' );
}
if ( current_user_can( 'activate_plugins' ) ) {
$actions['tgmpa-bulk-activate'] = __( 'Activate', 'tgmpa' );
}
}
return $actions;
}
/**
* Processes bulk installation and activation actions.
*
* The bulk installation process looks for the $_POST information and passes that
* through if a user has to use WP_Filesystem to enter their credentials.
*
* @since 2.2.0
*/
public function process_bulk_actions() {
// Bulk installation process.
if ( 'tgmpa-bulk-install' === $this->current_action() || 'tgmpa-bulk-update' === $this->current_action() ) {
check_admin_referer( 'bulk-' . $this->_args['plural'] );
$install_type = 'install';
if ( 'tgmpa-bulk-update' === $this->current_action() ) {
$install_type = 'update';
}
$plugins_to_install = array();
// Did user actually select any plugins to install/update ?
if ( empty( $_POST['plugin'] ) ) {
if ( 'install' === $install_type ) {
$message = __( 'No plugins were selected to be installed. No action taken.', 'tgmpa' );
} else {
$message = __( 'No plugins were selected to be updated. No action taken.', 'tgmpa' );
}
echo '
', esc_html( $message ), '
';
return false;
}
if ( is_array( $_POST['plugin'] ) ) {
$plugins_to_install = (array) $_POST['plugin'];
} elseif ( is_string( $_POST['plugin'] ) ) {
// Received via Filesystem page - un-flatten array (WP bug #19643).
$plugins_to_install = explode( ',', $_POST['plugin'] );
}
// Sanitize the received input.
$plugins_to_install = array_map( 'urldecode', $plugins_to_install );
$plugins_to_install = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins_to_install );
// Validate the received input.
foreach ( $plugins_to_install as $key => $slug ) {
// Check if the plugin was registered with TGMPA and remove if not.
if ( ! isset( $this->tgmpa->plugins[ $slug ] ) ) {
unset( $plugins_to_install[ $key ] );
continue;
}
// For install: make sure this is a plugin we *can* install and not one already installed.
if ( 'install' === $install_type && true === $this->tgmpa->is_plugin_installed( $slug ) ) {
unset( $plugins_to_install[ $key ] );
}
// For updates: make sure this is a plugin we *can* update (update available and WP version ok).
if ( 'update' === $install_type && false === $this->tgmpa->is_plugin_updatetable( $slug ) ) {
unset( $plugins_to_install[ $key ] );
}
}
// No need to proceed further if we have no plugins to handle.
if ( empty( $plugins_to_install ) ) {
if ( 'install' === $install_type ) {
$message = __( 'No plugins are available to be installed at this time.', 'tgmpa' );
} else {
$message = __( 'No plugins are available to be updated at this time.', 'tgmpa' );
}
echo '
', esc_html( $message ), '
';
return false;
}
// Pass all necessary information if WP_Filesystem is needed.
$url = wp_nonce_url(
$this->tgmpa->get_tgmpa_url(),
'bulk-' . $this->_args['plural']
);
// Give validated data back to $_POST which is the only place the filesystem looks for extra fields.
$_POST['plugin'] = implode( ',', $plugins_to_install ); // Work around for WP bug #19643.
$method = ''; // Leave blank so WP_Filesystem can populate it as necessary.
$fields = array_keys( $_POST ); // Extra fields to pass to WP_Filesystem.
if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, $fields ) ) ) {
return true; // Stop the normal page form from displaying, credential request form will be shown.
}
// Now we have some credentials, setup WP_Filesystem.
if ( ! WP_Filesystem( $creds ) ) {
// Our credentials were no good, ask the user for them again.
request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, $fields );
return true;
}
/* If we arrive here, we have the filesystem */
// Store all information in arrays since we are processing a bulk installation.
$names = array();
$sources = array(); // Needed for installs.
$file_paths = array(); // Needed for upgrades.
$to_inject = array(); // Information to inject into the update_plugins transient.
// Prepare the data for validated plugins for the install/upgrade.
foreach ( $plugins_to_install as $slug ) {
$name = $this->tgmpa->plugins[ $slug ]['name'];
$source = $this->tgmpa->get_download_url( $slug );
if ( ! empty( $name ) && ! empty( $source ) ) {
$names[] = $name;
switch ( $install_type ) {
case 'install':
$sources[] = $source;
break;
case 'update':
$file_paths[] = $this->tgmpa->plugins[ $slug ]['file_path'];
$to_inject[ $slug ] = $this->tgmpa->plugins[ $slug ];
$to_inject[ $slug ]['source'] = $source;
break;
}
}
}
unset( $slug, $name, $source );
// Create a new instance of TGMPA_Bulk_Installer.
$installer = new TGMPA_Bulk_Installer(
new TGMPA_Bulk_Installer_Skin(
array(
'url' => esc_url_raw( $this->tgmpa->get_tgmpa_url() ),
'nonce' => 'bulk-' . $this->_args['plural'],
'names' => $names,
'install_type' => $install_type,
)
)
);
// Wrap the install process with the appropriate HTML.
echo '
',
'
', esc_html( get_admin_page_title() ), '
';
// Process the bulk installation submissions.
add_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1, 3 );
if ( 'tgmpa-bulk-update' === $this->current_action() ) {
// Inject our info into the update transient.
$this->tgmpa->inject_update_info( $to_inject );
$installer->bulk_upgrade( $file_paths );
} else {
$installer->bulk_install( $sources );
}
remove_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1 );
echo '
';
return true;
}
// Bulk activation process.
if ( 'tgmpa-bulk-activate' === $this->current_action() ) {
check_admin_referer( 'bulk-' . $this->_args['plural'] );
// Did user actually select any plugins to activate ?
if ( empty( $_POST['plugin'] ) ) {
echo '
', esc_html__( 'No plugins were selected to be activated. No action taken.', 'tgmpa' ), '
';
return false;
}
// Grab plugin data from $_POST.
$plugins = array();
if ( isset( $_POST['plugin'] ) ) {
$plugins = array_map( 'urldecode', (array) $_POST['plugin'] );
$plugins = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins );
}
$plugins_to_activate = array();
$plugin_names = array();
// Grab the file paths for the selected & inactive plugins from the registration array.
foreach ( $plugins as $slug ) {
if ( $this->tgmpa->can_plugin_activate( $slug ) ) {
$plugins_to_activate[] = $this->tgmpa->plugins[ $slug ]['file_path'];
$plugin_names[] = $this->tgmpa->plugins[ $slug ]['name'];
}
}
unset( $slug );
// Return early if there are no plugins to activate.
if ( empty( $plugins_to_activate ) ) {
echo '
', esc_html__( 'No plugins are available to be activated at this time.', 'tgmpa' ), '
';
return false;
}
// Now we are good to go - let's start activating plugins.
$activate = activate_plugins( $plugins_to_activate );
if ( is_wp_error( $activate ) ) {
echo '
';
} else {
$count = count( $plugin_names ); // Count so we can use _n function.
$plugin_names = array_map( array( 'TGMPA_Utils', 'wrap_in_strong' ), $plugin_names );
$last_plugin = array_pop( $plugin_names ); // Pop off last name to prep for readability.
$imploded = empty( $plugin_names ) ? $last_plugin : ( implode( ', ', $plugin_names ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'tgmpa' ) . ' ' . $last_plugin );
printf( // WPCS: xss ok.
'
%1$s %2$s.
',
esc_html( _n( 'The following plugin was activated successfully:', 'The following plugins were activated successfully:', $count, 'tgmpa' ) ),
$imploded
);
// Update recently activated plugins option.
$recent = (array) get_option( 'recently_activated' );
foreach ( $plugins_to_activate as $plugin => $time ) {
if ( isset( $recent[ $plugin ] ) ) {
unset( $recent[ $plugin ] );
}
}
update_option( 'recently_activated', $recent );
}
unset( $_POST ); // Reset the $_POST variable in case user wants to perform one action after another.
return true;
}
return false;
}
/**
* Prepares all of our information to be outputted into a usable table.
*
* @since 2.2.0
*/
public function prepare_items() {
$columns = $this->get_columns(); // Get all necessary column information.
$hidden = array(); // No columns to hide, but we must set as an array.
$sortable = array(); // No reason to make sortable columns.
$primary = $this->get_primary_column_name(); // Column which has the row actions.
$this->_column_headers = array( $columns, $hidden, $sortable, $primary ); // Get all necessary column headers.
// Process our bulk activations here.
if ( 'tgmpa-bulk-activate' === $this->current_action() ) {
$this->process_bulk_actions();
}
// Store all of our plugin data into $items array so WP_List_Table can use it.
$this->items = apply_filters( 'tgmpa_table_data_items', $this->_gather_plugin_data() );
}
/* *********** DEPRECATED METHODS *********** */
/**
* Retrieve plugin data, given the plugin name.
*
* @since 2.2.0
* @deprecated 2.5.0 use {@see TGM_Plugin_Activation::_get_plugin_data_from_name()} instead.
* @see TGM_Plugin_Activation::_get_plugin_data_from_name()
*
* @param string $name Name of the plugin, as it was registered.
* @param string $data Optional. Array key of plugin data to return. Default is slug.
* @return string|boolean Plugin slug if found, false otherwise.
*/
protected function _get_plugin_data_from_name( $name, $data = 'slug' ) {
_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'TGM_Plugin_Activation::_get_plugin_data_from_name()' );
return $this->tgmpa->_get_plugin_data_from_name( $name, $data );
}
}
}
if ( ! class_exists( 'TGM_Bulk_Installer' ) ) {
/**
* Hack: Prevent TGMPA v2.4.1- bulk installer class from being loaded if 2.4.1- is loaded after 2.5+.
*
* @since 2.5.2
*
* {@internal The TGMPA_Bulk_Installer class was originally called TGM_Bulk_Installer.
* For more information, see that class.}}
*/
class TGM_Bulk_Installer {
}
}
if ( ! class_exists( 'TGM_Bulk_Installer_Skin' ) ) {
/**
* Hack: Prevent TGMPA v2.4.1- bulk installer skin class from being loaded if 2.4.1- is loaded after 2.5+.
*
* @since 2.5.2
*
* {@internal The TGMPA_Bulk_Installer_Skin class was originally called TGM_Bulk_Installer_Skin.
* For more information, see that class.}}
*/
class TGM_Bulk_Installer_Skin {
}
}
/**
* The WP_Upgrader file isn't always available. If it isn't available,
* we load it here.
*
* We check to make sure no action or activation keys are set so that WordPress
* does not try to re-include the class when processing upgrades or installs outside
* of the class.
*
* @since 2.2.0
*/
add_action( 'admin_init', 'tgmpa_load_bulk_installer' );
if ( ! function_exists( 'tgmpa_load_bulk_installer' ) ) {
/**
* Load bulk installer
*/
function tgmpa_load_bulk_installer() {
// Silently fail if 2.5+ is loaded *after* an older version.
if ( ! isset( $GLOBALS['tgmpa'] ) ) {
return;
}
// Get TGMPA class instance.
$tgmpa_instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
if ( isset( $_GET['page'] ) && $tgmpa_instance->menu === $_GET['page'] ) {
if ( ! class_exists( 'Plugin_Upgrader', false ) ) {
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
}
if ( ! class_exists( 'TGMPA_Bulk_Installer' ) ) {
/**
* Installer class to handle bulk plugin installations.
*
* Extends WP_Upgrader and customizes to suit the installation of multiple
* plugins.
*
* @since 2.2.0
*
* {@internal Since 2.5.0 the class is an extension of Plugin_Upgrader rather than WP_Upgrader.}}
* {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer to TGMPA_Bulk_Installer.
* This was done to prevent backward compatibility issues with v2.3.6.}}
*
* @package TGM-Plugin-Activation
* @author Thomas Griffin
* @author Gary Jones
*/
class TGMPA_Bulk_Installer extends Plugin_Upgrader {
/**
* Holds result of bulk plugin installation.
*
* @since 2.2.0
*
* @var string
*/
public $result;
/**
* Flag to check if bulk installation is occurring or not.
*
* @since 2.2.0
*
* @var boolean
*/
public $bulk = false;
/**
* TGMPA instance
*
* @since 2.5.0
*
* @var object
*/
protected $tgmpa;
/**
* Whether or not the destination directory needs to be cleared ( = on update).
*
* @since 2.5.0
*
* @var bool
*/
protected $clear_destination = false;
/**
* References parent constructor and sets defaults for class.
*
* @since 2.2.0
*
* @param \Bulk_Upgrader_Skin|null $skin Installer skin.
*/
public function __construct( $skin = null ) {
// Get TGMPA class instance.
$this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
parent::__construct( $skin );
if ( isset( $this->skin->options['install_type'] ) && 'update' === $this->skin->options['install_type'] ) {
$this->clear_destination = true;
}
if ( $this->tgmpa->is_automatic ) {
$this->activate_strings();
}
add_action( 'upgrader_process_complete', array( $this->tgmpa, 'populate_file_path' ) );
}
/**
* Sets the correct activation strings for the installer skin to use.
*
* @since 2.2.0
*/
public function activate_strings() {
$this->strings['activation_failed'] = __( 'Plugin activation failed.', 'tgmpa' );
$this->strings['activation_success'] = __( 'Plugin activated successfully.', 'tgmpa' );
}
/**
* Performs the actual installation of each plugin.
*
* @since 2.2.0
*
* @see WP_Upgrader::run()
*
* @param array $options The installation config options.
* @return null|array Return early if error, array of installation data on success.
*/
public function run( $options ) {
$result = parent::run( $options );
// Reset the strings in case we changed one during automatic activation.
if ( $this->tgmpa->is_automatic ) {
if ( 'update' === $this->skin->options['install_type'] ) {
$this->upgrade_strings();
} else {
$this->install_strings();
}
}
return $result;
}
/**
* Processes the bulk installation of plugins.
*
* @since 2.2.0
*
* {@internal This is basically a near identical copy of the WP Core
* Plugin_Upgrader::bulk_upgrade() method, with minor adjustments to deal with
* new installs instead of upgrades.
* For ease of future synchronizations, the adjustments are clearly commented, but no other
* comments are added. Code style has been made to comply.}}
*
* @see Plugin_Upgrader::bulk_upgrade()
* @see https://core.trac.wordpress.org/browser/tags/4.2.1/src/wp-admin/includes/class-wp-upgrader.php#L838
* (@internal Last synced: Dec 31st 2015 against https://core.trac.wordpress.org/browser/trunk?rev=36134}}
*
* @param array $plugins The plugin sources needed for installation.
* @param array $args Arbitrary passed extra arguments.
* @return array|false Install confirmation messages on success, false on failure.
*/
public function bulk_install( $plugins, $args = array() ) {
// [TGMPA + ] Hook auto-activation in.
add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
$defaults = array(
'clear_update_cache' => true,
);
$parsed_args = wp_parse_args( $args, $defaults );
$this->init();
$this->bulk = true;
$this->install_strings(); // [TGMPA + ] adjusted.
/* [TGMPA - ] $current = get_site_transient( 'update_plugins' ); */
/* [TGMPA - ] add_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4); */
$this->skin->header();
// Connect to the Filesystem first.
$res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) );
if ( ! $res ) {
$this->skin->footer();
return false;
}
$this->skin->bulk_header();
/*
* Only start maintenance mode if:
* - running Multisite and there are one or more plugins specified, OR
* - a plugin with an update available is currently active.
* @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible.
*/
$maintenance = ( is_multisite() && ! empty( $plugins ) );
/*
[TGMPA - ]
foreach ( $plugins as $plugin )
$maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin] ) );
*/
if ( $maintenance ) {
$this->maintenance_mode( true );
}
$results = array();
$this->update_count = count( $plugins );
$this->update_current = 0;
foreach ( $plugins as $plugin ) {
$this->update_current++;
/*
[TGMPA - ]
$this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true);
if ( !isset( $current->response[ $plugin ] ) ) {
$this->skin->set_result('up_to_date');
$this->skin->before();
$this->skin->feedback('up_to_date');
$this->skin->after();
$results[$plugin] = true;
continue;
}
// Get the URL to the zip file.
$r = $current->response[ $plugin ];
$this->skin->plugin_active = is_plugin_active($plugin);
*/
$result = $this->run(
array(
'package' => $plugin, // [TGMPA + ] adjusted.
'destination' => WP_PLUGIN_DIR,
'clear_destination' => false, // [TGMPA + ] adjusted.
'clear_working' => true,
'is_multi' => true,
'hook_extra' => array(
'plugin' => $plugin,
),
)
);
$results[ $plugin ] = $this->result;
// Prevent credentials auth screen from displaying multiple times.
if ( false === $result ) {
break;
}
} //end foreach $plugins
$this->maintenance_mode( false );
/**
* Fires when the bulk upgrader process is complete.
*
* @since WP 3.6.0 / TGMPA 2.5.0
*
* @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might
* be a Theme_Upgrader or Core_Upgrade instance.
* @param array $data {
* Array of bulk item update data.
*
* @type string $action Type of action. Default 'update'.
* @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'.
* @type bool $bulk Whether the update process is a bulk update. Default true.
* @type array $packages Array of plugin, theme, or core packages to update.
* }
*/
do_action( 'upgrader_process_complete', $this, array(
'action' => 'install', // [TGMPA + ] adjusted.
'type' => 'plugin',
'bulk' => true,
'plugins' => $plugins,
) );
$this->skin->bulk_footer();
$this->skin->footer();
// Cleanup our hooks, in case something else does a upgrade on this connection.
/* [TGMPA - ] remove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin')); */
// [TGMPA + ] Remove our auto-activation hook.
remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
// Force refresh of plugin update information.
wp_clean_plugins_cache( $parsed_args['clear_update_cache'] );
return $results;
}
/**
* Handle a bulk upgrade request.
*
* @since 2.5.0
*
* @see Plugin_Upgrader::bulk_upgrade()
*
* @param array $plugins The local WP file_path's of the plugins which should be upgraded.
* @param array $args Arbitrary passed extra arguments.
* @return string|bool Install confirmation messages on success, false on failure.
*/
public function bulk_upgrade( $plugins, $args = array() ) {
add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
$result = parent::bulk_upgrade( $plugins, $args );
remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
return $result;
}
/**
* Abuse a filter to auto-activate plugins after installation.
*
* Hooked into the 'upgrader_post_install' filter hook.
*
* @since 2.5.0
*
* @param bool $bool The value we need to give back (true).
* @return bool
*/
public function auto_activate( $bool ) {
// Only process the activation of installed plugins if the automatic flag is set to true.
if ( $this->tgmpa->is_automatic ) {
// Flush plugins cache so the headers of the newly installed plugins will be read correctly.
wp_clean_plugins_cache();
// Get the installed plugin file.
$plugin_info = $this->plugin_info();
// Don't try to activate on upgrade of active plugin as WP will do this already.
if ( ! is_plugin_active( $plugin_info ) ) {
$activate = activate_plugin( $plugin_info );
// Adjust the success string based on the activation result.
$this->strings['process_success'] = $this->strings['process_success'] . " \n";
if ( is_wp_error( $activate ) ) {
$this->skin->error( $activate );
$this->strings['process_success'] .= $this->strings['activation_failed'];
} else {
$this->strings['process_success'] .= $this->strings['activation_success'];
}
}
}
return $bool;
}
}
}
if ( ! class_exists( 'TGMPA_Bulk_Installer_Skin' ) ) {
/**
* Installer skin to set strings for the bulk plugin installations..
*
* Extends Bulk_Upgrader_Skin and customizes to suit the installation of multiple
* plugins.
*
* @since 2.2.0
*
* {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer_Skin to
* TGMPA_Bulk_Installer_Skin.
* This was done to prevent backward compatibility issues with v2.3.6.}}
*
* @see https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/class-wp-upgrader-skins.php
*
* @package TGM-Plugin-Activation
* @author Thomas Griffin
* @author Gary Jones
*/
class TGMPA_Bulk_Installer_Skin extends Bulk_Upgrader_Skin {
/**
* Holds plugin info for each individual plugin installation.
*
* @since 2.2.0
*
* @var array
*/
public $plugin_info = array();
/**
* Holds names of plugins that are undergoing bulk installations.
*
* @since 2.2.0
*
* @var array
*/
public $plugin_names = array();
/**
* Integer to use for iteration through each plugin installation.
*
* @since 2.2.0
*
* @var integer
*/
public $i = 0;
/**
* TGMPA instance
*
* @since 2.5.0
*
* @var object
*/
protected $tgmpa;
/**
* Constructor. Parses default args with new ones and extracts them for use.
*
* @since 2.2.0
*
* @param array $args Arguments to pass for use within the class.
*/
public function __construct( $args = array() ) {
// Get TGMPA class instance.
$this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
// Parse default and new args.
$defaults = array(
'url' => '',
'nonce' => '',
'names' => array(),
'install_type' => 'install',
);
$args = wp_parse_args( $args, $defaults );
// Set plugin names to $this->plugin_names property.
$this->plugin_names = $args['names'];
// Extract the new args.
parent::__construct( $args );
}
/**
* Sets install skin strings for each individual plugin.
*
* Checks to see if the automatic activation flag is set and uses the
* the proper strings accordingly.
*
* @since 2.2.0
*/
public function add_strings() {
if ( 'update' === $this->options['install_type'] ) {
parent::add_strings();
/* translators: 1: plugin name, 2: action number 3: total number of actions. */
$this->upgrader->strings['skin_before_update_header'] = __( 'Updating Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
} else {
/* translators: 1: plugin name, 2: error message. */
$this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while installing %1$s: %2$s.', 'tgmpa' );
/* translators: 1: plugin name. */
$this->upgrader->strings['skin_update_failed'] = __( 'The installation of %1$s failed.', 'tgmpa' );
if ( $this->tgmpa->is_automatic ) {
// Automatic activation strings.
$this->upgrader->strings['skin_upgrade_start'] = __( 'The installation and activation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' );
/* translators: 1: plugin name. */
$this->upgrader->strings['skin_update_successful'] = __( '%1$s installed and activated successfully.', 'tgmpa' ) . ' ' . esc_html__( 'Show Details', 'tgmpa' ) . '' . esc_html__( 'Hide Details', 'tgmpa' ) . '.';
$this->upgrader->strings['skin_upgrade_end'] = __( 'All installations and activations have been completed.', 'tgmpa' );
/* translators: 1: plugin name, 2: action number 3: total number of actions. */
$this->upgrader->strings['skin_before_update_header'] = __( 'Installing and Activating Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
} else {
// Default installation strings.
$this->upgrader->strings['skin_upgrade_start'] = __( 'The installation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' );
/* translators: 1: plugin name. */
$this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed successfully.', 'tgmpa' ) . ' ' . esc_html__( 'Show Details', 'tgmpa' ) . '' . esc_html__( 'Hide Details', 'tgmpa' ) . '.';
$this->upgrader->strings['skin_upgrade_end'] = __( 'All installations have been completed.', 'tgmpa' );
/* translators: 1: plugin name, 2: action number 3: total number of actions. */
$this->upgrader->strings['skin_before_update_header'] = __( 'Installing Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
}
}
}
/**
* Outputs the header strings and necessary JS before each plugin installation.
*
* @since 2.2.0
*
* @param string $title Unused in this implementation.
*/
public function before( $title = '' ) {
if ( empty( $title ) ) {
$title = esc_html( $this->plugin_names[ $this->i ] );
}
parent::before( $title );
}
/**
* Outputs the footer strings and necessary JS after each plugin installation.
*
* Checks for any errors and outputs them if they exist, else output
* success strings.
*
* @since 2.2.0
*
* @param string $title Unused in this implementation.
*/
public function after( $title = '' ) {
if ( empty( $title ) ) {
$title = esc_html( $this->plugin_names[ $this->i ] );
}
parent::after( $title );
$this->i++;
}
/**
* Outputs links after bulk plugin installation is complete.
*
* @since 2.2.0
*/
public function bulk_footer() {
// Serve up the string to say installations (and possibly activations) are complete.
parent::bulk_footer();
// Flush plugins cache so we can make sure that the installed plugins list is always up to date.
wp_clean_plugins_cache();
$this->tgmpa->show_tgmpa_version();
// Display message based on if all plugins are now active or not.
$update_actions = array();
if ( $this->tgmpa->is_tgmpa_complete() ) {
// All plugins are active, so we display the complete string and hide the menu to protect users.
echo '';
$update_actions['dashboard'] = sprintf(
esc_html( $this->tgmpa->strings['complete'] ),
'' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . ''
);
} else {
$update_actions['tgmpa_page'] = '' . esc_html( $this->tgmpa->strings['return'] ) . '';
}
/**
* Filter the list of action links available following bulk plugin installs/updates.
*
* @since 2.5.0
*
* @param array $update_actions Array of plugin action links.
* @param array $plugin_info Array of information for the last-handled plugin.
*/
$update_actions = apply_filters( 'tgmpa_update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info );
if ( ! empty( $update_actions ) ) {
$this->feedback( implode( ' | ', (array) $update_actions ) );
}
}
/* *********** DEPRECATED METHODS *********** */
/**
* Flush header output buffer.
*
* @since 2.2.0
* @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead
* @see Bulk_Upgrader_Skin::flush_output()
*/
public function before_flush_output() {
_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );
$this->flush_output();
}
/**
* Flush footer output buffer and iterate $this->i to make sure the
* installation strings reference the correct plugin.
*
* @since 2.2.0
* @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead
* @see Bulk_Upgrader_Skin::flush_output()
*/
public function after_flush_output() {
_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );
$this->flush_output();
$this->i++;
}
}
}
}
}
}
if ( ! class_exists( 'TGMPA_Utils' ) ) {
/**
* Generic utilities for TGMPA.
*
* All methods are static, poor-dev name-spacing class wrapper.
*
* Class was called TGM_Utils in 2.5.0 but renamed TGMPA_Utils in 2.5.1 as this was conflicting with Soliloquy.
*
* @since 2.5.0
*
* @package TGM-Plugin-Activation
* @author Juliette Reinders Folmer
*/
class TGMPA_Utils {
/**
* Whether the PHP filter extension is enabled.
*
* @see http://php.net/book.filter
*
* @since 2.5.0
*
* @static
*
* @var bool $has_filters True is the extension is enabled.
*/
public static $has_filters;
/**
* Wrap an arbitrary string in tags. Meant to be used in combination with array_map().
*
* @since 2.5.0
*
* @static
*
* @param string $string Text to be wrapped.
* @return string
*/
public static function wrap_in_em( $string ) {
return '' . wp_kses_post( $string ) . '';
}
/**
* Wrap an arbitrary string in tags. Meant to be used in combination with array_map().
*
* @since 2.5.0
*
* @static
*
* @param string $string Text to be wrapped.
* @return string
*/
public static function wrap_in_strong( $string ) {
return '' . wp_kses_post( $string ) . '';
}
/**
* Helper function: Validate a value as boolean
*
* @since 2.5.0
*
* @static
*
* @param mixed $value Arbitrary value.
* @return bool
*/
public static function validate_bool( $value ) {
if ( ! isset( self::$has_filters ) ) {
self::$has_filters = extension_loaded( 'filter' );
}
if ( self::$has_filters ) {
return filter_var( $value, FILTER_VALIDATE_BOOLEAN );
} else {
return self::emulate_filter_bool( $value );
}
}
/**
* Helper function: Cast a value to bool
*
* @since 2.5.0
*
* @static
*
* @param mixed $value Value to cast.
* @return bool
*/
protected static function emulate_filter_bool( $value ) {
// @codingStandardsIgnoreStart
static $true = array(
'1',
'true', 'True', 'TRUE',
'y', 'Y',
'yes', 'Yes', 'YES',
'on', 'On', 'ON',
);
static $false = array(
'0',
'false', 'False', 'FALSE',
'n', 'N',
'no', 'No', 'NO',
'off', 'Off', 'OFF',
);
// @codingStandardsIgnoreEnd
if ( is_bool( $value ) ) {
return $value;
} elseif ( is_int( $value ) && ( 0 === $value || 1 === $value ) ) {
return (bool) $value;
} elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( (float) 0 === $value || (float) 1 === $value ) ) {
return (bool) $value;
} elseif ( is_string( $value ) ) {
$value = trim( $value );
if ( in_array( $value, $true, true ) ) {
return true;
} elseif ( in_array( $value, $false, true ) ) {
return false;
} else {
return false;
}
}
return false;
}
} // End of class TGMPA_Utils
} // End of class_exists wrapper
Camera HD 1MP KBvision KX-Y1002C4 - Ngân Vũ TelecomSkip to content
• Camera 4 in 1 (CVI, TVI,AHD,Analog) * SONY SENSOR
• Cảm biến hình ảnh: 1/4″ CMOS 1.0 Megapixel
• Độ phân giải :25/30fps@1.0 Mp(1280×720)
• Truyền tín hiệu , hình ảnh rõ nét với khoảng cách xa lên đến 500~700m
• Hỗ trợ cân bằng ánh sáng, bù sáng, chống ngược sáng, chống nhiễu 2D- DNR , cảm biến ngày/đêm giúp camera tự động điều chỉnh hình ảnh và màu sắc đẹp nhất phù hợp nhất với mọi môi trường ánh sáng
• Hỗ trợ chuyển chế độ hình ảnh và điều chỉnh OSD Menu trực tiếp bằng đầu ghi hình
• Ống kính: 2.8mm ( góc nhìn 84°)
• Tầm xa hồng ngoại: 20m, LED công nghệ mới SMD ,hồng ngoại thông minh tự động điều chỉnh độ sáng chống lóa
• Chuẩn chống bụi và nước IP67 (KX-1001C4)
• Nhiệt độ hoạt động -40~+60°C
HIKVISION là một trong những nhà cung cấp hàng đầu thế giới về các sản phẩm giám sát hình ảnh và các giải pháp. Được thành lập vào năm 2001, hiện nay Hikvision là doanh nghiệp toàn cầu với hơn 20.000 nhân viên – trong đó có 9.000 kỹ sư Nghiên cứu & Phát triển (R&D). Với đội R&D lớn nhất trong ngành công nghiệp an ninh với 621 đăng ký sáng chế và 259 bản quyền phần mềm giúp công ty có khả năng đổi mới liên tục. Sản phẩm của công ty có chất lượng cao, đạt các tiêu chuẩn quốc tế: ISO, CE, CCC, UL, FCC, RoHS… Những sản phẩm này đã được sử dụng tại hơn 100 quốc gia.
Các sản phẩm, giải pháp của Hikvision được tin cậy và sử dụng tại các công trình lớn trên khắp thế giới: Sân vận động tổ chim (Bắc Kinh – Trung Quốc); Hệ thống giao thông công cộng London – Anh; Hệ thống giám sát thành phố tại Singapore – Safe City với hơn 100.000 camera IP…
Trụ sở chính đặt tại Hàng Châu, Trung Quốc, Hikvision vươn ra toàn cầu với 25 chi nhánh tại các nước: Hoa Kỳ, Hà Lan, Ý, Anh, Singapore, Australia, Brazil, Nam Phi và Dubai…; công ty liên doanh tại Ấn Độ và Nga; 35 chi nhánh trên toàn Trung Quốc và một trung tâm bảo hành tại Hồng Kông. Tổng diện tích 2 nhà máy sản xuất lên tới 4,2 triệu m2
Luôn nỗ lực nghiên cứu – phát triển các sản phẩm mới, chất lượng cao, Hikvision đã khẳng định vị trí thương hiệu trên toàn thế giới với tốc độ tăng trưởng hàng năm trên 50%, doanh số toàn cầu năm 2016 đạt xấp xỉ 5 tỷ USD. Hàng năm, Hikvision đầu tư 8% doanh số cho nghiên cứu và phát triển. Luôn đứng đầu trong các bảng xếp hạng về thiết bị an ninh và camera quan sát, Hikvision được công nhận là Nhà sản xuất lớn nhất thế giới về camera quan sát – Theo nghiên cứu của Tạp chí A&S (Tạp chí uy tín hàng đầu thế giới trong lĩnh vực thiết bị an ninh – website: www.asmag.com).
SOLARTECH
CÔNG TY CỔ PHẦN SOLARTECH là một trong những chuyên gia đi đầu trong lĩnh vực năng lượng sạch tại Việt Nam, với phương châm UY TÍN – CHẤT LƯỢNG – CHUYÊN NGHIỆP chúng tôi luôn cung cấp đến khách hàng những sản phẩm tốt nhất, nhưng công nghệ hàng đầu về năng lượng tái tạo như: điện mặt trời, năng lượng gió và các sản phẩm tiện nghi như: nhà thông minh – Smart Home.
Một trong những hoạt động chính của Công ty là cung cấp các giải pháp về điện năng lượng mặt trời – nguồn năng lượng tái tạo vô tận, thân thiện với môi trường đến cho các khách hàng như hộ gia đình, cơ sở kinh doanh, các nhà máy sản xuất… nhằm góp phần bảo vệ môi trường sống của con người Việt Nam.
Trong quá trình phát triển và hội nhập, Công ty đã tạo được uy tín vững vàng trên thị trường. Cùng với hệ thống quản lý chất lượng hoạt động sản xuất của Doanh nghiệp: An toàn – Tiến độ – Chất lượng và cải tiến liên tục chất lượng phục vụ cũng như sản phẩm tiên tiến, hiện đại nhất, bắt kịp với công nghệ của thế giới hiện nay.
Với kinh nghiệm, thâm niên trong lĩnh vực cung cấp máy phát điện, CÔNG TY CỔ PHẦN SOLARTECH đã nghiên cứu và lắp ráp các hệ thống máy phát điện không khói, ứng dụng công nghệ tự động theo tiêu chuẩn của Đức, sử dụng công nghê điện mặt trời cấp điện cho gia đình, cơ sở kinh doanh của bạn, luôn đảm bảo nguồn điện cho các thiết bị hoạt động 24/24. Vì thế, quý khách hoàn tàn an tâm khi hợp tác với chúng tôi. Các chuyên gia về điện mặt trời, nhà thông minh và tập thể nhân viên công ty cam kết luôn đem lại cho quý khách những sản phẩm chất lượng nhất, tốt nhất.
dahua
Công ty Công Nghệ Dahua là nhà sản xuất chuyên nghiệp trong lĩnh vực anh ninh và giám sát. Qua hơn 15 năm phát triển, Công ty Công Nghệ Dahua có bề dày kinh nghiệm trong nghiên cứu và thiết kế thiết bị giám sát với công nghệ tiên tiến.
Cả phần cứng và phần mềm đều được thiết kế bằng module với tính linh hoạt cho các cấu hình khác nhau, quy mô ứng dụng đa dạng và cho phép mở rộng trong tương lai. Dahua hiện đang đứng thứ 9 thế giới trong top 50 nhà cung cấp thiết bị an ninh hàng đầu thế giới được xếp hạng bởi a&s International vào năm 2013
Dahua Technology là một nhà sản xuất thiết bị an ninh hàng đầu thế giới. Công ty Camera Dahua có thị phần lớn nhất nhì thế giới về camera quan sát theo báo cáo của IMS năm 2015. Camera Dahua tin tưởng vào việc đầu tư và xây dựng năng lực R & D mạnh mẽ cho công nghệ mới và sự đổi mới. Dahua đã đầu tư gần 10% doanh thu bán hàng hàng năm. Thương hiệu camera Dahua có hơn 3000 chuyên gia trong đội ngũ R & D, chuyên cung cấp các dòng sản phẩm tiên tiến với chất lượng cao và hiệu suất lớn. Giải pháp Dahua được thiết kế để được mở rộng và phát triển để cung cấp các tùy chọn cấu hình nâng cấp hệ thống linh hoạt. Camera Dahua có một danh mục đầu tư bằng sáng chế với 442 bằng sáng chế và chúng tôi cấp phép công nghệ của chúng tôi để các nhà sản xuất khác.
Danh mục sản phẩm của Dahua bao gồm: Thiết bị nâng cao Video giám sát và phần mềm, điều khiển truy cập phần cứng và phần mềm, phần cứng xâm nhập, và thông minh Hệ thống quản lý tòa nhà.
Sản phẩm của Dahua được sử dụng rộng rãi trong nhiều lĩnh vực, chẳng hạn như ngân hàng, an ninh công cộng, cơ sở hạ tầng năng lượng, viễn thông, thông minh, xây dựng, giao thông vận tải và thông minh. Nhiều dự án quan trọng đã được cài đặt với các giải pháp của Dahua bao gồm: Nhà máy thủy điện Tam Hiệp, Six-Country Summit, Olympic Địa điểm, Shanghai World Expo, UNESCO, và tàu điện ngầm London cũng như nhiều người khác.
Dahua đã thành lập doanh số bán hàng, tiếp thị và mạng lưới dịch vụ trên toàn cầu. Camera Dahua có văn phòng tại Trung Quốc đại lục, lớn châu Á, châu Mỹ, châu Âu, châu Đại Dương, châu Phi và những nơi khác. Dấu chân toàn cầu của chúng tôi làm cho đáp ứng cho thị trường với các dịch vụ tốt nhất và các sản phẩm có thể.
KBVISION
KBVISION GROUP INC được thành lập tại Trung tâm Thung lũng Silicon, Hoa Kỳ, tập đoàn phát triển và phát triển từ lợi nhuận được tạo ra hữu cơ, trở thành công ty hàng đầu thế giới trong lĩnh vực kinh doanh cốt lõi là hệ thống giám sát, năng lượng xanh, phần mềm y tế, nghiên cứu AI và phát triển trí tuệ nhân tạo và các dự án tàu cao tốc.
CÔNG TY TNHH TM KBVISION VIỆT NAM tự hào là đại diện tiêu biểu cho Tập đoàn KBVISION GROUP INC. tại Việt Nam, chuyên cung cấp giải pháp an ninh toàn diện thông qua các dòng sản phẩm: Camera, Đầu ghi hình, thiết bị báo động, chống trộm, khóa thông minh,… được đảm bảo cao về chất lượng và tiêu chuẩn của Mỹ, với mức giá cạnh tranh và dịch vụ chăm sóc khách hàng chu đáo.
Hiện tại, KBVISION VIỆT NAM có hệ thống tổ chức hơn 500 nhân viên bao gồm trong 03 trụ sở giao dịch tại Tp. Hà Nội (miền Bắc), Tp. Đà Nẵng (miền Trung) và Tp. Hồ Chí Minh (miền Nam – Trụ sở chính) đang hoạt động đồng thời với hơn 1,500 Đại lý kinh doanh và lắp đặt dàn trải trên khắp cả nước.
HDParagon
HDParagon là một trong những nhà cung cấp hàng đầu thế giới về dòng sản phẩm camera giám sát ghi hình và các giải pháp. Được thành lập vào năm 2001 tại Đài Loan, HDParagon đã phát triển từ một công ty nhỏ chỉ với 28 nhân viên thành một doanh nghiệp với quy mô toàn cầu với hơn 5.000 nhân viên. Trong đó, có 1.400 kỹ sư chuyên nghiên cứu và phát triển công nghệ – một trong những đội ngũ lớn nhất trong ngành công nghiệp và không ngừng được đổi mới.
HDParagon tham gia vào phát triển sản xuất và kinh doanh hệ thống giám sát analog và hệ thống giám sát qua mạng. HDParagon cung cấp các dòng sản phẩm cao cấp: Đầu ghi hình tích hợp số (Hybird Digital Video Recorder), Đầu ghi hình mạng (Network Video Recorder), Đầu ghi hình chuẩn kỹ thuật số (Standalone Digital Video Recorder), Bộ chuyển đổi Camera (Digital Video Servers), Camera IP độ nét cao, Camera bán cầu tốc độ cao, Camera cảm biến hồng hoại thông minh, Camera chống nước, chống va đập, phần mềm tích hợp quản lý giám sát qua mạng… Những dòng sản phẩm này được sử dụng rộng rãi ở hơn 100 quốc gia trên thế giới, đáp ứng tốt nhu cầu của các thị trường khó tính như: Mỹ, Italy và Đức
HDParagon đã có giấy chứng nhận ISO9001 và ISO14001. Không chỉ hợp tác với trung tâm nghiên cứu khoa học của các trường Đại học nổi tiếng Đài Loan, ngoài ra HDPARAGON còn hợp tác công nghệ với các quốc gia danh tiếng về công nghệ: Nhật Bản, Mỹ, Hàn Quốc, Đài Loan… Bằng cách sử dụng các công nghệ tiên tiến nhất như: DIS (Digital Image System), CCD (Charge Coupled Device), SMT (Surface Mount Technology); sử dụng hệ thống quản lý thông tin tiên tiến như: SAP, OA, CMMI; với chiến lược đổi mới công nghệ liên tục, nâng cao điểm ảnh cho sản phẩm siêu nét để có thể đáp ứng nhanh nhất với yêu cầu của thị trường. Chúng tôi đảm bảo 100% sự hài lòng của khách hàng.
Panasonic
Panasonic bắt đầu hoạt động kinh doanh tại Việt Nam từ những năm 1950, mục tiêu đóng góp cho xã hội Việt Nam thông qua các hoạt động từ nghiên cứu và phát triển, sản xuất, phân phối và bán hàng cũng như các hoạt động trách nhiệm xã hội Tập đoàn.
Công ty Panasonic Việt Nam (PV) là công ty 100% vốn nước ngoài đầu tiên giữ vai trò công ty chủ quản tại Việt Nam. Tính đến tháng 7 năm 2013, Tập đoàn Panasonic tại Việt Nam gồm tám công ty bao gồm Panasonic Việt Nam và bộ phận kinh doanh trực thuộc Panasonic Sales Việt Nam (PSV), Trung tâm nghiên cứu và phát triển (PRDCV), năm công ty sản xuất bao gồm Panasonic AVC Networks Việt Nam (PAVCV), Panasonic Appliances Việt Nam (PAPVN), Panasonic System Networks Việt Nam (PSNV), Panasonic Industrial Devices Việt Nam (PIDVN), Panasonic Life Solutions Việt Nam (PLSVN), và công ty bảo hiểm Panasonic Insurance Service Việt Nam (PISVN). Tập đoàn có tổng số nhân lực khoảng 8,000 người. Tại Việt Nam, Panasonic là một trong những doanh nghiệp đặc biệt chú trọng tới các hoạt động xã hội giáo dục và môi trường.