* @since 1.7 * @param string|object $module_id A module ID or object. * @param array $compiled An array of module types that have already has frontend.js compiled. * @return string */ static public function render_module_js( $module_id, &$compiled = array() ) { $module = is_object( $module_id ) ? $module_id : FLBuilderModel::get_module( $module_id ); $global_settings = FLBuilderModel::get_global_settings(); $js = ''; // Global module JS $file = $module->dir . 'js/frontend.js'; if ( file_exists( $file ) && ! in_array( $module->settings->type, $compiled ) ) { $js .= "\n" . file_get_contents( $file ); $compiled[] = $module->settings->type; } // Instance module JS $file = $module->dir . 'includes/frontend.js.php'; $settings = $module->settings; $id = $module->node; if ( file_exists( $file ) ) { ob_start(); include $file; $js .= ob_get_clean(); } // Return the JS. return $js; } /** * Renders the custom CSS or JS for all global nodes in a layout. * * @since 1.7 */ static public function render_global_nodes_custom_code( $type = 'css' ) { $code = ''; $rendered = array(); if ( ! FLBuilderModel::is_post_node_template() ) { $nodes = FLBuilderModel::get_layout_data(); $node_status = FLBuilderModel::get_node_status(); foreach( $nodes as $node_id => $node ) { $template_post_id = FLBuilderModel::is_node_global( $node ); if ( $template_post_id && ! in_array( $template_post_id, $rendered ) ) { $rendered[] = $template_post_id; $code .= FLBuilderModel::get_layout_settings( $node_status, $template_post_id )->{ $type }; } } } return $code; } /** * Custom logging function that handles objects and arrays. * * @since 1.0 * @return void */ static public function log() { foreach ( func_get_args() as $arg ) { ob_start(); print_r( $arg ); error_log( ob_get_clean() ); } } /** * @since 1.0 * @deprecated 1.7.4 */ static public function layout_styles_scripts( $post_id ) { _deprecated_function( __METHOD__, '1.7.4', __CLASS__ . '::enqueue_layout_styles_scripts()' ); self::enqueue_layout_styles_scripts( $post_id ); } /** * @since 1.0 * @deprecated 1.7.4 */ static public function styles_scripts() { _deprecated_function( __METHOD__, '1.7.4', __CLASS__ . '::enqueue_ui_styles_scripts()' ); self::enqueue_ui_styles_scripts(); } /** * @since 1.0 * @deprecated 1.8 */ static public function register_templates_post_type() { _deprecated_function( __METHOD__, '1.8', 'FLBuilderUserTemplates::register_post_type()' ); if ( class_exists( 'FLBuilderUserTemplates' ) ) { FLBuilderUserTemplates::register_post_type(); } } /** * @since 1.0 * @deprecated 1.8 */ static public function render_template( $template ) { _deprecated_function( __METHOD__, '1.8', 'FLBuilderUserTemplates::template_include()' ); if ( class_exists( 'FLBuilderUserTemplates' ) ) { FLBuilderUserTemplates::template_include(); } } /** * @since 1.6.3 * @deprecated 1.8 */ static public function render_ui_panel_node_templates() { _deprecated_function( __METHOD__, '1.8', 'FLBuilderUserTemplates::render_ui_panel_node_templates()' ); if ( class_exists( 'FLBuilderUserTemplates' ) ) { FLBuilderUserTemplates::render_ui_panel_node_templates(); } } /** * @since 1.0 * @deprecated 1.8 */ static public function render_user_template_settings() { _deprecated_function( __METHOD__, '1.8', 'FLBuilderUserTemplates::render_settings()' ); if ( class_exists( 'FLBuilderUserTemplates' ) ) { FLBuilderUserTemplates::render_settings(); } } /** * @since 1.6.3 * @deprecated 1.8 */ static public function render_node_template_settings( $node_id = null ) { _deprecated_function( __METHOD__, '1.8', 'FLBuilderUserTemplates::render_node_settings()' ); if ( class_exists( 'FLBuilderUserTemplates' ) ) { FLBuilderUserTemplates::render_node_settings( $node_id ); } } } FLBuilder::init();= substr($data, $pos); } if (!preg_match('/^HTTP\/[0-9.]+ 200 /', $data)) { $errstr = substr($data, 0, strpos($data, "\n") - 1); error_log('XML-RPC: ' . __METHOD__ . ': HTTP error, got response: ' . $errstr); $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error'] . ' (' . $errstr . ')'); return $r; } $GLOBALS['_xh']['headers'] = array(); $GLOBALS['_xh']['cookies'] = array(); // be tolerant to usage of \n instead of \r\n to separate headers and data // (even though it is not valid http) $pos = strpos($data, "\r\n\r\n"); if ($pos || is_int($pos)) { $bd = $pos + 4; } else { $pos = strpos($data, "\n\n"); if ($pos || is_int($pos)) { $bd = $pos + 2; } else { // No separation between response headers and body: fault? // we could take some action here instead of going on... $bd = 0; } } // be tolerant to line endings, and extra empty lines $ar = preg_split("/\r?\n/", trim(substr($data, 0, $pos))); while (list(, $line) = @each($ar)) { // take care of multi-line headers and cookies $arr = explode(':', $line, 2); if (count($arr) > 1) { $header_name = strtolower(trim($arr[0])); /// @todo some other headers (the ones that allow a CSV list of values) /// do allow many values to be passed using multiple header lines. /// We should add content to $GLOBALS['_xh']['headers'][$header_name] /// instead of replacing it for those... if ($header_name == 'set-cookie' || $header_name == 'set-cookie2') { if ($header_name == 'set-cookie2') { // version 2 cookies: // there could be many cookies on one line, comma separated $cookies = explode(',', $arr[1]); } else { $cookies = array($arr[1]); } foreach ($cookies as $cookie) { // glue together all received cookies, using a comma to separate them // (same as php does with getallheaders()) if (isset($GLOBALS['_xh']['headers'][$header_name])) $GLOBALS['_xh']['headers'][$header_name] .= ', ' . trim($cookie); else $GLOBALS['_xh']['headers'][$header_name] = trim($cookie); // parse cookie attributes, in case user wants to correctly honour them // feature creep: only allow rfc-compliant cookie attributes? // @todo support for server sending multiple time cookie with same name, but using different PATHs $cookie = explode(';', $cookie); foreach ($cookie as $pos => $val) { $val = explode('=', $val, 2); $tag = trim($val[0]); $val = trim(@$val[1]); /// @todo with version 1 cookies, we should strip leading and trailing " chars if ($pos == 0) { $cookiename = $tag; $GLOBALS['_xh']['cookies'][$tag] = array(); $GLOBALS['_xh']['cookies'][$cookiename]['value'] = urldecode($val); } else { if ($tag != 'value') { $GLOBALS['_xh']['cookies'][$cookiename][$tag] = $val; } } } } } else { $GLOBALS['_xh']['headers'][$header_name] = trim($arr[1]); } } elseif (isset($header_name)) { /// @todo version1 cookies might span multiple lines, thus breaking the parsing above $GLOBALS['_xh']['headers'][$header_name] .= ' ' . trim($line); } } $data = substr($data, $bd); if ($this->debug && count($GLOBALS['_xh']['headers'])) { print '
';
            foreach ($GLOBALS['_xh']['headers'] as $header => $value) {
                print htmlentities("HEADER: $header: $value\n");
            }
            foreach ($GLOBALS['_xh']['cookies'] as $header => $value) {
                print htmlentities("COOKIE: $header={$value['value']}\n");
            }
            print "
\n"; } // if CURL was used for the call, http headers have been processed, // and dechunking + reinflating have been carried out if (!$headers_processed) { // Decode chunked encoding sent by http 1.1 servers if (isset($GLOBALS['_xh']['headers']['transfer-encoding']) && $GLOBALS['_xh']['headers']['transfer-encoding'] == 'chunked') { if (!$data = decode_chunked($data)) { error_log('XML-RPC: ' . __METHOD__ . ': errors occurred when trying to rebuild the chunked data received from server'); $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['dechunk_fail'], $GLOBALS['xmlrpcstr']['dechunk_fail']); return $r; } } // Decode gzip-compressed stuff // code shamelessly inspired from nusoap library by Dietrich Ayala if (isset($GLOBALS['_xh']['headers']['content-encoding'])) { $GLOBALS['_xh']['headers']['content-encoding'] = str_replace('x-', '', $GLOBALS['_xh']['headers']['content-encoding']); if ($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' || $GLOBALS['_xh']['headers']['content-encoding'] == 'gzip') { // if decoding works, use it. else assume data wasn't gzencoded if (function_exists('gzinflate')) { if ($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { $data = $degzdata; if ($this->debug) print "
---INFLATED RESPONSE---[" . strlen($data) . " chars]---\n" . htmlentities($data) . "\n---END---
"; } elseif ($GLOBALS['_xh']['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10))) { $data = $degzdata; if ($this->debug) print "
---INFLATED RESPONSE---[" . strlen($data) . " chars]---\n" . htmlentities($data) . "\n---END---
"; } else { error_log('XML-RPC: ' . __METHOD__ . ': errors occurred when trying to decode the deflated data received from server'); $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['decompress_fail'], $GLOBALS['xmlrpcstr']['decompress_fail']); return $r; } } else { error_log('XML-RPC: ' . __METHOD__ . ': the server sent deflated data. Your php install must have the Zlib extension compiled in to support this.'); $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['cannot_decompress'], $GLOBALS['xmlrpcstr']['cannot_decompress']); return $r; } } } } // end of 'if needed, de-chunk, re-inflate response' // real stupid hack to avoid PHP complaining about returning NULL by ref $r = null; $r =& $r; return $r; } /** * Parse the xmlrpc response contained in the string $data and return an xmlrpcresp object. * @param string $data the xmlrpc response, eventually including http headers * @param bool $headers_processed when true prevents parsing HTTP headers for interpretation of content-encoding and consequent decoding * @param string $return_type decides return type, i.e. content of response->value(). Either 'xmlrpcvals', 'xml' or 'phpvals' * @return xmlrpcresp * @access public */ function &parseResponse($data = '', $headers_processed = false, $return_type = 'xmlrpcvals') { if ($this->debug) { //by maHo, replaced htmlspecialchars with htmlentities print "
---GOT---\n" . htmlentities($data) . "\n---END---\n
"; } if ($data == '') { error_log('XML-RPC: ' . __METHOD__ . ': no response received from server.'); $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_data'], $GLOBALS['xmlrpcstr']['no_data']); return $r; } $GLOBALS['_xh'] = array(); $raw_data = $data; // parse the HTTP headers of the response, if present, and separate them from data if (substr($data, 0, 4) == 'HTTP') { $r =& $this->parseResponseHeaders($data, $headers_processed); if ($r) { // failed processing of HTTP response headers // save into response obj the full payload received, for debugging $r->raw_data = $data; return $r; } } else { $GLOBALS['_xh']['headers'] = array(); $GLOBALS['_xh']['cookies'] = array(); } if ($this->debug) { $start = strpos($data, '', $start); $comments = substr($data, $start, $end - $start); print "
---SERVER DEBUG INFO (DECODED) ---\n\t" . htmlentities(str_replace("\n", "\n\t", base64_decode($comments))) . "\n---END---\n
"; } } // be tolerant of extra whitespace in response body $data = trim($data); /// @todo return an error msg if $data=='' ? // be tolerant of junk after methodResponse (e.g. javascript ads automatically inserted by free hosts) // idea from Luca Mariano originally in PEARified version of the lib $pos = strrpos($data, ''); if ($pos !== false) { $data = substr($data, 0, $pos + 17); } // if user wants back raw xml, give it to him if ($return_type == 'xml') { $r = new xmlrpcresp($data, 0, '', 'xml'); $r->hdrs = $GLOBALS['_xh']['headers']; $r->_cookies = $GLOBALS['_xh']['cookies']; $r->raw_data = $raw_data; return $r; } // try to 'guestimate' the character encoding of the received response $resp_encoding = guess_encoding(@$GLOBALS['_xh']['headers']['content-type'], $data); $GLOBALS['_xh']['ac'] = ''; //$GLOBALS['_xh']['qt']=''; //unused... $GLOBALS['_xh']['stack'] = array(); $GLOBALS['_xh']['valuestack'] = array(); $GLOBALS['_xh']['isf'] = 0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc $GLOBALS['_xh']['isf_reason'] = ''; $GLOBALS['_xh']['rt'] = ''; // 'methodcall or 'methodresponse' // if response charset encoding is not known / supported, try to use // the default encoding and parse the xml anyway, but log a warning... if (!in_array($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) // the following code might be better for mb_string enabled installs, but // makes the lib about 200% slower... //if (!is_valid_charset($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) { error_log('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of received response: ' . $resp_encoding); $resp_encoding = $GLOBALS['xmlrpc_defencoding']; } $parser = xml_parser_create($resp_encoding); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); // G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell // the xml parser to give us back data in the expected charset. // What if internal encoding is not in one of the 3 allowed? // we use the broadest one, ie. utf8 // This allows to send data which is native in various charset, // by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) { xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); } else { xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']); } if ($return_type == 'phpvals') { xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast'); } else { xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee'); } xml_set_character_data_handler($parser, 'xmlrpc_cd'); xml_set_default_handler($parser, 'xmlrpc_dh'); // first error check: xml not well formed if (!xml_parse($parser, $data, count($data))) { // thanks to Peter Kocks if ((xml_get_current_line_number($parser)) == 1) { $errstr = 'XML error at line 1, check URL'; } else { $errstr = sprintf('XML error: %s at line %d, column %d', xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), xml_get_current_column_number($parser)); } error_log($errstr); $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return'] . ' (' . $errstr . ')'); xml_parser_free($parser); if ($this->debug) { print $errstr; } $r->hdrs = $GLOBALS['_xh']['headers']; $r->_cookies = $GLOBALS['_xh']['cookies']; $r->raw_data = $raw_data; return $r; } xml_parser_free($parser); // second error check: xml well formed but not xml-rpc compliant if ($GLOBALS['_xh']['isf'] > 1) { if ($this->debug) { /// @todo echo something for user? } $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return'] . ' ' . $GLOBALS['_xh']['isf_reason']); } // third error check: parsing of the response has somehow gone boink. // NB: shall we omit this check, since we trust the parsing code? elseif ($return_type == 'xmlrpcvals' && !is_object($GLOBALS['_xh']['value'])) { // something odd has happened // and it's time to generate a client side error // indicating something odd went on $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return']); } else { if ($this->debug) { print "
---PARSED---\n";
                // somehow htmlentities chokes on var_export, and some full html string...
                //print htmlentitites(var_export($GLOBALS['_xh']['value'], true));
                print htmlspecialchars(var_export($GLOBALS['_xh']['value'], true));
                print "\n---END---
"; } // note that using =& will raise an error if $GLOBALS['_xh']['st'] does not generate an object. $v =& $GLOBALS['_xh']['value']; if ($GLOBALS['_xh']['isf']) { /// @todo we should test here if server sent an int and a string, /// and/or coerce them into such... if ($return_type == 'xmlrpcvals') { $errno_v = $v->structmem('faultCode'); $errstr_v = $v->structmem('faultString'); $errno = $errno_v->scalarval(); $errstr = $errstr_v->scalarval(); } else { $errno = $v['faultCode']; $errstr = $v['faultString']; } if ($errno == 0) { // FAULT returned, errno needs to reflect that $errno = -1; } $r = new xmlrpcresp(0, $errno, $errstr); } else { $r = new xmlrpcresp($v, 0, '', $return_type); } } $r->hdrs = $GLOBALS['_xh']['headers']; $r->_cookies = $GLOBALS['_xh']['cookies']; $r->raw_data = $raw_data; return $r; } } class xmlrpcval { var $me = array(); var $mytype = 0; var $_php_class = null; /** * @param mixed $val * @param string $type any valid xmlrpc type name (lowercase). If null, 'string' is assumed */ function xmlrpcval($val = -1, $type = '') { /// @todo: optimization creep - do not call addXX, do it all inline. /// downside: booleans will not be coerced anymore if ($val !== -1 || $type != '') { // optimization creep: inlined all work done by constructor switch ($type) { case '': $this->mytype = 1; $this->me['string'] = $val; break; case 'i4': case 'int': case 'double': case 'string': case 'boolean': case 'dateTime.iso8601': case 'base64': case 'null': $this->mytype = 1; $this->me[$type] = $val; break; case 'array': $this->mytype = 2; $this->me['array'] = $val; break; case 'struct': $this->mytype = 3; $this->me['struct'] = $val; break; default: error_log("XML-RPC: " . __METHOD__ . ": not a known type ($type)"); } /*if($type=='') { $type='string'; } if($GLOBALS['xmlrpcTypes'][$type]==1) { $this->addScalar($val,$type); } elseif($GLOBALS['xmlrpcTypes'][$type]==2) { $this->addArray($val); } elseif($GLOBALS['xmlrpcTypes'][$type]==3) { $this->addStruct($val); }*/ } } /** * Add a single php value to an (unitialized) xmlrpcval * @param mixed $val * @param string $type * @return int 1 or 0 on failure */ function addScalar($val, $type = 'string') { $typeof = @$GLOBALS['xmlrpcTypes'][$type]; if ($typeof != 1) { error_log("XML-RPC: " . __METHOD__ . ": not a scalar type ($type)"); return 0; } // coerce booleans into correct values // NB: we should either do it for datetimes, integers and doubles, too, // or just plain remove this check, implemented on booleans only... if ($type == $GLOBALS['xmlrpcBoolean']) { if (strcasecmp($val, 'true') == 0 || $val == 1 || ($val == true && strcasecmp($val, 'false'))) { $val = true; } else { $val = false; } } switch ($this->mytype) { case 1: error_log('XML-RPC: ' . __METHOD__ . ': scalar xmlrpcval can have only one value'); return 0; case 3: error_log('XML-RPC: ' . __METHOD__ . ': cannot add anonymous scalar to struct xmlrpcval'); return 0; case 2: // we're adding a scalar value to an array here //$ar=$this->me['array']; //$ar[]=new xmlrpcval($val, $type); //$this->me['array']=$ar; // Faster (?) avoid all the costly array-copy-by-val done here... $this->me['array'][] = new xmlrpcval($val, $type); return 1; default: // a scalar, so set the value and remember we're scalar $this->me[$type] = $val; $this->mytype = $typeof; return 1; } } /** * Add an array of xmlrpcval objects to an xmlrpcval * @param array $vals * @return int 1 or 0 on failure * @access public * * @todo add some checking for $vals to be an array of xmlrpcvals? */ function addArray($vals) { if ($this->mytype == 0) { $this->mytype = $GLOBALS['xmlrpcTypes']['array']; $this->me['array'] = $vals; return 1; } elseif ($this->mytype == 2) { // we're adding to an array here $this->me['array'] = array_merge($this->me['array'], $vals); return 1; } else { error_log('XML-RPC: ' . __METHOD__ . ': already initialized as a [' . $this->kindOf() . ']'); return 0; } } /** * Add an array of named xmlrpcval objects to an xmlrpcval * @param array $vals * @return int 1 or 0 on failure * @access public * * @todo add some checking for $vals to be an array? */ function addStruct($vals) { if ($this->mytype == 0) { $this->mytype = $GLOBALS['xmlrpcTypes']['struct']; $this->me['struct'] = $vals; return 1; } elseif ($this->mytype == 3) { // we're adding to a struct here $this->me['struct'] = array_merge($this->me['struct'], $vals); return 1; } else { error_log('XML-RPC: ' . __METHOD__ . ': already initialized as a [' . $this->kindOf() . ']'); return 0; } } // poor man's version of print_r ??? // DEPRECATED! function dump($ar) { foreach ($ar as $key => $val) { echo "$key => $val
"; if ($key == 'array') { while (list($key2, $val2) = each($val)) { echo "-- $key2 => $val2
"; } } } } /** * Returns a string containing "struct", "array" or "scalar" describing the base type of the value * @return string * @access public */ function kindOf() { switch ($this->mytype) { case 3: return 'struct'; break; case 2: return 'array'; break; case 1: return 'scalar'; break; default: return 'undef'; } } /** * @access private */ function serializedata($typ, $val, $charset_encoding = '') { $rs = ''; switch (@$GLOBALS['xmlrpcTypes'][$typ]) { case 1: switch ($typ) { case $GLOBALS['xmlrpcBase64']: $rs .= "<${typ}>" . base64_encode($val) . ""; break; case $GLOBALS['xmlrpcBoolean']: $rs .= "<${typ}>" . ($val ? '1' : '0') . ""; break; case $GLOBALS['xmlrpcString']: // G. Giunta 2005/2/13: do NOT use htmlentities, since // it will produce named html entities, which are invalid xml $rs .= "<${typ}>" . xmlrpc_encode_entitites($val, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . ""; break; case $GLOBALS['xmlrpcInt']: case $GLOBALS['xmlrpcI4']: $rs .= "<${typ}>" . (int)$val . ""; break; case $GLOBALS['xmlrpcDouble']: // avoid using standard conversion of float to string because it is locale-dependent, // and also because the xmlrpc spec forbids exponential notation. // sprintf('%F') could be most likely ok but it fails eg. on 2e-1r />Kích thước hộp: 6,2×1,8x16cm
Kích thước thùng: 34x32x22cm
100 cái/ctn

Cảng FOB: Ninh Ba
Thời gian thực hiện: 35- 45 ngày

 

Thanh toán & Giao hàng

Phương thức thanh toán: Trả trước 30% T/T và số dư thanh toán so với bản sao B/L, PayPal, L/C..
Chi tiết giao hàng: trong vòng 30-45 ngày sau khi xác nhận đơn hàng.

ngân hàng ảnh

厂门口

ngân hàng ảnh (1)

Câu hỏi thường gặp:

1. chúng tôi là ai?
Chúng tôi có trụ sở tại Chiết Giang, Trung Quốc, bắt đầu từ năm 2020, bán cho Đông Âu (40,00%), Thị trường nội địa (20,00%), Bắc Mỹ (12,00%), Trung Đông (8,00%), Nam Mỹ (8,00%), Châu Phi (5,00%), Đông Á(5,00%).Có tổng cộng khoảng 301-500 người trong văn phòng của chúng tôi.

2. làm thế nào chúng tôi có thể đảm bảo chất lượng?
Luôn là mẫu tiền sản xuất trước khi sản xuất hàng loạt;
Công nhân lành nghề quan tâm đến từng chi tiết trong việc xử lý quy trình sản xuất và đóng gói;Phòng Quản lý chất lượng đặc biệt
chịu trách nhiệm kiểm tra chất lượng trong từng quá trình.
Luôn kiểm tra lần cuối trước khi giao hàng;

3. bạn có thể mua gì từ chúng tôi?
Máy phân phối xà phòng tự động, chăm sóc sức khỏe cá nhân, Thiết bị rửa tai bằng điện, Máy sấy tai, Máy rửa mũi bằng điện.

4. tại sao bạn nên mua từ chúng tôi mà không phải từ các nhà cung cấp khác?
Diện tích nhà máy khoảng 10.000 mét vuông và có hơn 200 nhân viên.Chúng tôi có một đội ngũ quản lý và phát triển mạnh mẽ.Chúng tôi có khả năng phát triển sản phẩm và phát triển quy trình mạnh mẽ, với 20 kỹ sư thiết kế.

5. chúng tôi có thể cung cấp những dịch vụ gì?
Điều khoản giao hàng được chấp nhận: FOB, EXW, FCA, Chuyển phát nhanh;
Đồng tiền thanh toán được chấp nhận:null;
Hình thức thanh toán được chấp nhận: T/T,L/C;
Ngôn ngữ nói: Tiếng Anh

6, Làm thế nào tôi có thể lấy một số mẫu?
Chúng tôi rất hân hạnh được cung cấp cho bạn các mẫu. Vì sản phẩm có chứa pin Lithium tích hợp nên nó phải được vận chuyển ra nước ngoài qua Hồng Kông và Vận chuyển hàng hóa phải được trả trước, vì vậy vui lòng cho chúng tôi biết Địa chỉ của bạn và chi phí vận chuyển sẽ là ước lượng

Chúng tôi kiên trì với nguyên tắc “chất lượng là trên hết, hỗ trợ ban đầu, cải tiến và đổi mới liên tục để đáp ứng khách hàng” cho ban quản lý của bạn v