Реализация пользовательских подборок материалов на сайте электронной библиотеки: Вопрос.

Главные вкладки

Аватар пользователя sub-zero sub-zero 3 февраля 2008 в 20:18

Здравствуйте!

Возникла необходимость создать пользовательскую подборку материалов на сайте электронной библиотеки.

Задача:

Дать пользователям возможность после поиска сгруппировать материалы (электронные книги) в определённые список (подборку), которая будет отображаться в его меню «Мои подборки».
Так же пользователи должны видеть только свои подборки в этом меню.

Путь реализации:

для реализации потребуются модули:

-views
-cck
-views_bulk_operations
-taxonomy

-Создаём тип материала (в моём случае «книга»)
-Создаём словари для книг (в моём случае «автор», «заголовок», «год издания», «категория» и т. д.)
-Создаём тип материала «подборка» с полями «название подборки» - тип поля заголовок (стандартное), описание – стандартное поле текст и «материалы» с типом поля Node Reference, Autocomplete Text Field, в это поле будут вводится названия выбранных книг, а потом отображаться в виде ссылок.
-Создаём страничный вид с типом «список» для вывода подборок. И сразу сделаем для него пункт в меню «Мои подборки». Далее выбираем два основных фильтра: первый по типу материала – подборка, второй по автору – переменная, которой должно соответствовать имя пользователя, просматривающего этот вид (этот вид используется всеми пользователями, но за счёт этой переменной в нём отображаются записи, относящиеся к конкретному пользователю)
-Пишем сценарий в модуле views_bulk_operations, который открывает страницу создания типа материала «подборка» и вписывает в поле «материалы» выбранные пользователем названия книг. А название подборки и её описание пользователь вводит сам, а потом нажимает кнопку "Отправить".
-Создаём страничный вид с типом "Bulk Operations View" и выбираем нужные нам поля (в моём случае поля из словарей «автор», «заголовок», «год издания», «категория» и т. д.) и фильтр по типу материала (в моём случае «книга») и в меню «Действия» выбираем написанный нами сценарий.

Проблемы
1. включить в фильтр вида переменную, соответствующую имени авторизованного в данный момент пользователя
$view->filter = array (
array (
'tablename' => 'users',
'field' => 'uid',
'operator' => 'OR',
'options' => '',
'value' => array (
0 => '1', // здесь содержится id автора, он должен равняться id авторизованного пользователя (того, кто сморит этот вид). Как это можно сделать?
),
),
array (
'tablename' => 'node',
'field' => 'type',
'operator' => 'OR',
'options' => '',
'value' => array (
0 => 'podborka',
),
),
);
2. написать сценарий, который открывает страницу создания типа материала «подборка» и вписывает в поле «материалы» выбранные пользователем названия книг.
дело в том, что друпал не пишет в ссылках что и как создаёт, поэтому о содержании этого сценария можно только догадываться, наверное, что-то вроде «?q=node/add/podborka…» а дальше как?

Может быть кто-нибудь знает как решить эти проблемы?

Заранее благодарю

Комментарии

Аватар пользователя sub-zero sub-zero 4 февраля 2008 в 5:00

Спасибо!

А вот как формирует запрос сам views_bulk_operations:

/**
* Implementation of hook_node_operations().
*/
function views_bulk_operations_node_operations() {
$operations = array(
'bulk_delete' => array(
'label' => t('Delete'),
'callback' => 'views_bulk_operations_delete_nodes',
),
);
return $operations;
}

/**
* Based on node_delete()
*
* We implement our own node delete operation because we do not follow the
* conventional Drupal method of node deletion, which includes its own
* confirmation page. We use our own confirmation page and do our own
* access control checks.
*
*/
function views_bulk_operations_delete_nodes($nodes) {

foreach ($nodes as $nid) {
$node = node_load($nid);

if (node_access('delete', $node)) {
db_query('DELETE FROM {node} WHERE nid = %d', $node->nid); //запрос к базе на удаление
db_query('DELETE FROM {node_revisions} WHERE nid = %d', $node->nid);

// Call the node-specific callback (if any):
node_invoke($node, 'delete');
node_invoke_nodeapi($node, 'delete');

// Remove this node from the search index if needed. (удаление из поисковых индексов)
if (function_exists('search_wipe')) {
search_wipe($node->nid, 'node');
}
drupal_set_message(t('%title has been deleted.', array('%title' => $node->title)));
watchdog('content', t('type: deleted %title.', array('type' => t($node->type), '%title' => $node->title)));
$deleted_nodes++;
}
else {
drupal_set_message(t('Cannot delete "%title", permission denied.', array('%title' => $node->title)));
}
}
if ($deleted_nodes > 0) {
// Clear the cache so anonymous users no longer see deleted nodes.
cache_clear_all();
}
}

function theme_views_bulk_operations_view($view, $nodes, $type) {
$output = drupal_get_form('views_bulk_operations_form', $view, $nodes, $type);
return $output;
}

function theme_views_bulk_operations_confirmation($nodes) {
$count = 0;
$output = t('You selected the following nodes:').'

    ';
    foreach($nodes as $nid) {
    // Number of titles to display before we say "...and more"
    if ((VIEWS_BULK_OPS_MAX_CONFIRM_NODES > 0) && ($count >= VIEWS_BULK_OPS_MAX_CONFIRM_NODES)) {
    $output .= '
  • '.t('...and %remaining more.', array('%remaining' => count($nodes) - $count)).'
  • ';
    break;
    }
    if (is_numeric($nid) && $nid > 0) {
    $node = node_load($nid);
    $output .= '

  • '.$node->title.'
  • ';
    $count++;
    }
    }
    $output .= '

';
return $output;
}

может быть отсюда можно что-то взять?