selectform

    /**
     * 
     * Generate a select form using as options values from a db table.
     * 
     * $sdata values related to select form:
     * -------------------------------------
     * name: Name of select form used also if "ref_value" is empty
     * default: Selector default (selected) value.
     * order: Data base order field, used to order selector field.
     *        By defaulr "ord" if empty. If "use_custom_order" is given as value
     *        the order or selector field will be done by "order_by" value.
     * class: CSS Selector class, empty by default. 
     *        Bootstrap default is: "form-control input-sm"
     * style: Aditional CSS style to the selector.
     * 
     * empty_ini: If "true", an empty option will be added as first selector 
     *            value. Any text supplied but true will be used insted the 
     *            blank character.
     * empty_value: If "empty_ini" is created, a value can be supplied here.
     * name_array: If selector name is supplied by an array, this field must be
     *             the name of this array and value must match "name" parameter.
     *             I.E. if form name is "myform" and it is suplied as:
     *             myarray['myform'], the value to this option must be "myarray"
     *             and "name" option value must be "myname".
     * disable_err: True to return empty text on errors.
     * get_text_value: If true, get the text value from framework text using 
     *                 name as keyword
     * onchange: If true add the event onchange="this.form.submit()", if any 
     *           other data is supplied, use it as parameter of onchange event.
     * multiple: Generate a multiselect selector. If array name supplied, the 
     *           selector name will be name[] to allow multiple values.
     * id_ref: Generate a selector id with given value.
     * select2: Generate javascript for select2 if true
     * placeholder: Placeholder for the selector if using select2
     * disabled: Create the selector disabled.
     * required: Add required attribute to select if true
     * selector_empty: Alternative "selector empty error" text
     * title: Select title
     * tooltip: true to add data-toggle, bootstrap CSS & JS must be loaded
     * placement: data-placement used in data-toggle, default top
     * 
     * 
     * 
     * $sdata values related to MySQL data set:
     * ----------------------------------------
     * ref_field: Data base field to cross value with "ref_value", used to get 
     *            selector values from a table with many selectors data.
     *            The default value can by set in framework conf as class "def" and 
     *            key "selectors_ref_field". If all is empty, default is "ref".
     *            If value is "use_custom_where", a SQL where clause can
     *            be supplied in "ref_where".
     * ref_value: Value to suppy to "ref_field", same as name if empty.
     *            This value must match with the reference value to get actual
     *            selector list of options from selector's data base table.
     * ref_where: If selector list of values must be obtained with a complex
     *            where clause, it can be stated here, adding "use_custom_where"
     *            as "ref_field" value in configuration array.
     * no_where: Select all fields of a database if true (no where sentence)
     * order_by: If "use_custom_order" is supplied as value in "order" option
     *           you can supply a custom SQL order statement here.
     * only_name: If a value number is suplied, return only the name of given 
     *            value, instead a entire selector.
     * field_name: Valid with "only_name" switch. This is the name of field 
     *              that contains the data.
     * value_name: Valid with "only_name" switch. This is the name of data 
     *              to cross with $this->opt->field_name.
     * debug: true to activate debug output of MySQL query.
     * 
     * 
     * 
     * $sdata alternative data set:
     * ----------------------------
     * mysql_off: Disable the MySQL data set and load alternative data. 
     *            Data must be supplied in $dbdata as array or object.
     * dataset_id: Field that contains the data set ID (option id)
     * dataset_name: Field that contains the data set value (option name)
     * 
     * Alternative data set must be an array or object with this format:
     * (
     *   ['id']   => ['{id_value}']
     *   ['name'] => ['{name_value}']
     * }
     * 
     * 
     * 
     * 
     * MySQL database values to feed the select:
     * -----------------------------------------
     * $dbdata: Database table to get options for selectors. Must be supplied in
     *          JSON format or as array. If empty, value will be loaded from 
     *          framework conf category "def" key "selectors_data" as JSON, ie:
     *          ["selectors","value","name"]. If not value given and no 
     *          defaul found in conf, the maethod will return with error.
     *          Array must contain in this order: 
     *          "table name","field value","field name"
     * 
     * 
     * 
     * Alternative error messages option fields:
     * -----------------------------------------
     * txt_data_mut_be_array
     * txt_name_must_be_supplied
     * txt_json_dbdata_incorrect
     * txt_table_not_found
     * txt_value_field_not_found
     * txt_name_field_not_found
     * txt_selector_empty
     * txt_invalid_data_set
     * txt_only_name_incompatible_with_mysql_off
     * 
     * 
     * 
     * @param array|string $sdata array or json with selector data:
       [name,default,order,class,style,ref_field,ref_value,ref_where,no_where,
        order_by,empty_ini,empty_value,name_array,disable_err,only_name,
        field_name,value_name,get_text_value,onchange,multiple,id_ref,select2,
        placeholder,disabled,required,selector_empty,debug]
     * @param array|string $dbdata array or json with db data
     * @return string|boolean Select form | false if empty db data
     * 
     * default text keys: [name_must_be_supplied,selectors_data,
     * json_dbdata_incorrect,table_not_found,value_field_not_found,
     * name_field_not_found,selectors_ref_field,selectors_order_field,
     * selector_empty]
     * 
     */

Ejemplo con base de datos externa:
$datos = $wv->db->get_results("
    SELECT * FROM $dbn->db_datos1
        LEFT JOIN $dbn->db_datos2
            ON $dbn->db_datos1.id1 = $dbn->db_datos2.id2 ");

$dbdata = [];
foreach ((object)$datos as $d) {
    $dbdata[] = ['product_id'=>$d->id,'product_name'=>$d->name];
}

$sdata['mysql_off'] = true; //Desconecta el uso de MySQL
$sdata['name'] = "nombre";
$sdata['default'] = $default;
$sdata['empty_ini'] = "Elija uno";
$sdata['class'] = "form-control input-sm";
$sdata['id_ref'] = "fabricante";
$sdata['select2'] = true;

//Si los datos del selector no se llaman id y name
$sdata['dataset_id'] = "product_id"; //Por defecto id
$sdata['dataset_name'] = "product_name"; //Por defecto name

//Init classes
$wv->initClass(array('class_name' => 'selectForm','class_this' => true),1);

//Generate selector
$fabricante_selector = $wv->selectForm->getSelect($sdata,$dbdata);