Отношение “многие к одному” в Drupal, видение и реализация

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

Аватар пользователя inarty inarty 17 октября 2007 в 3:53

Столкнулся с проблемой отношения между нодами “многие к многим”.
Не всегда удобно использовать именно такое отношение, иногда нужно именно отношение “многие к одному”. Хочу поделится и обсудить свое видение и решение этой проблемы.
Пример: Есть список Properties (Объекты Недвижимости, content type), с каждым Property связан список Pages (content type). Хочу чтоб тупой юзер не выбирал из списка сотен pages нужные (node reference), чтоб присоединить их к выбранной Property, a нажал всего одну кнопочку add page. И вуа-ля Page добавлена в список.

Юзаю Drupal в основном как админ часть для Flash сайтов.

Реализация:

Modules:
CCK
View
Content Templates
Computed Field

Приступим:

Создаю content type Property (title,description,Type{select:недвижимость,земельные участки},Country{ select:Ukraine, France})

Создаю content type Page(Description, Images, Parent_Id {Computed Field}
Computed Field Code:

// получаю в это поле Get переменную parent_id из ссылки add page, расположенной в Property node
<?
if ($_GET["parent_id"]){
$node_field[0]['value']=$_GET["parent_id"];
}
?>
Далее создаю два View.

property_view:
+ Provide Page View
URL: property_view
View Type: Table view
Header:
<?php

if (node_access('create', 'property')) $out = 'Add New Property';
else $out = '';
print $out;
// l() function не пашет, криво encodit destination
// а destination нужно чтоб веонутся после создания node во view с выбранными exposed фильтрами.

?>
Fields: {Node: Title, Text: Type, Text: Country, Node: Edit link, Node: Delete link}
Filters: { Node: Type , Text: Type(exposed: Force Single, Lock Operator, Optional), Text: Country(exposed: Force Single, Lock Operator, Optional)}

page_view:
+ Provide Page View
URL: page_view
View Type: Table view
Fields: {Node: Title, Image: image (field_image), Node: Edit link, Node: Delete link}
!!!Arguments: {Computed: parent_id (field_parent_id)}
// для отображения pages привязанных к property внутри самой property node

Далее необходимо встроить page_view внутрь каждой property c соответствующим аргументом. Для этого использую модeль Content Templates и редактирую Template for Property (admin/content/templates/property), в поле body пишу php code:

<?php
if (node_access('create', 'page'))
$out = 'nid.'&destination=node/'.$node->nid.'">Add New Page';
else
$out = '';
print $out;

$viewarg = $node->nid;
$myview = views_get_view("page_view");
$myview_args = array(0 => $viewarg);
print views_build_view('embed', $myview, $myview_args, false, 0);

?>

Результат:
таким образом мы имеем удобную модель для тупого usera в которой ему не нужно идти на страницу create content для создания nodes property и привязанных к нему списков pages. Он просто всегда нажимает add для создания нодав, плюс дополнительные линки edit и delete дают ему возможность редактировать и удалять content прямо во View.

Замечания:
В эту модель я добавил систему breadcrumb – ов, с помощью function drupal_set_breadcrumb. Также удобно использовать модуль Save filter для сохранения exposed фильтров.

Вопросы:
!!! При уделинии property хотелось бы удалять все привязанные к нему pages
подскажите как правильно это сделать (куда дописать код для события delete property). И вообще как правильно унифицировать такую связь. Я отлично понимаю, что лучше написать корректный модуль и автоматичечки добавлять необходимые поля свзяи, но лично меня на это не хватит, я просо flash designer (+developer) и только от части php программер.
!!! Модуль Save filter сохраняет последнее положение exposed фильтра,
хотелось бы чтоб в меню была ссылка вида: property_view?filter0=**ALL**&filter1=**ALL**
для обнуления сохраненного фильтра (save нужен только в breadcrumb-ах).
Но ссылка типа property_view?filter0=**ALL**&filter1=**ALL** не работает, работает только полный путь: http://localhost/property_view?filter0=**ALL**&filter1=**ALL**
Но так узать это уж совсем тупо.

Кстати тут проблема та же что и в code:
<?php
$out = 'Add New Property';
я не могу здесь использовать l() function, Drupal как-то криво этоэнкодит.
?>

Очень жду обсуждения. помощи и предложений. Пассиб.

Комментарии

Аватар пользователя inarty inarty 18 октября 2007 в 2:03

Даффай, даффай. Вдруг придумаешь как красиво это реализовать, сразу пяши.
А вообсче подумываю уже писать модуль.