Добрый день.
У меня вопрос такого рода.
Необходимо реализовать вывод формы редактирования ноды для пользователя из его личного кабинета... То есть для пользователя есть возможность создавать только одну ноду определенного типа, ее можно просматривать из личного кабинета, но надо так же реализовать возможность ее редактирования из того же личного кабинета.
Как можно это реализовать? У кого есть какие мысли на эту тему?
Спасибо
Комментарии
Через views создаете страницу типа /user/%/user_node с контекстным фильтром и т.д., страницу настройте так, чтобы отображалась как вкладка, с этим модулем можно сделать все поля вьюхи редактируемыми https://www.drupal.org/project/editableviews
Другой вариант - модуль, который создает страницу через hook_menu и отображает форму редактирования ноды на этой странице
Вы сайт откуда взяли?
Если её можно просматривать из личного кабинета, то это уже 90% уже готовой задачи. Нужно настроить права на возможность редактирования своих нод у пользователя.
И добавить ссылки на редактирование (зависит от того как сделан вывод своих нод в кабинете).
А можно подробнее про модуль с hook_menu... я с api друпала мало знаком.
Подробно о hook_menu
В page callback загружаете ноду (допустим по автору) и выводим форму редактирования для нее.
<?php
global $user;
$result = new EntityFieldQuery()->entityCondition('entity_type', 'node')
->propertyCondition('author', $user->uid)
->execute();
if (!empty($result['node'])) {
$node = node_load(reset($result['node']));
return drupal_get_form($node->type . '_node_form', $node);
}
else {
return node_add('my_node_type');
}
?>
Так у вас будет страница с формой редактирования ноды либо пустой формой, если нода еще не создана
Теперь другая проблема
Когда я указываю такой путь $items['user/%/node/edit'] = array( - то ничего не работает
А когда указываю явно uid пользователя $items['user/1/node/edit'] - то работает...
хук такой получился
function edit_node_tab_menu() {
$items['user/%/node/edit'] = array(
// 'access arguments' => array('view own profile'),
'page callback' => 'custom_call_node_edit',
'type' => MENU_DEFAULT_LOCAL_TASK,
'page arguments' => array(2),
);
return $items;
}
Подскажите в чем может быть проблема?
<?php
function edit_node_tab_menu() {
$items['user/%user/node_edit'] = array(
// 'access arguments' => array('view own profile'),
'page callback' => 'edit_node_tab_page',
'type' => MENU_LOCAL_TASK,
'page arguments' => array(1),
);
return $items;
}
?>
1. %user означает, что в будет вызван метод user_load и колбек будет передан уже объект user, а не просто его id.
2. все методы должны начинаться с имени модуля. Если имя модуля node_edit_tab, то и имя колбека должно начинаться с node_edit_tab
3. Чтобы появился таб, нужно, чтобы кол-во элементов в URI совпадало с кол-вом элементов в URI других табов. То есть, уже есть вкладка для user/%user/view и user/%user/edit, ваша вкладка отобразится только если путь user/%user/node_edit, а не user/%user/node/edit. Если очень нужен именно такой путь, то юзайте алиасы
4. Дефолтный таб уже выставлен для user/%user/view (см модуль юзер). Если хотите установить свой таб как дефолтный (отображающийся на страницу user/%user), то нужно добавить hook_menu_alter, поменять тип для user/%user/view. Хотя вряд ли вам это надо
Сделал учитывая ваши замечания, все равно не хочет работать... Но если указываю явно uid то все работает
Добавьте еще вот эти параметры.
<?php
'title' => t('Edit my node'),
'access callback' => true,
?>
Как именно не хочет работать? Страница отображается или нет, что в логах? Кэш после обновления кода чистили?
Код рабочий, я уверен. Где что-то у вас ошибка
У меня по сути есть views, с помощью него я создаю таб для редактирования... в модуле хочу перебить путь и вывести форму редактирования ноды... там идет завязка с uid... одна нода на каждого пользователя. Мне надо отобразить форму редактирования ноды на странице пользователя. Что бы все табы и страница осталась прежней, а в контентной части была форма редактирования.
на странице /user/%user хотите вывести форму редактирования ноды, я правильно понял?
Да, именно так.
Тогда еще так
<?php
$items['user/%user'] = array(
edit_node_tab_menu_alter(&$items) {
$items['user/%user/view'] = array_merge($items['user/%user'], $items['user/%user/view']);
$itesm['user/%user/view']['type'] = MENU_LOCAL_TASK;
'title' => 'My title',
'page callback' => 'edit_node_tab_page',
'page arguments' => array(1),
'access callback' => TRUE, // ваши параметры доступа
//'access arguments' => array(1), //ваши параметры доступа
);
} edit_node_tab_menu() {
$items['user/%user/edit_node'] = array(
'title' => 'Edit node',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -11,
);
}
?>