Quiero dejar que los usuarios no publiquen y publiquen su propio contenido. De manera predeterminada, debe otorgar permiso para "administrar nodos" para que los usuarios puedan publicar o publicar contenido. Sin embargo, esa es una forma amplia. Quiero permitir a los usuarios que no publiquen o publiquen un nodo si y solo si lo crearon. Esto también significa que deberían poder ver nodos no publicados si y solo si lo crearon.
Un enfoque de UI que he usado en algunos sitios es el módulo Override Node Options , agrega permisos similares a los que proporciona mi otra respuesta, más un montón adicional.
Siempre usamos el módulo Publicar contenido para eso. Agrega una cantidad de permisos específicos y una pestaña de publicación/no publicación en los nodos.
Este modulo
- permite permisos granulares de publicación y no publicación:
- global (anular/publicar cualquier contenido)
- por "tipo de nodo" (anular/publicar cualquier contenido [nodetype])
- por usuario (anular/publicar contenido propio [tipo de nodo]
- agrega una pestaña "Publicar/No publicar" a la página del nodo para deshacer/publicar con un clic.
- expone enlaces de publicación/publicación a sus vistas, lo que facilita la agilización de los flujos de trabajo para revisores, editores y editores.
- es ligero y siempre lo será.
Recomiendo usar Módulo de revisión que le brinda algunos beneficios sobre los métodos anteriores. Uno, por supuesto, es que es un módulo totalmente mantenido y, por lo tanto, habrá muchos ojos en el código y muchas correcciones de errores. Dos, obtendrá más funciones para adaptar esto a su flujo de trabajo general.
Para su caso de uso, otorga a sus usuarios los permisos de "creador" y de "moderador", para que puedan moderar básicamente su propio contenido, pero como se dice en la descripción del módulo, no son dado poderes divinos como dar 'administrar nodos' daría.
Hay un módulo que hace esto, pero no puedo recordar el nombre. De hecho, sentí que el enfoque que tomó el módulo era demasiado engorroso, tenía mucho código cuando el código importante real era solo una línea envuelta con alguna lógica de permiso.
Esta es mi versión del código:
function MYMODULE_perm() {
$perms[] = 'administer status of any content';
foreach (node_get_types() as $type) {
if (isset($type->type)) {
$perms[] = 'administer status of any '. check_plain($type->type) .' content';
$perms[] = 'administer status of own '. check_plain($type->type) .' content';
}
}
return $perms;
}
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form['#id'] == 'node-form' && $form_id == "{$form['#node']->type}_node_form" && _MYMODULE_access($form['#node']->type)) {
if ($form['options']['#access'] == FALSE) {
$form['options']['#access'] = TRUE;
}
}
}
function _MYMODULE_access($type) {
return user_access('administer status of any content')
|| user_access('administer status of any ' . check_plain($type) . ' content')
|| user_access('administer status of own ' . check_plain($type) . ' content');
}
Eso agrega algunos permisos adicionales que le permiten permitir a los usuarios publicar/publicar su propio tipo de contenido o todo, y todos los tipos de contenido, establezcan cómo lo deseen.
Solo quiero actualizar la respuesta de Decipher, la bruja me parece el mejor enfoque si no desea agregar otro módulo, que se ajuste a Drupal 7:
/**
* Implements hook_permission().
*/
function MYMODULE_permission() {
$perms = array(
'administer status of any content' => array(
'title' => t('Administer status for all content type'),
'description' => t(''),
'restrict access' => true
),
);
foreach (node_type_get_types() as $type) {
if (isset($type->type)) {
$perm_types = array(
'administer status of any '. check_plain($type->type) .' content' => array(
'title' => t('Administer status of any '. check_plain($type->type) .' content'),
'description' => t(''),
),
'administer status of own '. check_plain($type->type) .' content' => array(
'title' => t('Administer status of own '. check_plain($type->type) .' content'),
'description' => t(''),
),
);
$perms = array_merge($perms,$perm_types);
}
}
return $perms;
}
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if (preg_match('/_node_form$/', $form_id) && _MYMODULE_access($form['#node']->type)) {
if ($form['options']['#access'] == FALSE) {
$form['options']['#access'] = TRUE;
}
}
}
function _MYMODULE_access($type) {
return user_access('administer status of any content')
|| user_access('administer status of any ' . check_plain($type) . ' content')
|| user_access('administer status of own ' . check_plain($type) . ' content');
}
Puede lograr esto combinando el poder de los módulos Bandera y Reglas .