Index: modules/block/block.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.admin.inc,v retrieving revision 1.34 diff -u -p -r1.34 block.admin.inc --- modules/block/block.admin.inc 3 Feb 2009 18:55:30 -0000 1.34 +++ modules/block/block.admin.inc 6 Feb 2009 10:05:25 -0000 @@ -155,7 +155,34 @@ function block_admin_configure(&$form_st ); $edit = db_fetch_array(db_query("SELECT pages, visibility, custom, title FROM {block} WHERE module = '%s' AND delta = '%s'", $module, $delta)); - + + // Multilingual system. + if (module_exists('locale')) { + if ($edit) { + $result = db_query("SELECT language FROM {block_language} WHERE module = '%s' AND delta = '%s'", $module, $delta); + while ($lang = db_fetch_object($result)) { + $edit['languages'][] = $lang->language; + } + } + $form['language'] = array( + '#type' => 'fieldset', + '#title' => t('Multilingual settings'), + '#collapsible' => TRUE, + '#weight' => -1, + ); + + $options = array('any_language' => t('All languages')); + $options += locale_language_list('name'); + + $form['language']['languages'] = array( + '#type' => 'select', + '#title' => t('Language'), + '#default_value' => isset($edit['languages']) ? $edit['languages'] : 'any_language', + '#options' => $options, + '#multiple' => TRUE, + ); + } + $form['block_settings'] = array( '#type' => 'fieldset', '#title' => t('Block specific settings'), @@ -281,6 +308,25 @@ function block_admin_configure_validate( function block_admin_configure_submit($form, &$form_state) { if (!form_get_errors()) { db_query("UPDATE {block} SET visibility = %d, pages = '%s', custom = %d, title = '%s' WHERE module = '%s' AND delta = '%s'", $form_state['values']['visibility'], trim($form_state['values']['pages']), $form_state['values']['custom'], $form_state['values']['title'], $form_state['values']['module'], $form_state['values']['delta']); + + if (module_exists('locale')){ + // Add languages to the languages table, or clear the relevant rows if no/all languages are selected: + // Dirty trick to act on new created blocks. Delta may be zero for other modules than block. + if (!$form_state['values']['delta'] && $form_state['values']['module'] == 'block') { + // The last insert id will return a different value in mysql + //$values['delta'] = db_last_insert_id('boxes', 'bid'); //API indicates this function will be obselete: http://api.drupal.org/api/function/db_last_insert_id/7 + $form_state['values']['delta'] = db_result(db_query("SELECT MAX(bid) FROM {boxes}")); + } + $languages = $form_state['values']['languages']; + db_query("DELETE FROM {block_language} WHERE module = '%s' AND delta = '%s'", $form_state['values']['module'], $form_state['values']['delta']); + // Only update the table if some language is chosen + if (!empty($languages) && !in_array('any_language', $languages)) { + foreach (array_filter($languages) as $language) { + db_query("INSERT INTO {block_language} (module, delta, language) VALUES ('%s', '%s', '%s')", $form_state['values']['module'], $form_state['values']['delta'], $language); + } + } + } + db_query("DELETE FROM {block_role} WHERE module = '%s' AND delta = '%s'", $form_state['values']['module'], $form_state['values']['delta']); foreach (array_filter($form_state['values']['roles']) as $rid) { db_query("INSERT INTO {block_role} (rid, module, delta) VALUES (%d, '%s', '%s')", $rid, $form_state['values']['module'], $form_state['values']['delta']); Index: modules/block/block.install =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.install,v retrieving revision 1.18 diff -u -p -r1.18 block.install --- modules/block/block.install 3 Feb 2009 12:30:14 -0000 1.18 +++ modules/block/block.install 6 Feb 2009 10:05:25 -0000 @@ -161,7 +161,32 @@ function block_schema() { ), 'primary key' => array('bid'), ); - + + $schema['block_language'] = array( + 'description' => t('Multilingual blocks information.'), + 'fields' => array( + 'module' => array( + 'type' => 'varchar', + 'length' => 64, + 'not null' => TRUE, + 'description' => t("The block's origin module, from {blocks}.module."), + ), + 'delta' => array( + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + 'default' => '0', + 'description' => t('Unique ID for block within a module.'), + ), + 'language' => array( + 'type' => 'varchar', + 'length' => 12, + 'description' => t('Block language.'), + 'not null' => TRUE, + 'default' => '', + ), + ), + ); $schema['cache_block'] = drupal_get_schema_unprocessed('system', 'cache'); $schema['cache_block']['description'] = 'Cache table for the Block module to store already built blocks, identified by module, delta, and various contexts which may change the block, such as theme, locale, and caching mode defined for the block.'; @@ -188,3 +213,13 @@ function block_uninstall() { function block_update_7000() { return array(); } + +/** + * Add the block_language table, to handle multilingual blocks + */ +function block_update_7001() { + $schema = block_schema(); + $ret = array(); + db_create_table($ret, 'block_language', $schema['block_language']); + return $ret; +}