欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

反向节点引点 得到被关联对象 有大用

1) 我常用的方法是根据 sql 语名  从被引用对象得到引用对象的nid

2)  使用下面这个模块 不过我没有试过
 https://www.drupal.org/project/reverse_node_reference

3)  使用下面这个模块 不过我没有试过
https://www.drupal.org/project/cnr

在Drupal中暴露反向实体引用字段

发布日期: 
星期一,11/16/2015 - 13:55
标签: 
困难: 
开始狂欢吧

Drupal中的实体引用是用于做某些“正确”的机制(对于引号而言,这是令人遗憾的,但是你可以用Drupal实现的是几年后的真正的ORM,例如实体框架在可用性,可靠性,灵活性和overal质量方面)建模,而不必从头开始编写所有内容,包括查询,小部件和存储。 

Drupal 8本身支持实体引用字段,而在Drupal 7中,你不得不求助于实体引用  或引用模块(和其他一些...)。

在这篇文章中,我将向您展示如何自动填充所有实体引用字段的反向引用字段,以便您可以利用EntityMetadataWrapper以两种方式浏览关系。

想象一下,我有两个实体:  用户订单。 订单有一个实体引用字段给用户调用' field_owner '。

如果在订单实体上有一个元数据包装器,你可以很容易地通过'field_owner'访问User实体引用,如下所示:

// Load order #25
$order = UtilsEntity::entity_metadata_wrapper('order', 25);
// Retrieve the name of the owner.
$owner_name = $order->field_owner->name->value();

但是,如果我想以相反的方式浏览这种关系,也就是列出给定用户实体的所有订单呢?

不是一件大事,但你必须写一个简单的查询或使用EntityFieldQuery。

这将是更容易和直接,如果 - 像许多ORM的 - 相反的关系被暴露为一个字段本身,所以你可以做这样的事情:

// Load user uid = 1
$user = UtilsEntity::entity_metadata_wrapper('user', 1);
foreach ($user->reverse_order_field_owner as $order) {
  // Do somthing with this order.
}

也许这个例子不是最好的用例,因为用户可能有订单的hunders,这种方法根本不会缩放。以某种方式暴露反向关系的ORM也提供了在数据库级过滤结果所需的工具。

这可以通过为暴露反向引用的新虚拟属性实现钩子和回调方法来轻松实现。这是一个示例代码,将与Node Reference和实体引用Drupal 7模块一起工作。

namespace Drupal\fdf\EntityReverseRelationship;

use Drupal\fdf\Utilities\UtilsFdf;
use Drupal\fdf\FdfCore;
use Drupal\fdf\Utilities\UtilsEntity;

class Hooks {

  /**
   * Implements hook_entity_property_info_alter.
   */
  public static function hook_entity_property_info_alter(&$info) {

    // Para cada entidad crearemos una propiedad inversa para cada referencia
    // que la tenga a ella como destino. Hay 2 tipos de campo para ello: entityreference y node_reference.
    $fields = field_info_fields();

    foreach ($fields as $field) {
      switch ($field['type']) {
        case 'entityreference':
          $field_name = $field['field_name'];
          $entity_type = $field['settings']['target_type'];

          $bundles = array();
          if (!empty($instance['settings']['handler_settings']['target_bundles'])) {
            $bundles = $instance['settings']['handler_settings']['target_bundles'];
          }
          else {
            $available_bundles = isset($info[$entity_type]['bundles']) ? $info[$entity_type]['bundles'] : FALSE;
            if($available_bundles && isset($available_bundles[$entity_type])){
              $bundles = array($entity_type);
            }
          }

          foreach ($bundles as $bundle) {
            if (isset($info[$entity_type]['bundles'][$bundle])) {
              $info[$entity_type]['bundles'][$bundle]['properties']["reverse_{$field_name}"] = array(
                'label' => 'Reverse reference entity from field ' . $field_name,
                'description' => 'Reverse reference entity from field ' . $field_name,
                'type' => 'list<' . $entity_type . '>',
                'getter callback' => FdfCore::RegisterGlobalFunctionMap(UtilsFdf::GetStaticMethodCallback(static::class, 'GetReverseNodeEntity'), 'fdf_reverse_relationship', FALSE),
                'computed' => TRUE,
                // Para construir los listados de referencias necesitamos saber qué entidades y bundles apuntana  nosotros.
                'fdf_back_reference' => array('bundles' => $field['bundles'], 'field' => $field_name),
              );
            }
          }
          break;
        case 'node_reference':
          $types = $field['settings']['referenceable_types'];
          foreach ($types as $type) {
            if ($type == FALSE) {
              continue;
            }
            if (isset($info['node']['bundles'][$type])) {
              $field_name = $field['field_name'];
              $info['node']['bundles'][$type]['properties']["reverse_{$field_name}"] = array(
                'label' => 'Reverse reference node from field ' . $field_name,
                'description' => 'Reverse reference node from field ' . $field_name,
                'type' => 'list<node>',
                'getter callback' => FdfCore::RegisterGlobalFunctionMap(UtilsFdf::GetStaticMethodCallback(static::class, 'GetReverseNodeEntity'), 'fdf_reverse_relationship', FALSE),
                'computed' => TRUE,
                // Para construir los listados de referencias necesitamos saber qué entidades y bundles apuntana  nosotros.
                'fdf_back_reference' => array('bundles' => $field['bundles'], 'field' => $field_name),
              );    
            }
          }
          break;
      }
    }
  }

  /**
   * Summary of GetReverseNodeEntity
   * @param mixed $entity 
   * @param array $options 
   * @param mixed $name 
   * @param mixed $entity_type 
   * @param mixed $property_info 
   * @return array
   */
  public static function GetReverseNodeEntity($entity, array $options, $name, $entity_type, $property_info) {

    // Need the entity type the flag applies to.
    $remote_field = $property_info['fdf_back_reference']['field'];
    $remote_bundles = $property_info['fdf_back_reference']['bundles'];

    if (count($remote_bundles) > 1) {
      // D8 does not allow sharing fields between entities.
      watchdog('fdf reverse fields', 'Cannot inspect reverse reference field when it appears in two different entities.');
      return array();
    }

    $wrapper = UtilsEntity::entity_metadata_wrapper($entity_type, $entity);

    // Solo debería haber uno de estos...
    $remote_entity = array_keys($remote_bundles)[0];

    $query = new \EntityFieldQuery($remote_bundles);

    $query->entityCondition('entity_type', $remote_entity)
      ->fieldCondition($remote_field, 'target_id', $wrapper->getIdentifier(), '=')
      ->addMetaData('account', user_load(1)); // Run the query as user 1.

    $result = $query->execute();

    if (isset($result[$remote_entity])) {
      return array_keys($result[$remote_entity]);
    }
    
    return array();
  }
}

现在Drupal 8已经将实体引用集成到核心,在MetadataWrapper和EntityQuery中都有类似的东西是很好的,这样我们就可以得到一个直接和管理的方式来导航和查询越来越复杂的数据模型,而不必手动写SQL查询(这可能是相当混乱感谢Drupal的设计存储模型)。

当然这仍然是非常有限的,但会做一个工作范围的Drupal基础的项目通常是。

来自 http://www.drupalonwindows.com/en/blog/exposing-reverse-entity-reference-fields-drupal


反引用(列出引用目标节点的节点)


不知道我是一个白痴,或者如果这是不可能的。下面是场景:

我有2个节点类型:RESTAURANTS和OFFERS。我使用这个模块来引用RESTAURANT节点的OFFER。因此,当我们创建优惠时,我们会选择适用的餐厅。

我有一个视图列出了OFFERS和通过视图中的关系,我可以访问从RESTAURANT的信息,从引用的OFFER。因此,例如,报价列表可以显示其适用的餐馆的地址。

现在我想做相反的:创建一个视图列出RESTAURANTS以及在那里可用的任何和所有OFFERS。这可能吗?谢谢。

文件: 
评论文件尺寸作者
#53backreference-view.txt6.06 KBjnettik
#43interdiff.txt2.51 KByched
#431083902-backreference-43.patch3.92 KByched
#341083902-backreference-34.patch3.29 KB德哈西
PASSED:[[SimpleTest]]:[MySQL] 14 pass。视图
#331083902-backreference-33.patch3.23 KB德哈西
PASSED:[[SimpleTest]]:[MySQL] 14 pass。视图

注释

 

评论#1

oxyc 信用归属: oxyc评论

嘿,

此功能未与参考集成,但您可以尝试反向模块,即http://drupal.org/project/cnr

 

评论#2

jpincas 信用归属: jpincas评论

感谢人 - 这应该做。

 

评论#3

danielb 信用归属: danielb评论

与D6 CCK相比,在Drupal 7中获得引用节点的列表非常容易。

说你的字段名是$字段,产生的SQL字符串

'SELECT DISTINCT ' . $field . '_nid AS reference FROM {field_data_' . $field . '} WHERE ' . $field . '_nid IS NOT NULL'

如果你只想从一个特定节点的引用,然后附加:

' AND entity_id = :nid';

并传递参数: array(':nid' => $nid)

并且使用D7数据库API动态查询,此查询可以重写以便于维护。

可能很好在node_reference中有一个函数可用,其中$ filters是一个可选的过滤器数组。检查数据库以查看您可能能够动态应用哪些过滤器,例如实体id(nid),修订版本id(节点vid),捆绑包(节点类型),语言,已删除等....您可以传递所有通过一个数组参数。node_reference_get_referenced($filters = NULL)

用户参考也一样。

希望有人发现这有用。

 

评论#4

DamienMcKenna 信用归属: Damien Mccenna评论

有不同的方法可以采取:

  • 自动创建相应的节点引用,这是CNR和BackReference都做的,但会很好地作为字段选项与单独的模块。
  • 提供Views集成和/或API来列出它们,这是NodeRelationships(和其他人)做的。

会有人希望核心模块中有这些?

 

评论#5

DamienMcKenna 信用归属: Damien Mccenna评论

提案:

  • 向每个参考字段添加选项,允许相反侧的字段自动创建相应的反向参考。
    • 添加一个选项以控制在创建一个引用时是否删除反向引用。
    • 添加一个选项以控制是否在每个节点基础上创建反向引用,从而覆盖反向引用并不总是必需的用例。
  • 实体编辑表单(例如节点编辑)应该在运行时识别当前的后退引用状态是什么并显示它,而不是存储额外的逻辑和数据来记住上述内容。
    • 如果启用该选项以允许每个节点控制,并且反向引用存在,请提供一个选项以创建它。
    • 如果启用该选项以允许每个节点控制,并且后引用确实存在,请提供一个选项以将其删除。

 

评论#6

yellowhousedesign 信用署名: yellowhousedesign评论

嗨,
想要得到一些快速输入 - 你认为“反向引用”的能力将被添加到引用,或者http://drupal.org/project/cnr是要实现的方式?它基本上确保在某个页面(我的案例中的学校部门)引用的任何用户都显示在用户的个人资料上。我真的很感激任何输入。谢谢!

 

评论#7

yellowhousedesign 信用署名: yellowhousedesign评论

添加 - 几乎看起来像CNR,你需要做双工作(参考两个首先),它只是自动更新。

 

评论#8

Shadlington 信用归属: Shadlington评论

如果#1043260:反向关系被提交,您可能会发现它与您的用例相关。

 

评论#9

yellowhousedesign 信用署名: yellowhousedesign评论

酷 - 感谢您的链接!

 

评论#10

basicmagic.net 信用署名: basicmagic.net评论

订阅

 

评论#11

geerlingguy 信用署名: geerlingguy评论

会有人希望核心模块中有这些?

我绝对认为这应该在核心模块,如果可能的话。我一直在抓着我的头,想知道为什么第二个模块是必要的创建返回引用。它们应该在默认情况下是双向的(即使它只是一些函数,我可以调用来获取给定的nid的引用)。

 

评论#12

Shadlington 信用归属: Shadlington评论

最好的解决方案真的是#1043260:反向关系

认真的,如果你想要的运动。

 

评论#13

yapiC 信用归因: yapiC已评论

我是Drupal新手,我尝试了很多东西来获得这个功能在D7。没有为我工作。
最后,我写了我自己的块来显示引用节点的链接列表。这可能不是最好的模块,但它对我来说是足够好,所以我给你的代码是:

reverse_node_reference.info

name = Reverse Node Reference
description = Defines a block for displaying nodes referencing the node that display the block.
package = Fields
core = 7.x
dependencies[] = field
dependencies[] = references
dependencies[] = options
files[] = reverse_node_reference.module

reverse_node_reference.module


/**
* @file
* Implements a block listing nodes with a reference to the node displaying this block
*/

/**
* Implements hook_block_info()
*/
function reverse_node_reference_block_info()
{
	$blocks['reverse_reference_node'] = array (
		'info' => t('Reverse reference Nodes'),
		'status' => TRUE,
		'region' => 'sidebar_first',
		'weight' => 0,
		'visibility' => 1,
		);
	return $blocks;
}

/**
* Implements hook_block_configure()
*/
function reverse_node_reference_block_configure($delta) {
	$form = array();
	switch($delta) {
		case 'reverse_reference_node':
		$form['reverse_reference_node_name'] = array(
			'#type' => 'textfield',
			'#title' => t('name of the referencing field'),
			'#size' => 30,
			'#description' =>t('Enter the name of the field referencing nodes'),
			'#default_value' => variable_get('reverse_reference_node_name', ''),
		);
		break;
	}
	return $form;
}

/**
* Implements hook_block_save()
*/
function reverse_node_reference_block_save($delta = '', $edit = array()) {
	switch($delta) {
		case 'reverse_reference_node':
			variable_set('reverse_reference_node_name', $edit['reverse_reference_node_name']);
			break;
	}
	return;
}

/**
* Implements hook_block_view()
*/
function reverse_node_reference_block_view ($delta = '') {
	switch($delta) {
		case 'reverse_reference_node':
			$node = menu_get_object(); // get the current node
			if (isset($node))
			{
				$referencing_name = variable_get('reverse_reference_node_name');
				if (!empty($referencing_name))
				{
					$items = array();

					$result = db_query("SELECT DISTINCT n.title, n.nid FROM {node} n, {field_data_" . $referencing_name . "} r WHERE r.entity_id = n.nid AND r." . $referencing_name . "_nid = " . $node->nid);
					foreach($result as $row)
					{
						$items[] = array('data' => l($row->title, 'node/' . $row->nid));
					}
					if (empty($items)) { //No content
						$block['content'] = t('None.');  
					} 
					else { //Pass data through theme function.
						$block['content'] = theme('item_list', array('items' => $items));
					}
					$block['subject'] = t('Related nodes');
				}
			}
			if (isset ($block)) {
				return $block;
			}
			break;
	}
}

这将是很好,如果这样的代码可以包含在这个模块。

 

评论#14

merlinofchaos 信用署名: merlinofchaos评论

这个补丁给Views应该很容易得到反向关系。它提供了一个新的处理程序,可以做这项工作。references.module只需要实现钩子并将反向引用添加到适当的表('node'和'users')。

http://drupal.org/node/1188500#comment-4602988

 

评论#15

mstrelan 信用归属: mstrelan评论

订阅

 

评论#16

quazardous 信用署名: quazardous评论

hi,

我把它放在这里,因为它是相关的:

http://drupal.org/node/989848

它是计算反向节点引用字段(但没有视图,因为我不喜欢视图; p)

 

评论#17

dawehner 信誉归属: dawehner评论
状态:活性»需要审查
文件尺寸
1083902-backreference.patch3.18 KB
PASSED:[[SimpleTest]]:[MySQL] 12 pass。视图

这里是一个补丁。

这允许反向引用节点和用户。

 

评论#18

geerlingguy 信用署名: geerlingguy评论
状态:需要审查»由社区审查和测试

这个补丁工程出色!只是几个笔记,但是,从二十分钟,我需要让它一切...

  1. 您需要至少安装视图7.x-3.0-rc1(或者任何-dev发行版本过去6月16日),因为#1188500-2:提供反向分类法字段关系已提交到该分支。
  2. 小心运行update.php。我从drush运行updatedb,它似乎更新视图适当。此外,您需要清除所有缓存两次,然后再尝试使用此新功能...
  3. 如果你使用像#1043260:过去的反向关系,你需要重新修改你的视图。除去原始引用,并添加一个引用,如“Content:Content using [reference type]”。这将允许您显示引用给定节点的所有节点...(用户反向关系类似)。

伟大,真棒,快速工作,dereine!这是比我使用的其他解决方案1000倍。请提交asap。

 

评论#19

mstrelan 信用归属: mstrelan评论

我应用#17并按照#18的步骤,并可以确认这适用于节点引用。我没有测试用户引用。

我发现有点混乱,默认标识符是来自引用其他节点的节点的字段的名称。我有一个参考展览和艺术家的艺术品节点。我想得到一个艺术家参与的所有展览,所以我创建一个关系,以获得“内容使用展览”(类型艺术品),其中该艺术品有一个特定的艺术家。“内容使用展览”关系由“field_exhibition”标识,通常会给我展览,但由于这是相反的,它给了我艺术品。我认为默认标识符应该清楚,它的一个参考,一些很好的说法“field_exhibition引用的节点”。

 

评论#20

merlinofchaos 信用署名: merlinofchaos评论

默认标识符可能应该比这短(它们会进入一个很小的空间),但东西,以指示它是一个倒转可能是一个好主意。

 

评论#21

michielnugter 信用署名: michielnugter评论

我试过最新的补丁,它的工作完美,谢谢!+提交!

以下文本是否更好的描述?

@entity引用@entity_name(使用@field)
将每个使用@field的@entity关联到节点/用户/项

想一个清晰,不显眼的方式来呈现两种不同的关系是很困难的。也许在关系之前放置一个< - 和 - >?或者只是在逆转之前?一个名字,将推这些颠倒的关系到列表的底部将是很好我想。现在,至少在我的drupal安装,反转引用是列表中的第一个关系。

 

评论#22

TrevorBradley 信用归因: TrevorBradley评论

太棒了!期待在我的网站上测试这个。订阅。

 

评论#23

johnv 信誉归属: johnv commented

订阅。

 

评论#24

vasike 信誉归属: vasike评论

订阅。我试过从#17的解决方案,它似乎它的工作。

 

评论#25

clashar 信誉归属: clashar评论

请承诺dev。

 

评论#26

chriscalip 信誉归属: chriscalip评论

subscribe:注意自反向节点引用。

 

评论#27

clashar 信誉归属: clashar评论

上传补丁文件后,我有:

致命错误:无法重新声明node_reference_field_views_data_views_data_alter()(以前在Z:\ home \ paris9.kz中声明的Z:\ home \ paris9.kz \ www \ emploi \ sites \ all \ modules \ references \ node_reference \ node_reference.module:1047) \ www \ emploi \ sites \ all \ modules \ references \ node_reference \ node_reference.module在第1126行

有任何想法吗?

 

评论#28

clashar 信誉归属: clashar评论

其实,似乎我没有从#18:

如果你使用像#1043260:过去的反向关系,你需要重新做一下你的观点。除去原始引用,并添加一个引用,如“Content:Content using [reference type]”。这将允许您显示引用给定节点的所有节点...(用户反向关系类似)。

我会尝试重做我的意见。

 

评论#29

clashar 信誉归属: clashar评论

我已删除所有我的自定义视图,但获得:

致命错误:无法重命名user_reference_field_views_data_views_data_alter()(以前在Z:\ home \ paris9.kz中声明的Z:\ home \ paris9.kz \ www \ emploi \ sites \ all \ modules \ references \ node_reference \ node_reference.module:1075) \ www \ emploi \ sites \ all \ modules \ references \ user_reference \ user_reference.module在第908行

 

评论#30

geerlingguy 信用署名: geerlingguy评论

这意味着两个模块中的一个具有相同的函数名称。尝试完全删除参考目录,再次下载-dev,然后重新修补。

 

评论#31

clashar 信誉归属: clashar评论

geerlingguy,谢谢你的快速回复,你是对的,我有补丁的问题,因为我使用NetBeans IDE和它应用补丁不正确,所有的补丁到每个文件:node_reference和user_reference。

 

评论#32

geerlingguy 信用署名: geerlingguy评论

Bumpity bump - 我们可以让这到下一个版本吗?现在使用它的TONS的视图(我有一些复杂的关系设置在我的网站),它的工作完美。:-)

 

评论#33

derhasi 信用归属: derhasi评论
文件尺寸
1083902-backreference-33.patch3.23 KB
PASSED:[[SimpleTest]]:[MySQL] 14 pass。视图

大补丁,为我工作!

我唯一要解决的是标题和帮助文本,所以他们显示更多的信息。我更新了补丁,见下文。

 

评论#34

derhasi 信用归属: derhasi评论
文件尺寸
1083902-backreference-34.patch3.29 KB
PASSED:[[SimpleTest]]:[MySQL] 14 pass。视图

Ähm,对不起,忘了user_reference部分...

 

评论#35

seandunaway0 信用署名: seandunaway0评论

补丁从#17工作美丽 - 感谢分享!

 

评论#36

bib_boy 信用归属: bib_boy commented

它为我工作...排序...但我有一个问题,在我的View表中的行重复。让我解释。

我有一个内容类型“事件”与节点引用字段添加“人”在此事件说话。有些人在多个活动上发言。我现在想要做的是使用上面的反向引用补丁创建一个人视图表(名称,照片等),并包括他们在讲的事件。在我的预览视图中,我得到一个重复的行,重复的人,但每个事件。因此,在3个事件发生的人有3行重复信息(除了排气柱)。我想我想要事件反引用出现在同一列中有一个分隔符,当有多个事件。

顺便说一下,当创建另一个关系时,我注意到能够设置“全部”,“0,1”等的“增量”值。帮助文本说“增量允许您选择多值字段中的哪个项目, 。选择“1”使用第一个项目,“2”作为第二个项目,依此类推。如果选择“全部”,字段中的每个项目将创建一个新行,这可能导致重复。

上面的补丁不包括这个“Delta”选项?这可能是为什么我有这个重复的问题。

 

评论#37

geerlingguy 信用署名: geerlingguy评论

@bib_boy - 有两件事你可以试试。一种是在显示类型的设置下使用分组字段功能。这将允许您按特定字段(如“person”)对记录进行分组,并且您可以隐藏人员字段在其字段设置中显示。

另一种方法是尝试更改查询或更改视图界面高级部分中的一些查询设置...

 

评论#38

bib_boy 信用归属: bib_boy commented

@geerlingguy感谢的想法,我现在试过你的建议,但它不是真的为我做。我认为关系字段需要有一个多字段设置?或关系中的“Delta”选项?

 

评论#39

seandunaway0 信用署名: seandunaway0评论

这是准备好了吗?它需要什么?

 

评论#40

danbohea 信用归属: danbohea评论

sub

 

评论#41

derhasi 信用归属: derhasi评论

我只是认识到我们应该为“伪字段”提供“真实字段”,因此其他模块,字段和关系可以使用该信息来扩展查询。

 

评论#42

xlyz 信用归属: xlyz评论

sub

 

评论#43

yched 信用署名: yched评论
状态:由社区审查和测试»修正
文件尺寸
1083902-backreference-43.patch3.92 KB
interdiff.txt2.51 KB

Yay,非常感谢@merlinofchaos&@dereine的补丁和视图中的支持功能。

提交附件补丁,在调整关系标题和帮助文本后,我有点 - 参见interdiff与原来的补丁在#17。

@views folks:我意识到这使得标题不同于在类似的back-relationships中使用的模式在图像文件,taxo的视图中实现。我认为它有助于保持“前进”和“后退”关系在“添加新”中彼此相邻。你怎么看 ?你会考虑一个Views补丁对视图中的后退关系也是一样的?

 

评论#44

geerlingguy 信用署名: geerlingguy评论

看起来很棒,并且使得对后面引用的需求不那么迫切!我认为你的新文本澄清了发生了什么。

 

评论#45

dawehner 信誉归属: dawehner评论


@views folks : I realize this makes the title different from the pattern used in the similar back-relationships implemented in Views for image file, taxo. I do think it helps to keep the 'forward' and 'backward' relationships next to each other in the "add new". What do you think ? Would you consider a Views patch that does the same for the back-relationships in Views ?

It's seems to make somehow sense from the user point of view, because you know both sites of your relationship but most likely you aren't sure which is on the left and which is on the right.

也许这不是那么容易支持,因为
a)他们没有同一种标题
b)他们被分组在不同的组。例如,如果您有用户的节点引用

 

状态:固定»关闭(固定)

自动关闭 - 问题固定为2周没有活动。

 

评论#47

sachbearbeiter 信用署名: sachbearbeiter评论

真的,真的有用+简单的使用 - >感谢参与的每个人从视图和参考...

 

评论#48

dolu 信用署名: dolu评论

看来这个功能还没有在2.0-beta3中实现,或者我错了?

谢谢!

 

评论#49

Shadlington 信用归属: Shadlington评论

不,它在开发版 - 所以它会在下一个版本。

 

评论#50

seanr 信用归属: seanr评论

我不能为我的生活得到这个工作。我已经添加了关系,但我仍然没有看到我想要的字段。我有一个书的视图,我想添加一个字段到每个书的摘录,引用他们。这个领域在哪里?这真的是我的头!: - /

 

评论#51

seanr 信用归属: seanr评论

这里的视图代码,因为当我粘贴它在这里吃整个帖子:

http://drupalbin.com/20113

 

评论#52

seanr 信用归属: seanr评论
状态:关闭(固定)»活动

更糟糕的是,增加对关系的反向引用只是让我重复我的书。这是杀了我 - 这是我需要这个模块的全部原因。

 

评论#53

jnettik 信誉归属: jnettik评论
文件尺寸
backreference-view.txt6.06 KB

我也有一些麻烦获得这个设置。基本上我有一堆研讨会节点,每个引用一个扬声器节点。当我去演讲者的节点,我想看到一个参考该演讲者的研讨会的列表。现在我得到所有研讨会节点显示在每个发言者的页面上。

我附上了视图,任何指针,我错过了将非常感谢。

 

评论#54

jnettik 信誉归属: jnettik评论
状态:活性»关闭(按设计工作)

所以我终于得到了。我需要一个上下文过滤器的节点标题。我试图去NID和由于某种原因,不工作。

 

评论#55

jenlampton 信用署名: jenlampton评论
状态:关闭(按设计工作)»修正

改变状态

 

评论#56

jenlampton 信用署名: jenlampton评论
状态:固定»关闭(固定)

呃,我的意思是回到这个。

 

评论#57

jhrizz 信用归属: jhrizz评论

这是一个老线程,但我被卡住了...

我们有NODE TYPE A和NODE TYPE B.用户通过一个字段从NODE TYPE B到NODE TYPE A创建一个引用。我们想要一个附加到NODE TYPE A的块,列出所有的NODE TYPE B引用。

当我们创建上下文过滤器和关系时,没有任何东西似乎占据了蛋糕。有任何想法吗?

提前致谢!

 

评论#58

giorgio79 信用归属: giorgio79评论
问题总结:查看更改


这里是对D8实体api的请求。希望这个东西会成为核心#2497649:实现实体引用的反向引用

来自 https://www.drupal.org/node/1083902

反向节点引用

 

发表于Ejaboneta on

所以基本上,我试图显示引用当前节点的节点列表。

我使每个节点关于一个人。我做了节点引用字段输入每个人的母亲和父亲。现在我想根据母亲/父亲的字段来显示每个人的孩子。

我能够得到一个列表的正确的节点使用视图过滤节点基于nodereference字段...但我必须选择一个特定的父节点来获取列表。我想让它自动从当前节点获得正确的父节点...

我对drupal很新,我不认为我很好解释这么遗憾,如果这是混乱...任何人都可以帮助?

⋅ 类别:Drupal 5.x

注释

只是想我会碰这个

Ejaboneta评论道

只是想我会碰到这个顶部再次...任何人都可以帮助?

Yesss!

zirvap评论

我终于找到了如何做这个为我自己的网站,经过几个下午咬牙的牙齿。

我有游戏的节点和人的节点。人节点具有指代游戏节点的节点参考字段。(我使用这个人谁想要注册的游戏在游戏公约。出于各种原因,我不想使用注册模块。)

我创建一个视图:

  • 提供块
  • 我想显示的字段(显然:-)
  • 参数:节点引用
  • 参数处理代码:(感谢Paul Resnick的评论$args[0] = arg(1);

我去块管理页面,激活块,并选择它应该只显示在拥有游戏的节点上。

瞧!在我的游戏页面的底部,有一个很好的小列表,所有的人谁已注册的游戏。

嗯,对我来说,会很麻烦地指定块应该显示在所有相关页面。如果我记得正确,我看到一个模块CCK Viewfields应该自动化这个很好。或者也许我最好的一个PHP片段... 
*漫步到手册,愉快地吹口哨*

你是惊人的。谢谢!

Ejaboneta评论道

你是惊人的。谢谢!

如何添加节点?

gmclelland评论

zirvap

如何在“人物添加表单”上添加游戏?

这可能吗?

有没有办法同时添加和引用?

谢谢你的帮助。

只是不得不说

JonSTeps评论道

这个代码工作完美和zirvap你是一个救命的救星!

多个节点引用参数

txcrew评论

如何创建包含多个节点引用参数的此视图块?

TIA,
txcrew

只有一个

zirvap评论

我做的视图块只有一个节点引用参数。我做了几个块,每个有一个节点引用参数。(他,即使对我自己听起来很神秘,告诉我,如果你想要一个更详细的描述。)

这是我最后的手段

txcrew评论

在我的情况下,我有大约11个节点引用字段在我的内容类型(请参阅http://drupal.org/node/201815我的方案),我希望可能有一个更好的方法做到这一点。也许只是编辑该参数处理代码来为一个或多个选择的参数中的一个或多个accomdate。但是唉,我有非常有限的编程知识,从我迄今为止一直在研究,它似乎不太可能。

您的方法对性能有任何影响吗?任何更多或更少有一个视图与几个参数?

谢谢回复!

txcrew

不知道性能

zirvap评论

我有六个节点引用字段,这意味着它不是太多的麻烦,为每个视图。我没有看过性能。网站的范围是相当小的(每年约100-150参与者的游戏公约),所以性能不是很大的问题。

奇怪的视图缓存问题

bsuttis评论道

更新:对不起,我想出了自己的问题,我的两个数据库表不同步。

谢谢你非常真挚!

fallenleaf评论

谢谢你非常真挚!
它适用于我。
示例网站(中文):
http : //www.buyerjoy.net/shop/761http://www.buyerjoy.net/brand/627互相参照
------------- ------- 
买家

我无法配置views2

FiNeX评论

我不能配置views2(在D6)根据您的建议。需要我以不同的方式做?

解决了 :-)

FiNeX评论

我已经解决了D6与views2。我想显示(在块上)所有当前节点被引用的节点。

  1. 添加node_refence作为参数
  2. 设置“如果参数不存在时采取的操作”:设置为“提供默认参数”
  3. 将“默认参数类型:”设置为“Node ID from URL”
  4. 设置“基本验证”

这让我解决这个问题:-)

简直太神奇了 :-)

谢谢!

已评论 sk_mamp_nb

我希望我早些来到这里,谢谢。这真的很好。

你能多解释一下吗?

sheclimber

我一直在读这个6个小时,越来越困惑。我是php的新手,所以也许这是我的问题。我使用D6,views2。我有一个名为projects的内容类型,以及一个名为testimonials的内容类型,它具有对项目的节点引用。我想使用视图在项目节点页面上创建一个块,显示特定项目的所有推荐。我试过以上,加上许多其他猜测,其中一些通过阅读有关D5解决方案,但没有什么工作。

任何帮助将不胜感激。

我知道工作

FiNeX评论

我知道使用引用并不容易。你还在麻烦吗?也许1年后我有点迟了...告诉我们,如果你仍然需要帮助

THX FiNeX完美。只是

JThan评论道

THX FiNeX

工作完美。只是我需要。

大thaks

图图

它真实的工作,我的情况D6.1-任何+ views2。
作为表关系的基本事物必须简单明了。所以它。

谢谢

应受评论

请让我在此感谢他人的合唱。

谢谢!

Christian Nally - 加拿大卑诗省 - http://sticksallison.com

谢谢

ecc评论

你的解决方案工作完美...是我在这方面阅读的最好的。

不知道你是怎么做的...

DrupalSza评论道

不知道你是怎么做的...但是坚实。

谢谢。

好,我很高兴我的解决方案

FiNeX评论

好,我很高兴我的解决方案确实帮助你所有:-)

FiNeX - 我感谢你

Darrin南方评论道

FiNeX - 我也感谢你。

纯真!几乎

联合国评论

纯真!几乎创建了一个完整的怪物的意见和面板,结果是解决方案是这么简单=]感谢一堆!

谢谢 !那么容易,但原因?

wropul评论

很难相信解决方案是那么容易!非常感谢 !
使用这种方法,我使它完美地工作在drupal 7与dev版本的“参考”(2011年8月31日)。(这个版本已经包括“反向”功能,但我不能使它的工作。)失败后“对应的节点引用”“后面参考”,最后我发现这篇文章。
我只是想知道为什么它可以工作没有“反向”功能?我真的很困惑。

谢谢

操作评论

它不工作与我在drupal 6 ..我不知道为什么!

$ args [0] = arg(1);

但是,我遵循这个教程,它的工作方式像一个魅力:
http://drupalsn.com/learn-drupal/drupal-tutorials/creating-dynamic-block ...

为什么?

操作评论

为什么?

Yesss!

zirvap评论

正在删除重复的信息。

是?

gmclelland评论

是可以做到的吗?你会怎么做?

CCK Nodereference

Rowanw评论道

使用CCK将“节点引用”字段添加到“人员”内容类型,然后在创建“人员”内容时,您可以选择要引用的现有节点。

问题是你

gmclelland评论

问题是,你不能从创建游戏表单添加一个人,反之亦然。只有已创建的记录才能引用。

我有类似的问题在这里这里

也许有人可以帮助我。

Drupal 6

encho评论

任何人都有它工作在Drupal 6?

我想知道如何

lelizondo评论

我想知道如何做到这一点在drupal 6?

谢谢

路易斯

路易斯

我想知道如何在drupal 6做这个

faunapolis评论

参数:节点参考不显示为其中一个选项。谢谢

http://www.faunapolis.org/

如何在Drupal 6中反转节点引用

faunapolis评论

我问CCK模块开发人员,他很快回答。

更新的开发版本有解决方案,请参见:http
//drupal.org/node/265958

用于D6的CCK的alpha版本没有并入该选项

http://www.faunapolis.org/

加工!

encho评论

基于http://drupal.org/node/259845,终于得到它的工作。

1.创建一个关系,
2.参数Node:nid,使用关系,
还必须使用页面/附件类型的视图作为块不能传递参数,据我所知,
4.其他设置,如字段,过滤器等,
5.使用 6.工作! print views_embed_view(my_view_name, $display_id = 'attachment', arg(1));

希望这有助于某人。

谢谢!

boulwarek评论

我一直在试图找出如何基本上添加nodereferrer的功能到Drupal 6,因为模块尚未移植,我将没有如何帮助端口的线索。经过吨和吨的搜索和fiddling我终于得到了我正在寻找你的方法。我甚至没有创建一个块视图,只有一个附件,因为我没有必要在一个块中显示它。

也只是为了参考,我不知道我应该把PHP代码,但最后弄清楚,我不得不创建一个.tpl.php文件的内容类型,并添加使用这个方法:http:// drupal .org / node / 17565

非常感谢你。

这可能是解决方案 - > Nodereferrer字段

matherion评论

嘿,所有,

我一直在寻找我认为是同一件事,最近,有人创造了它!检查这篇文章关于Nodereferrer领域在Drupal 6!

Matherion

nodereferrer岩石

drupalninja99评论

我认为这是完美的(我使用drupal 5),工作伟大的我

_ _

no2e评论

(订阅)

Drupal6中Views2的代码

dan_aka_jack评论

非常感谢上面的所有提示。使用上面的指南,我在View2中创建了一个非常简单的视图,它在块中显示了“反向节点引用”列表。我想我会在这里导出:

$view = new view;
$view->name = 'reverse_node_reference';
$view->description = 'Provides a list of nodes which reference the current node in its node-reference field';
$view->tag = '';
$view->view_php = '';
$view->base_table = 'node';
$view->is_cacheable = FALSE;
$view->api_version = 2;
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
$handler = $view->new_display('default', 'Defaults', 'default');
$handler->override_option('fields', array(
  'title' => array(
    'label' => '',
    'link_to_node' => 1,
    'exclude' => 0,
    'id' => 'title',
    'table' => 'node',
    'field' => 'title',
    'relationship' => 'none',
  ),
));
$handler->override_option('arguments', array(
  'field_node_reference_nid' => array(
    'default_action' => 'default',
    'style_plugin' => 'default_summary',
    'style_options' => array(),
    'wildcard' => 'all',
    'wildcard_substitution' => 'All',
    'title' => '',
    'default_argument_type' => 'node',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'not found',
    'break_phrase' => 0,
    'not' => 0,
    'id' => 'field_node_reference_nid',
    'table' => 'node_data_field_node_reference',
    'field' => 'field_node_reference_nid',
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
      'blog' => 0,
      'poll' => 0,
      'forum' => 0,
      'book' => 0,
      'event' => 0,
      'feed' => 0,
      'page' => 0,
      'simplenews' => 0,
      'story' => 0,
      'video' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
      '1' => 0,
      '3' => 0,
      '2' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_php' => '',
  ),
));
$handler->override_option('filters', array(
  'status' => array(
    'operator' => '=',
    'value' => '1',
    'group' => '0',
    'exposed' => FALSE,
    'expose' => array(
      'operator' => FALSE,
      'label' => '',
    ),
    'id' => 'status',
    'table' => 'node',
    'field' => 'status',
    'relationship' => 'none',
  ),
));
$handler->override_option('access', array(
  'type' => 'none',
));
$handler->override_option('title', 'Related items');
$handler->override_option('style_plugin', 'list');
$handler->override_option('style_options', array(
  'grouping' => '',
  'type' => 'ul',
));
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->override_option('block_description', '');
$handler->override_option('block_caching', -1);

也许这将是一个更好

lelizondo评论

也许这将是一个更好的选择,将其移动到文档

路易斯

路易斯

到目前为止所有的成功

Blueeeeie

到目前为止,所有的成功故事都在谈论创建块视图。页面视图呢?

基于在这里的每个人提供的信息,我能够创建一个块并显示在当前节点上,所有的引用节点显示正确。

但我也想显示一个页面,所有的引用节点也基于当前节点。

例如,我有一个商店和一个产品节点,产品节点引用商店节点。
在我的商店页面(例如,商店/有些商店),我添加了块显示所有引用的产品,只显示最多约9个产品。没有问题。但我想要一个专门的页面,每个店,以便能够显示其参考产品以及。

所以我添加了一个页面,并输入所有相同的设置为块,包括页面的路径(商店/%/产品)。有趣的是,如果我进入url商店/某些商店/产品页面不会显示。它只显示如果我进入商店/ 1 /产品,1是商店nid。

所以任何人有任何想法如何让这个工作?

--- 
www.drupaldiy.com - 展示您的Drupal网站

这是真的反向引用吗?

sagannotcarl评论

嘿dan_aka_jack,
感谢您在这里张贴您的意见。我导入它并尝试它,但它没有做我所期望的。

抱歉,如果我只是困惑,但这似乎是做一个正常的节点参考视图,而不是反向。如果我传递视图在节点引用字段中引用的节点的参数,则视图不返回任何内容。当我通过正在执行引用的节点的nid时,引用的节点显示(就像正常的节点引用视图)。

所以我在这里除了导入你的视图之外还缺少另一个步骤?

检查这个

注定评论

检查这http://drupal.org/project/nodereferrer

它可以做你想要的。

相应的节点引用

thaddeusmt评论

似乎做同样的事情:

http://drupal.org/project/cnr

订阅

cookiesunshinex评论

订阅

我在块中使用的代码示例

驱鼠器评论

我在块中使用一些代码来打印引用当前正在显示的节点的节点:


//current project nid
$projectnid = arg(1);

/* This section checks to see if the project nid matches the project nid value referenced by a project risk
 * If it matches the risk id is printed linked to the risk
*/

// array to store the results in
$items = array();

//query the database
$result = db_query("SELECT ctpr.nid, n.title FROM {content_type_project_risk} ctpr JOIN {node} n ON ctpr.nid = n.nid WHERE ctpr.field_risk_project_nid = '$projectnid'");

while ($row = db_fetch_object($result)) {
  $items[] = l($row->title, "node/{$row->nid}");
}

// print the results
return theme('item_list', $items);

您只需修改值以满足您的需要。

希望这有助于某人。

合作伙伴模块做这个和更多

brynbellomy评论

查看合作伙伴模块:http : //drupal.org/project/partners
它像你描述的反向引用。它还可以自动生成中间节点,这些节点是包含有关其他两个节点之间的关系的信息的节点(例如,您有一个成员类型,它具有多个组节点的多个节点,然后可能是成员资格节点类型,其中包含有关这些关系)。还有一些基本的视图集成,所以你不必编写自定义SQL。

http://drupal.org/project/rev

markus_petrux评论

怀疑是开始,而不是智慧的结束。

重新排列引用节点的顺序

milehighlife评论

所以,有能力查看引用的节点是好的。我们可以进一步,有能力重新排列参考节点的顺序吗?

我有一个画廊节点,它有几个参考画廊的照片。我想能够查看图库中引用的照片,能够通过拖放操作重新排列照片的显示顺序。

任何人知道(当前)模块实现这一点?

谢谢!

一张照片只引用一张

asad.hasan评论

一张照片只引用一个画廊,所以拖放在哪里发挥。

如果你像一个画廊引用许多照片,然后u可以拖动这些照片的顺序,哦,在这种情况下,你会担心反向参考太。

你可以采取的方法是在照片上增加一个重量字段,但它会出来是一个麻烦的管理方式。

node.tpl.php中的反向节点引用

subu.purohit评论

您好,
我有两个相关的内容类型艺术家和电影。电影内容类型具有对艺术家的节点引用(电影内容类型具有所有艺术家的列表)。我可以在node-movie.tpl中列出与电影相关的所有艺术家。但是如何在node-artist.tpl中列出所有与艺术家相关的电影呢?

谢谢
Subhash

试试我的模块

asad.hasan评论

创建和安装我已经发布的模块,然后所有的父节点将在名为'field_parent_nodes'的字段中可用,因此u可以使用以下代码来遍历所有的父节点node.tpl.php

  if(isset($node->field_parent_nodes)) {
      foreach($node->field_parent_nodes as $p_node) {
           //Print what ever u want from this parent $p_node in what ever fashion u like
      }
  }

我把这样的代码移动到一个函数驻留在我的template.php,并从我的节点-whatever.tpl.php调用它的主题和逻辑分离。

这是一个压缩版本

asad.hasan评论

这是我的模块的压缩版本:

http://www.dadesigners.com/drupal-modules/da_reverse_reference.zip

我会发布它在contrib很快...感谢

@asadpakistani我很感兴趣

cookiesunshinex评论

@asadpakistani

我对你的模块感兴趣,但有一点关心重复。我知道你提到另一个模块(http://drupal.org/project/reverse_node_reference),但你确定你的模块的代码不能以某种方式集成到现有的模块?你的模块与反向节点引用是什么不同的,它如何更好?

如果你认为它应该仍然是一个不同的模块,请在这里,当它是drupal.org模块contrib存储库的一部分。

有趣的是看看你的模块是如何工作的,我有一个非常大的需要这个在几个项目,但没有想出如何做到与http://drupal.org/project/reverse_node_reference

谢谢。

一个简单和抽象的方法,不使用视图

asad.hasan评论

Ive写了以下模块。这将父对象节点添加到子节点。然后可以在用于子节点类型的主题tpl中访问该信息,并根据需要显示该信息。

我意识到有一个模块(http://drupal.org/project/reverse_node_reference),但这种方法看起来更灵活,对我很容易。

function da_reverse_reference_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
	if($op == "load") {
		$attributes = array();
		foreach(content_fields() as $field) {
			if(isset($field["referenceable_types"]) && $field["referenceable_types"][$node->type] === $node->type) {
				$sql = "SELECT nid FROM {content_".$field["field_name"]."} WHERE ".$field["field_name"]."_nid = %d";
				$parents = db_query($sql, $node->nid);
				while($parent = db_fetch_object($parents)) {
					$attributes["field_parent_nodes"][$parent->nid] = node_load($parent->nid);
				}
			}
		}
		return $attributes;
	}
}

谢谢你的帮助

删除评论

谢谢你的帮助

我有一些麻烦跟随

jonardern评论道

我有一些麻烦跟着这个,首先使用视图2和Drupal 6.然而,经过一点试验和错误,我到那里,非常感谢大家以上。
这是我一步一步地得到引用正在查看的节点的节点标题的列表。

1.创建节点视图

2.添加关系并在内容分组下选择节点引用字段,将此标记为必需。

3.在节点组下添加节点标识的扩充。
3.1。在“关系:”下选择节点引用字段
3.2。“如果参数不存在,采取行动:”=“提供默认参数” 
3.3。“默认参数类型:”=“来自URL的节点ID”保留所有其他参数选项。

4.在过滤器下选择节点:类型=“正在执行引用的节点类型”

5.在字段下选择节点标题并检查“将此字段链接到其节点。

最后创建一个块显示放置在节点页面上,或者作为我使用显示套件模块,创建一个“节点内容”显示。

希望这对某人有帮助。

谢谢

dvmoc已评论

感谢jonardern,仍然得到关系/争论的悬念,这正是我要找的!工作伟大,我理解的东西现在更好一点。

干杯!

也在D7工程

mErilainen评论道

这也很好地工作在Drupal7,我使用Views dev-version,但应该与rc1一起工作。
唯一的区别是,将引用字段添加为关系后,您需要在“上下文过滤器”设置(内容:ID - >提供默认值 - >来自URL的内容ID)中使用此关系。

之后,您可以从具有引用字段的内容类型列出没有任何其他必需关系的字段。

非常感谢!!工作像一个

hessam61评论

非常感谢!!像D7中的魅力和视图3一样工作。在我的情况下,我跳过了3.2,设置“如果任何参数不存在时采取的操作”。


普通分类: