it-swarm-es.com

¿Cómo hacer que un MENU_LOCAL_TASK en el perfil de un usuario solo aparezca en su perfil?

Utilizo una lógica como esta para colocar una pestaña en la página de perfil de cada usuario para que los usuarios puedan ver los análisis del uso de una aplicación web:

  // maps a url to a sub-page of user's profile, url to user's Analytics-Management form
  $items['user/%user/ClientCompanyName'] = array(
    'title'            => 'ClientCompanyName',
    'description'      => 'Manage your ClientCompanyName services.',
    'page callback'    => 'drupal_get_form',
    'page arguments'   => array('_ClientCompanyName_mgmt_form'),
    'access callback'  => 'user_access',
    'access arguments' => array( 'access ClientCompanyName services' ), 
    'type' => MENU_LOCAL_TASK,
  );

Esto funciona muy bien para cada usuario, pero no quiero que un usuario pueda ir al perfil de otro usuario y presionar su enlace para acceder a los datos analíticos privados de ese otro usuario.

Actualmente, si un usuario intenta visitar la página de administración de análisis de otro usuario, ve una página de acceso denegado.

Pero me gustaría que ni siquiera se les diera el enlace a esa página. Intenté escribir mi propia 'devolución de llamada de acceso', pero no puedo averiguar cómo pasar la parte '% usuario' de la URL deseada para poder probarla con el usuario que inició sesión ...

Me gusta cómo se pueden usar los símbolos '%' en la URL, y luego se pueden usar 'argumentos de página' para hacer referencia a esos argumentos en la URL. ¿Es posible hacer algo similar con los 'argumentos de acceso'?

Esencialmente, estoy tratando de lograr lo mismo que el comportamiento de la pestaña 'editar' en el perfil de un usuario: solo si el usuario está en su propia página de perfil, aparecerá la pestaña 'editar' en el perfil. ¿Cómo obtengo el mismo efecto para mi página de análisis de aplicaciones web?

(Supongo que podría hacer que mi página de análisis sea un MENU_LOCAL_TASK del formulario de edición de perfil ... pero aún me gustaría saber cómo crear un MENU_LOCAL_TASK condicional cuyo condicional es más que simplemente una prueba de permisos de user_access ()).

3
Blake Senftner

En lugar de user_access, defina su propia función de devolución de llamada de acceso y luego pase el objeto de usuario a eso.

Entonces 'access callback' => 'yourmodule_analytics_access' Y 'access arguments' => array(1).

En esa función, compare el ID de usuario y verifique el permiso.

function yourmodule_analytics_access($account) {
  global $user;
  return $user->uid == $account->uid && user_access('access ClientCompanyName services');
} 
6
Berdir

Terminé usando una devolución de llamada de acceso personalizada como esta:

// this makes the analytics user profile tab's MENU_LOCAL_TAB conditional:
function _cex_mgmt_access($accessAllowed) {
  global $user;
  if (arg(1) != $user->uid)
    return false;
  return user_access($accessAllowed);
}

Donde el 'access callback' parámetro en la definición de MENU_LOCAL_TASK se establece en '_cex_mgmt_access' más bien que 'user_access'.

No estoy seguro de este método. Depende de la lógica del módulo de menú que maneja la definición de MENU_LOCAL_TASK para ser procesada cada vez que un usuario viaja a cualquier página de perfil. ¿No se almacena en caché esa información (si el almacenamiento en caché está activado)?

1
Blake Senftner