Well, I would not use a session for this task. It is (remotely) possible that two different admins access the module page simultaneosly, so you end up with stale data in the session about enabled modules, since inbetween modules can be enabled/disabled in another session. To get as close as possible, I would stuff a pre-submit callback into the form and a post-submit callback (ie. add a submit callback before the default submit callback and one after). You can do a select on enabled modules in the first callback, remember it (static function var). The second needs to do another select, ask for the static var from the first function and check the difference.
In an ideal world, it would be important that we should not only look at the status change (this is why the form array would not have enough information). If the status changed it only means that a module was enabled/disabled. But still, we don't know if a module was *installed* as part of being enabled, in which case the translations would import. Once a module is already installed, even if it is disabled, strings are kept in the database, so they should not be reimported (ie. because the user modified the translations) when reenabled.
Since we are not living in an ideal world, we would probably reload the strings into the database every time one module is enabled, but it would be good to keep the ideal situation in mind, so once this code gets into Drupal we have an already cleaner implementation and don't need to recode everything.
So, I would use two callback (not real function names :):
function autolocale_premoduleformsubmithandler($return = NULL) { static $module_data = array(); if (!isset($return)) { // SELECT module data (name, status field, schema_version) // stuff into $module_data; } else { return $module_data; } }
function autolocale_postmoduleformsubmithandler() { $pre_module_data = autolocale_premoduleformsubmithandler(TRUE); // SELECT module date (see above) // compare // import needed PO files }
I don't have time immediately to do it unfortunately, so help would be appreciated.
Gabor
On Thu, 18 Jan 2007, Jakub Suchy wrote:
Gabor Hojtsy wrote:
- Check the database (or the module_list()) in the early callback.
- Check it again at the callback called last.
- Compute the difference.
- Import what needs to be imported
Is this clean and does it have some catch? It works for me
function autolocale_form_alter($form_id, &$form) { // Process only if module form is displayed if ($form_id === "system_modules") {
// Determine which modules are enabled at the moment if (is_array($form['status']['#default_value'])) { $autolocale_modules = array(); foreach ($form['status']['#default_value'] as $module) { array_push($autolocale_modules, $module); }
// We MUST skip module confirm form if ($_GET['q'] != "admin/build/modules/list/confirm") { $enabled = array_diff($autolocale_modules, $_SESSION['autolocale_modules']); if (!empty($enabled)) { // These modules have been enabled print_r($enabled); // TODO } } // Store modules for next reload $_SESSION['autolocale_modules'] = $autolocale_modules;}
} } _______________________________________________ translations mailing list translations@drupal.org http://lists.drupal.org/mailman/listinfo/translations