Skip to content

Commit

Permalink
Properly port content type settings by using hook_page_alter().
Browse files Browse the repository at this point in the history
  • Loading branch information
Berdir committed Feb 8, 2011
1 parent 19311e7 commit 4c4480f
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 177 deletions.
127 changes: 11 additions & 116 deletions driven_props/driven_props.admin.inc
@@ -1,9 +1,9 @@
<?php
// $Id$

function driven_props_overview_form(&$form_state, $driver_mod, $node_type) {
function driven_props_overview_form($form, &$form_state, $driver_mod, $node_type) {
$form = array(
'#node_type' => $node_type,
'#node_type' => $node_type->type,
'#driver_mod' => $driver_mod,
);

Expand All @@ -27,8 +27,8 @@ function driven_props_overview_form(&$form_state, $driver_mod, $node_type) {
'#default_value' => FALSE,
);

$available_props = driven_properties_available($node_type);
$unsupported_props = array();
$available_props = driven_properties_available($node_type->type);
$unsupported_props = array();
$hook = 'unsupported_driven_props';
if (module_hook($driver_mod, $hook)) {
$unsupported_props = module_invoke($driver_mod, $hook, $available_props);
Expand All @@ -37,8 +37,8 @@ function driven_props_overview_form(&$form_state, $driver_mod, $node_type) {
if (empty($available_props)) {
$form['driven_props']['no_props'] = array(
'#type' => 'item',
'#value' => t('There are no driven properties exposed. You have to enable some property provider modules.'),
'#prefix' => '<div class="warning">',
'#markup' => t('There are no driven properties exposed. You have to enable some property provider modules.'),
'#prefix' => '<div class="warning messages">',
'#suffix' => '</div>',
);
}
Expand Down Expand Up @@ -66,18 +66,18 @@ function driven_props_overview_form(&$form_state, $driver_mod, $node_type) {
$elem[$target]['behaviors'] = _driven_props_retrieve_behaviors_form($driver_mod, $prop);
}
}
$varname = $driver_mod . ':type:' . $node_type . ':driven_props';
$varname = $driver_mod . ':type:' . $node_type->type . ':driven_props';
$settings = variable_get($varname, array());
_driven_props_load_settings($form['driven_props'], $settings);

$hook = 'driven_props_type_settings_form';
if (module_hook($driver_mod, $hook)) {
$form['driver_mod'] = module_invoke($driver_mod, $hook, $node_type);
$form['driver_mod'] = module_invoke($driver_mod, $hook, $node_type->type);
$form['driver_mod']['#tree'] = TRUE;
$varname = $driver_mod . ':type:' . $node_type->type . ':settings';
$settings = variable_get($varname, array());
_driven_props_load_settings($form['driver_mod'], $settings);
}
$varname = $driver_mod . ':type:' . $node_type . ':settings';
$settings = variable_get($varname, array());
_driven_props_load_settings($form['driver_mod'], $settings);

$form += driven_form_signature();
$form['buttons']['submit'] = array(
Expand Down Expand Up @@ -138,108 +138,3 @@ function driven_props_overview_form_submit($form, $form_state) {
}
}
}

/**
* Deferred function driven_props_types_overview_alter().
*/
function _driven_props_types_overview_alter(&$header, &$rows) {
$type_settings = driven_props_invoke_type_settings();
if (empty($type_settings)) {
return; // nothing to do
}

// point to the default local task,
$uri = 'driven-props';
if (count($type_settings) == 1) {
// there is only one driver_mod
$driver_mod = array_pop(array_keys($type_settings));
// don't point to the default local task,
// use the full task's path instead
//$uri = 'driven-props/' . str_replace('_', '-', $driver_mod);
$settings = array_pop($type_settings);
$link_text = $settings['task_title'];
}
else {
$link_text = t('driven properties');
}

// types should be sorted by their machine names [#814726]
// since 3rd party's custom types would alter their order
// @d7
// @todo Figure out the reason why this is so complicated in d6.
$names = node_type_get_names();
$row_index = -1;
$header[3]['colspan']++;
foreach ($names as $type => $human_readable_name) {
// mimic CCK behavior,
// they check node_hook in content types page,
// but not in hook_menu
if (node_hook($type, 'form')) {
$type_url_str = str_replace('_', '-', $type);
$row = &$rows[++$row_index];
// keep delete operation last
// (locked types have no delete operation, but they keep the respective cell)
$delete = array_pop($row);
// @d7
// @todo d6 version is not using consistent URL's for node type pages. bug?
$row[] = array('data' => l($link_text, 'admin/structure/types/' . $type_url_str . '/' . $uri));
$row[] = $delete;
}
}
}

/**
* Menu callback: replacement for node_overview_types().
*/
function driven_props_types_overview() {
// @d7
// mimics content_types_overview()
// except for:
// - colspan numbers
// - not providing hook_content_types_overview_alter
// @todo: Figure out if this is still necessary in D7. Also, again crazy
// node_get_types() usage.
$names = node_type_get_names();
$header = array(t('Name'), t('Type'), t('Description'), array('data' => t('Operations'), 'colspan' => '2'),);
$rows = array();

foreach ($names as $type => $name) {
if (node_hook($type, 'form')) {
$type_url_str = str_replace('_', '-', $type);
$row = array(
check_plain($name),
check_plain($type),
);
// Make the description smaller
$row[] = array('data' => filter_xss_admin($type->description), 'class' => 'description');
// Set the edit column.
$row[] = array('data' => l(t('edit'), 'admin/content/node-type/'. $type_url_str));

// Set the delete column.
if ($type->custom) {
$row[] = array('data' => l(t('delete'), 'admin/content/node-type/'. $type_url_str .'/delete'));
}
else {
$row[] = array('data' => '');
}

$rows[] = $row;
}
}

// Allow external modules alter the table headers and rows.
//foreach (module_implements('content_types_overview_alter') as $module) {
// $function = $module .'_content_types_overview_alter';
// $function($header, $rows);
//}
_driven_props_types_overview_alter($header, $rows);

if (empty($rows)) {
// if there were no resulting rows then header shouldn't have more columns/colspans
$rows[] = array(array('data' => t('No content types available.'), 'colspan' => '5', 'class' => 'message'));
}

// @todo content_overview_links seems to be related to cck. Why use it if this
// page is only used when cck is *not* enabled?
return theme('table', array('table' => $header, 'rows' => $rows)) . theme('content_overview_links');
}
143 changes: 82 additions & 61 deletions driven_props/driven_props.module
Expand Up @@ -143,64 +143,38 @@ function driven_props_menu() {

$type_settings = driven_props_invoke_type_settings();
if (!empty($type_settings)) {
$weight = 10; // CCK uses 1 & 2, lets go last
// @d7
$types = node_type_get_names();
// Add this as last element.
$weight = 10;
foreach ($type_settings as $driver_mod => $settings) {
foreach ($types as $type => $type) {
// mimic CCK behavior,
// they check node_hook in content types page,
// but not in hook_menu
$uri = str_replace('_', '-', $driver_mod);
$type_url_str = str_replace('_', '-', $type);
// @d7
$base_uri = 'admin/structure/types/'. $type_url_str .'/driven-props';
// careful, base_uri without trailing slash to be used as default task
$full_uri = $base_uri . '/' . $uri;
$task_title = $settings['menu_title'];
$default_task = !isset($menu[$base_uri]);

$menu[$default_task ? $base_uri : $full_uri] = array(
'title' => ($default_task && count($type_settings) > 1) ? 'Driven properties' : $task_title,
'page callback' => 'drupal_get_form',
'page arguments' => array('driven_props_overview_form', $driver_mod, $node_type),
'access arguments' => array('administer content types'),
'file' => 'driven_props.admin.inc',
'type' => MENU_LOCAL_TASK,
'weight' => $weight++,
// @d7
$base_uri = 'admin/structure/types/manage/%node_type/driven-props';
$uri = str_replace('_', '-', $driver_mod);
// careful, base_uri without trailing slash to be used as default task
$full_uri = $base_uri . '/' . $uri;
$task_title = $settings['menu_title'];
$default_task = !isset($menu[$base_uri]);

$menu[$default_task ? $base_uri : $full_uri] = array(
'title' => ($default_task && count($type_settings) > 1) ? 'Driven properties' : $task_title,
'page callback' => 'drupal_get_form',
'page arguments' => array('driven_props_overview_form', $driver_mod, 4),
'access arguments' => array('administer content types'),
'file' => 'driven_props.admin.inc',
'type' => MENU_LOCAL_TASK,
'weight' => $weight++,
);
if ($default_task) {
$menu[$full_uri] = array(
'title' => $task_title,
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
if ($default_task) {
$menu[$full_uri] = array(
'title' => $task_title,
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
}
}
}
}

}
return $menu;
}

/**
* Implements hook_menu_alter().
*/
function driven_props_menu_alter(&$menu) {
// @d6
// if CCK is installed we'll use its content_types_overview_alter instead
// @todo: Figure out what needs to be done for D7 here.
if (!module_exists('content')) {
// @d7
$menu_types = &$menu['admin/structure/types'];

$menu_types['page callback'] = 'driven_props_types_overview';
$menu_types['file'] = 'driven_props.admin.inc';
$menu_types['file path'] = drupal_get_path('module', 'driven_props');
}
}

// helper function for driver mods
function driven_props_delete_settings($driver_mod, $node_type) {
$varnames = array(
Expand All @@ -212,16 +186,6 @@ function driven_props_delete_settings($driver_mod, $node_type) {
}
}

/**
* Implements hook_content_types_overview_alter().
*
* @todo: Figure out what to do with this in D7.
*/
function driven_props_content_types_overview_alter(&$header, &$rows) {
module_load_include('inc', 'driven_props', 'driven_props.admin');
_driven_props_types_overview_alter($header, $rows);
}

function _driven_props_retrieve_behaviors_form($driver_mod, $prop) {
$behaviors_form = array();
$node_type = $prop['meta']['node_type'];
Expand Down Expand Up @@ -325,3 +289,60 @@ function _driven_props_behavior_value($element, $behaviors_settings) {
// will help avoiding typo bugs
return driven_form_state_value($element['#parents'], $form_values);
}

/**
* Implements hook_page_alter().
*/
function driven_props_page_alter(&$page) {
if (isset($page['content']['system_main']['node_table'])) {
_driven_props_types_overview_alter($page['content']['system_main']['node_table']['#header'], $page['content']['system_main']['node_table']['#rows']);
}
}


/**
* Deferred function driven_props_types_overview_alter().
*/
function _driven_props_types_overview_alter(&$header, &$rows) {
$type_settings = driven_props_invoke_type_settings();
if (empty($type_settings)) {
return; // nothing to do
}

// point to the default local task,
$uri = 'driven-props';
if (count($type_settings) == 1) {
// there is only one driver_mod
$driver_mod = array_pop(array_keys($type_settings));
// don't point to the default local task,
// use the full task's path instead
//$uri = 'driven-props/' . str_replace('_', '-', $driver_mod);
$settings = array_pop($type_settings);
$link_text = $settings['task_title'];
}
else {
$link_text = t('driven properties');
}

// types should be sorted by their machine names [#814726]
// since 3rd party's custom types would alter their order
// @d7
$names = node_type_get_names();
$row_index = -1;
$header[1]['colspan']++;
foreach ($names as $type => $human_readable_name) {
// mimic CCK behavior,
// they check node_hook in content types page,
// but not in hook_menu
if (node_hook($type, 'form')) {
$type_url_str = str_replace('_', '-', $type);
$row = &$rows[++$row_index];
// keep delete operation last
// (locked types have no delete operation, but they keep the respective cell)
$delete = array_pop($row);
// @d7
$row[] = array('data' => l($link_text, 'admin/structure/types/manage/' . $type_url_str . '/' . $uri));
$row[] = $delete;
}
}
}

0 comments on commit 4c4480f

Please sign in to comment.