[development] inferring which file to include based on page callback array

Moshe Weitzman weitzman at tejasa.com
Mon Jun 11 19:05:56 UTC 2007

Larry Garfield wrote:
> On Sun, 10 Jun 2007 22:13:04 -0400, Moshe Weitzman <weitzman at tejasa.com> wrote:
>>> I ran into this issue in the context of "which file do we need to include
>> so
>>> that this function becomes available".  The file was module-dependent. 
>> The
>>> function then did not exist yet, so module_implements() and
>> function_exists()
>>> won't work.
>> many keep saying that, but there is an easy fix. just use
>> module_invoke('og', 'vocab') if thats what is meant. then module_invoke
>> can do the needed includes. module invoke makes explicit the module that
>> owns the function.
> That again assumes that the code running that line knows which part of the function is the module and which isn't.  If you are given the string:
> "foo_bar_baz_ugh_agh"
> Is that the foo module, function bar_baz_ugh_agh?  Or the foo_bar_baz module function ug_agh?  Or foo_bar_baz_ugh module function agh?  That cannot be determined without a guess-and-check method.  That's precisely why I didn't go that route for the menu-split patch.

You are assuming that I am assuming :). I hadn't spelled it all out yet ...

Right now, hook_menu() accepts only a string as the value of 'page 
callback' element. lets say we allow a simple array with 2 values. the 
values will be the first two arguments of module_invoke(). in this case 
  menu_execute_active_item() would then perform a module_invoke() 
instead of a direct call_user_func_array(). then the including of the 
right file gets done in module_invoke(), not directly specified in the 
menu item definition.

here is an example from current HEAD and how I propose. Note that 'file' 
element is gone, and we know definitively that it belongs to 
system.module based on the page callback value.

   $items['admin/build'] = array(
     'title' => 'Site building',
     'page callback' => 'system_admin_menu_block_page',
     'file' => 'system.admin.inc',

   $items['admin/build'] = array(
     'title' => 'Site building',
     'page callback' => array('system, 'admin_menu_block_page'),

Note that we may still have to support a string as a page callback (i 
think) for non module defined callbacks.

More information about the development mailing list