Module CustomFields Cases: Difference between revisions

Jump to navigation Jump to search
→‎Overloading functions: Adding another example
(→‎Overloading functions: Adding another example)
Line 196: Line 196:


= Overloading functions =
= Overloading functions =
Here are a few concrete use cases of overloading functions to achieve various goals.
== Dynamic list selection based on another one ==


The goal is to show two custom fields on the Third-Party module: one which gives the zone (secteur) of the third-party (Isere, Alpes du sud, Haute-Savoie...) and the other which gives relative to the zone the list of all the ski resorts (station_a) inside the selected zone.
The goal is to show two custom fields on the Third-Party module: one which gives the zone (secteur) of the third-party (Isere, Alpes du sud, Haute-Savoie...) and the other which gives relative to the zone the list of all the ski resorts (station_a) inside the selected zone.
Line 210: Line 214:


In CustomFields's admin panel, we create two custom fields:
In CustomFields's admin panel, we create two custom fields:
1-secteur: returns the list of all zones - type DropdownBox: enum('- Aucun','Alpes du Sud','export','Haute-Savoie','Isère', etc...)
 
2-station_a: returns the list of all ski resorts - type constraint on '''llx_k_station'''
1- secteur: returns the list of all zones - type DropdownBox: enum('- Aucun','Alpes du Sud','export','Haute-Savoie','Isère', etc...)
 
2- station_a: returns the list of all ski resorts - type constraint on '''llx_k_station'''


Here is the code to put in customfields_fields_extend.lib.php that will allow to show only the ski resorts corresponding to the selected zone:
Here is the code to put in customfields_fields_extend.lib.php that will allow to show only the ski resorts corresponding to the selected zone:
Line 237: Line 243:


Thank's to manub for giving this case.
Thank's to manub for giving this case.
== Dynamic discount computation per products lines on propales ==
The goal here is to compute the discount for a product line in propales based on a computation on three custom fields.
First, create three custom fields for "Line commercial proposals": vl, cpl and lc.
Then add the following overloading function at the end of your customfields_fields_extend.lib.php file (read the comments for more informations):
<source lang="php">
function customfields_field_save_propaldet_vl (&$currentmodule, &$object, &$action, &$user, &$customfields, &$field, &$name) {
    global $db; // allow to access database functions
    // Fetch the new posted values
    // All $_POST data are generically appended into the $object properties
    $vl = $object->{$customfields->varprefix.'vl'};
    $cpl = $object->{$customfields->varprefix.'cpl'};
    $lc = $object->{$customfields->varprefix.'lc'};
    // Compute the discount
    $remise_calculee = (100 - $vl) * (100 - $cpl) * (100 - $lc);
    // Clean parameters
    include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
    $remise_calculee = price2num($remise_calculee);
    // Assign the new discount into the PropalLine object
    $object->remise_percent = $remise_calculee;
    // Update the price (won't be automatic)
    global $mysoc;
    $localtaxes_type=getLocalTaxesFromRate($object->tva_tx,0,$mysoc);
    $tabprice=calcul_price_total($object->qty, $object->price, $object->remise_percent, $object->tva_tx, $object->localtax1_tx, $object->localtax2_tx, 0, 'HT', $object->info_bits, $object->type, '', $localtaxes_type);
    $object->total_ht  = $tabprice[0];
    $object->total_tva = $tabprice[1];
    $object->total_ttc = $tabprice[2];
    $object->total_localtax1 = $tabprice[9];
    $object->total_localtax2 = $tabprice[10];
    // Update into database
    $object->update(true); // true to disable the trigger, else it will recall customfields, which will call this overloading function, etc. in an infinite loop.
    $object->update_total();
    //$q = "UPDATE  ".MAIN_DB_PREFIX."propaldet SET remise_percent=".$remise_calculee." WHERE  rowid=".$object->rowid;
    //$db->query($q);
   
    // Finally, cleanup POST data to avoid conflicts next time, reinserting the same discount. Else the fields will remember these values and it may mistakenly reuse the same values.
    unset($_POST[$customfields->varprefix."vl"]);
    unset($_POST[$customfields->varprefix."cpl"]);
    unset($_POST[$customfields->varprefix."lc"]);
}
</source>


= Linking Dolibarr objects from two different modules =
= Linking Dolibarr objects from two different modules =
439

edits

Navigation menu