从节点正文获取自动摘要 -- 7 领域 和 nodes 领域 drupal 相关 的问题

Getting the auto summary from a node body


6
vote

问题

中文

我用node_load()加载文章节点,我想得到身体字段的摘要。我知道我可以使用 $node->body[$node->language][0]['summary'] 访问它,但除非用户显式添加摘要正文,否则此字段为空。

我知道如果他们没有添加摘要主体,Drupal会自动生成"修剪的身体" 。如何访问修剪的身体?

编辑:

我对render()内容不太有趣,我只想要文字。我的模块正在为外部源生成JSON源。

英文原文

I load an Article node with node_load() and I'd like to get the summary for the Body field. I know that I can access it with $node->body[$node->language][0]['summary'] but unless the user explicitly adds a Summary Body, then this field is empty.

I know that drupal will automatically generate a "trimmed body" if they don't add a Summary Body. How can I access that trimmed body?

EDIT:

I'm not interesting in render()ing the content, I just want the text. My module is generating a json feed for an external source.

     

回答列表

11
 
vote
vote
最佳答案
 

node_view() 当您需要呈现整个节点或其许多字段时是合适的。
但有时你必须渲染你需要的唯一领域。它可以用 99887764 或 <代码> field_view_value() :

  $node = node_load($nid); // Render array of body field. $build_body = field_view_field('node', $node, 'body', 'teaser'); // Render it in common way. echo render($build_body);   

有趣的是,您可以通过您自己的字段格式化设置而不是使用第四个参数来查看模式。 请阅读API文档以获取更多信息。

 

node_view() is appropriate when you need to render whole node or many of it's fields.
But sometimes you have to render the only field you need. It can be done with field_view_field() or field_view_value():

$node = node_load($nid); // Render array of body field. $build_body = field_view_field('node', $node, 'body', 'teaser'); // Render it in common way. echo render($build_body); 

The interesting thing is that you can pass your own field formatter settings instead of view mode with the fourth parameter. Please, read API docs for more info.

 
 
 
 
5
 
vote

对此主题的一个相当详细的讨论是在 drupal 7如何编程加载一卷缩短剪辑。

  $teaser = render(node_view(node_load($nid), 'teaser')); print $teaser['body'][0]['#markup'];   
 

A fairly detailed discussion on this topic is on Drupal 7 How to load a teaser programatically.

$teaser = render(node_view(node_load($nid), 'teaser')); print $teaser['body'][0]['#markup']; 
 
 
2
 
vote

我不知道摘要字段始终填充,然后我使用这样的函数(在自定义模块中):

  /**  * Implements of hook_node_presave().  */ function mymodule_node_presave($node) {   // if is summary not empty we can continue   if (isset($node->body[LANGUAGE_NONE][0]['summary']) && !empty($node->body[LANGUAGE_NONE][0]['summary'])) return;    // we use module smart_trim to create smart trimmed variant of summary   $build_body = field_view_field('node', $node, 'body', array(     'type' => 'smart_trim_format',     'settings' => array(       'trim_length' => 8,       'trim_type' => 'words',       'trim_suffix' => '...',       'more_link' => FALSE,       'more_text' => 'Read more',       'summary_handler' => 'full',       'trim_options' => array(         'text' => TRUE,       ),     ),   ));    // store created summary   $node->body[LANGUAGE_NONE][0]['summary'] = $build_body[0]['#markup']; }   

module smart_trim 用作概要渲染器。

 

I wan't summary field always filled then I use something like this function (in custom module):

/**  * Implements of hook_node_presave().  */ function mymodule_node_presave($node) {   // if is summary not empty we can continue   if (isset($node->body[LANGUAGE_NONE][0]['summary']) && !empty($node->body[LANGUAGE_NONE][0]['summary'])) return;    // we use module smart_trim to create smart trimmed variant of summary   $build_body = field_view_field('node', $node, 'body', array(     'type' => 'smart_trim_format',     'settings' => array(       'trim_length' => 8,       'trim_type' => 'words',       'trim_suffix' => '...',       'more_link' => FALSE,       'more_text' => 'Read more',       'summary_handler' => 'full',       'trim_options' => array(         'text' => TRUE,       ),     ),   ));    // store created summary   $node->body[LANGUAGE_NONE][0]['summary'] = $build_body[0]['#markup']; } 

Module smart_trim is used as renderer for summary.

 
 
2
 
vote

对于有兴趣的人,这是最小的解决方案。我将使用db_select来执行查询而不是node_load。

  //first build the query $query = db_select('node', 'n'); $query->fields('n', array('nid', 'title', 'language')); $query->join('field_data_body', 'body', 'body.entity_type='node' && body.deleted=0 && body.entity_id=n.nid'); $query->addField('body', 'body_value', 'body_value'); $query->addField('body', 'body_summary', 'body_summary'); $query->addField('body', 'body_format', 'body_format');  //fetch a single item as an associative array $item = $query->execute()->fetchAssoc();  //If an explicit summary has not been provided, we generate it here if (empty($item['body_summary'])) {     $summary = check_markup($item['body_value'], $item['body_format'], $item['language']);     $item['body_summary'] = text_summary($summary, $item['body_format']); }   
 

For anyone interested, here is the most minimal solution. I will use db_select to execute the query rather than node_load.

//first build the query $query = db_select('node', 'n'); $query->fields('n', array('nid', 'title', 'language')); $query->join('field_data_body', 'body', 'body.entity_type=\'node\' && body.deleted=0 && body.entity_id=n.nid'); $query->addField('body', 'body_value', 'body_value'); $query->addField('body', 'body_summary', 'body_summary'); $query->addField('body', 'body_format', 'body_format');  //fetch a single item as an associative array $item = $query->execute()->fetchAssoc();  //If an explicit summary has not been provided, we generate it here if (empty($item['body_summary'])) {     $summary = check_markup($item['body_value'], $item['body_format'], $item['language']);     $item['body_summary'] = text_summary($summary, $item['body_format']); } 
 
 

相关问题

2  通过node_load()访问已发布的日期  ( Access published date via node load ) 
节点 created 字段与最终发布时(或者我猜可能促销,而不是发布)。 我在模块代码中使用node_load()加载了一个节点,我如何在实际发布这个节点时访问? ...

3  如何获取当前观看的用户UID  ( How to get the current viewed users uid ) 
如果我正在查看用户个人资料页面,我如何获得和显示(在块中)他们的UID?与用户登录的当前无关。我需要在页面上的块中显示用户标识。 ...

0  使用多列的布局使用面板  ( Use the panel for layout with multiple columns ) 
我创建了自己的内容类型。我想通过添加列进一步自定义它。我安装了模块面板。我可以使用相同的面板布局来包含我的内容类型吗?此外,如何将图片放在面板的字段中? ...

1  如何创建新的Solr Server URL  ( How to create a new solr server url ) 
我正在使用Drupal 7和Apache Solr,我的一个网站。我正在使用Tomcat与Apache solr来搜索我网站中的内容。对于测试目的,我使用 http://localhost:8080/solr 连接到solr服务器。但我想将其更改为 http://development.site:8080/solr ...

4  如何在Drupal中拥有另一个页面。用不同的地区和块?  ( How to have a another page tpl php file in drupal with different regions and blo ) 
嗯,这是问题。在我的网站上,我想创建一个纯模板并添加我自己的地区和我自己的块。因此,当用户访问例如www.example.com/register - 当块与主页不同时。我不喜欢禁用块,因为当你打开Firebug时,仍然可以看到块。 所以我已经阅读了本文,你必须创建一个新的 .tpl.php 文件。所以在我的情况下...

1  获取所有已启用的块增量列表  ( Get a list of all enabled block deltas ) 
我需要一系列所有已启用的块增量。 例如,如果我显示阵列,它应该输出块增量。 search_form,user_new,user_login,而不是块标题e.g搜索,用户等 我发现了一些候选人: http://api.drupal.org/api /drupal/modules !block !block.modul...

2  元标签未显示在头版上  ( Meta tags not showing on front page ) 
我正在使用模块"metatag" ,使我的网站seo友好。除了首页外,这对所有页面都非常适用。 我去模块 - &gt;元标签 - &gt;设置 - &gt;全局:首页 在那里,我设置了描述。但如果您在Google中直接搜索该网站,则未显示此描述。所有其他页面都在很好工作,正确描述。 当我看源时,我看不到前页的元数据。...

0  无法删除/重新安装Sharethis模块  ( Cannot delete re install sharethis module ) 
我将我的drupal升级到最新版本。我也用模块做到了这个问题。当我这样做时,我对"Sharethis" 模块有一个错误。我收到一条消息,告诉我自己升级该模块,所以我上传了新的模块文件。 但模块不再工作了,当我查看模块列表时,我找不到"sharethis" 。 这就是我所看到的: Sharethis块7.x-2.2此模...

8  我可以将分发配置文件模块从配置文件文件夹移动到站点/全部/模块吗?  ( Can i move distribution profile modules from profile folder to sites all modules ) 
我刚安装了分发配置文件,并运行 Drush up 以更新模块。 我有一些问题在配置文件/ somefolder /模块上的模块:润滑移动旧模块,但没有添加新模块。 我可以将模块从配置文件夹中移动到站点/全部/模块吗? 安装配置文件是商务kickstart ...

2  如何在Drupal中构建一个弹出窗口? [关闭]  ( How can i build a popup in drupal ) 
此问题似乎在帮助中心中定义的范围内涉及Drupal。 想要改进这个问题?更新问题,所以它是关于drupal答案的主题。 ...

3  如何使用类似WordPress的短代码?  ( How can i use wordpress like short codes ) 
我是德鲁佩尔的新手。以前我正在使用WordPress,在那里您可以使用短代码来获取页面的插件功能。 在drupal也是可能的吗? 例如在编辑博客文章时,我可以在编辑器中使用它: [foobar] // This is a short code. 以及这里如何在WordPress中定义: function...

1  如何为多语言网站创建自定义主题?  ( How can i have a custom theme created by myself for multilingual site ) 
我的网站使用i8ln,它配置为使用大量语言。使用page.tpl.php我设法翻译网站。但我必须为特定路径和404页创建另一个自定义主题。所以我创建了一个页面 - 节点 - 23.tpl.php文件并清除缓存。自从我尝试导入新主题的节点以来的文件是在我创建节点/ 23时定义的节点ID。 现在我的问题是我需要翻译节点...

0  保持记录的模块  ( Module for keeping records ) 
我正在尝试开发一个具有优点的列表的网站,每个都有一个要完成的不同要求。我想拥有一个人的人/尚未登录的页面只看到页面的ReadOnly版本,然后在他们登录时,他们可以看到它们在完成它以及查看其他用户的进度方面。是否有这个模块? ...

2  条件删除视图中的字段  ( Conditional removal of a field in a view ) 
我正在使用 views 在侧边栏区域中显示最新的5个节点(预告值视图模式)。节点具有图像字段,但我只需要在列表上的第一个节点上呈现。 所以,由于预告片视图模式确实包括图像,因此我尝试从所有节点中删除第一个在渲染时的所有节点。 我在我的主题中尝试了以下内容 template.php : function foo_p...

0  Ajax形式不在一些地区工作  ( Ajax form not working in some some regions ) 
我在my module中创建了基于Ajax的联系人表单。然后我为表格做了一个块视图。我尝试将该块放在几个地区。当我将块放入"侧栏第二" 时表单工作的工作原理。但是当我将相同的块放到"联系人" 区域(自定义区域)时,表单的AJAX部分不起作用。 这是我用来打印块的代码。 $contact = render(blo...

2  在引导程序期间,如何使用entity_create-> save()使用hook_action_info()操作?  ( How do i use hook action info actions with entity create save during bootst ) 
我正在构建一个独立的脚本,它使用Drupal的引导脚,因为我需要将其呈现为外部应用程序中的页面(Portal,专门)。目标是允许用户使用Ajax调用此脚本注册事件。 我正在使用的模块是node_rogistration。它我能够使用Bootstrap脚本中的API创建和保存实体(注册),没有问题。但是,在注册后应该有...

0  多帧模块D7 $编辑  ( Multiblock module d7 edit ) 
使用多块模块,我没有能够检索$编辑变量我的自定义 hook_block_configure() 或 hook_block_view() 。根据README: add an optional $edit argument to your hook_block_view and hook_block_configur...

1  如何允许拨打其他用户的角色?  ( How to allow a role to block other users ) 
看起来仍然没有一个很棒的反垃圾邮件解决方案为d7 ; - ( 我已经有节点的标志和具有自动Unpublish的注释,一旦足够的用户标记它。 我希望能够为用户提供一定的角色来阻止其他用户并可能取消发布该用户的任何内容。 我没有看到"块用户" 的权限。怎么做到这一点? ...

0  验证功能不适用于AJAX表单  ( Validate function not working in ajax form ) 
我在表单中使用了ajax,以便提交表单不会导致重新加载页面。但问题是'验证代码不起作用'。这是我在表单中使用的代码。 这是提交按钮的代码。 $form['submit'] = array( '#type' => 'submit', '#ajax' => array( 'callback' => '...

1  存储在数据库中的身体字段标签在哪里  ( Where is body field label stored in database ) 
由于一些缓存问题,我无法通过/ admin / structul / cypors / manage / page /字段立即更改字段标签。所以我以为我会从mysql中做到这一点,但我找不到它。任何帮助? 请注意,我在这里开发状态/ admin / config /开发/性能 - 根本没有缓存,没有压缩 ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.