仅使用内置摘要功能时,仅供文本使用段落模块 -- paragraphs 领域 drupal 相关 的问题

Using the built in summary feature when using ONLY paragraphs module for text


0
vote

问题

中文

我希望在常规创建内容方面具有更大的灵活性。因此,我使用段落模块,我也是禁用标准正文文本。所以现在,用户现在可以自由决定如何混合图像,文本和其他内容(如嵌入视频)。例如,一篇文章现在可以从文本开始,后跟全尺寸图像,或者用2个半尺寸的图像,然后是全尺寸视频,然后是文本等。

到目前为止这么好。现在问题是,我松开了标准摘要函数,因为默认的正文文本只是禁用。这对任何文章列表,即首页。

是尤其问题。

我已经设法使用自定义预处理挂钩解决此问题:

  function MY_THEME_preprocess_node(array &$variables) {    $node  = Drupal odeEntityNode::load($variables['node']->id());    if ($node->field_paragraph && !empty($node->field_paragraph->getValue())) {      foreach ($node->field_paragraph->getValue() as $key => $value) {       $paragraph = FALSE;       if (!empty($value['entity'])) {         // Use that, we're probably previewing.         $paragraph = $value['entity'];       } elseif (!empty($value['target_id'])) {         $paragraph = Paragraph::load($value['target_id']);       }        if (!empty($paragraph) && $paragraph instanceof Paragraph) {          $summary = $paragraph->getSummary();          if ($summary && $paragraph->type->getValue()[0]["target_id"] === "text") {           $variables['summary'] = $summary;           break;         }       }     }   } }   

这是什么,以循环给定节点中的所有段落条目(如果有)和停止在命名为"文本" 段落类型的第一个出现中,如果有 getSummary() 函数的结果,即该段落项也包含一些文本。请记住,我远离Drupal专家,所以这段代码可能不是最佳方式?

但是,我似乎无法控制摘要的长度,也包括同一段落中定义的任何头条新闻。最后但并非最不重要的是,结果也包含不需要的标记,所以在我的 node--article--teaser.html.twig twig模板中我必须再次剥离那些标签:
  <p>{{ summary|striptags }}</p>   

当我想在任何给定的文章页面上使用该摘要时出现下一个问题(因此在这种情况下,不是包含物品列表的页面。通常我只需使用metatags模块并为描述: [node:summary]

当然没有在这里工作,我可以想象进一步下来,我会遇到更多的问题。

因此,在我看来,最干净的方式是有点仿真 [node:summary] ,即该值通过类似于上面使用的功能的东西自动计算。因此,对于这个值的消费者来说,这将看起来相同的,好像页面/节点有一个实际的"默认" 摘要。

现在,这一点是这一点,如果"是" 我如何实现这一目标?任何洞察力都非常感谢!

英文原文

I want to have more flexibility in creating content as usual. Therefore, I use the Paragraphs module, and I also disabled the standard body text. So now, a user can now freely decide how he wants to mix images, text and other content (like embedded videos). For example, an article could now start with a text followed by a full size image, or with 2 half size images followed by a full size video and then the text and so on.

So far so good. Now the problem is that I loose the standard summary function since the default body text is just disabled. This is especially a problem for any list of articles, i.e. the front page.

I have managed to kinda solve this problem by a custom preprocess hook:

function MY_THEME_preprocess_node(array &$variables) {    $node  = \Drupal\node\Entity\Node::load($variables['node']->id());    if ($node->field_paragraph && !empty($node->field_paragraph->getValue())) {      foreach ($node->field_paragraph->getValue() as $key => $value) {       $paragraph = FALSE;       if (!empty($value['entity'])) {         // Use that, we're probably previewing.         $paragraph = $value['entity'];       } elseif (!empty($value['target_id'])) {         $paragraph = Paragraph::load($value['target_id']);       }        if (!empty($paragraph) && $paragraph instanceof Paragraph) {          $summary = $paragraph->getSummary();          if ($summary && $paragraph->type->getValue()[0]["target_id"] === "text") {           $variables['summary'] = $summary;           break;         }       }     }   } } 

What this does is to loop over all paragraph entries (if any) in a given node and stop iterating at the first occurence of a paragraph type named "text", if there is also a result for the getSummary() function, i.e. this paragraph item also contains some text. Keep in mind that I am far from being a Drupal expert, so this code might not be the optimal way?

However, I cannot seem to control the length of the summary, also any headlines defined in the same paragraph are included as well. Last but not least, the result also contains unneeded markup, so in my node--article--teaser.html.twig twig template I have to strip out those tags again:

<p>{{ summary|striptags }}</p> 

The next problem arises when I want to use that summary for the description meta tags on any given article page (so in this case, NOT the pages that contain only lists of articles). Usually I would just use the Metatags module and use this for the description: [node:summary]

Of course that does not work here, and I can imagine that further down the road I will encounter more problems like this.

Therefore, it seems to me that the cleanest way would be to kinda emulate [node:summary], i.e. that this value is automatically calculated by something similar to the function I used above. So for the consumer of this value this would look identical as if the page / node had an actual "default" summary.

Now, is this possible at all, and if "yes" how can I achieve this? Any insights are greatly appreciated!

  
         
         

回答列表

0
 
vote
好吧,看起来是时候再次回答自己的问题!

因此,由于我要使用的MetatAg模块基于令牌,因此,我已经设法使用我自己的模块实现了这一点,这又定义了一个额外的自定义令牌,反过来返回我所需的摘要。以下是我现在的 custom_summary_token.module 代码现在看起来像(仍在正在进行中):

  use DrupalCoreRenderBubbleableMetadata; use DrupalparagraphsEntityParagraph;  function custom_summary_token_token_info(){     $type = [         'name' => t('Nodes'),         'description' => t('Tokens related to individual nodes.'),         'needs-data' => 'node'     ];      $node['custom_summary'] = array(         'name' => t("Custom Summary"),         'description' => t("Token for dynamically generating a node summary, depending on the content. Used for extracting text when not using standard body field, but only paragraphs."),     );      return [         'types' => ['node' => $type],         'tokens' => ['node' => $node],     ]; }  function custom_summary_token_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata){      if (!isset($data['node'])) { return; }      $replacements = array();     $node = $data['node'];      if($type == 'node' && !empty($node)) {          foreach ($tokens as $name => $original) {              switch ($name) {                  case 'custom_summary':                      if (!empty($node->body->value)) {                          $text = strip_tags($node->body->value);                      } else if ($node->field_summary && !empty($node->field_summary->getValue())) {                          $text = $node->field_summary->getValue()[0]["value"];                      } else if ($node->field_paragraph_test && !empty($node->field_paragraph_test->getValue())) {                          foreach ($node->field_paragraph_test->getValue() as $key => $value) {                             $paragraph = FALSE;                             if (!empty($value['entity'])) {                                 $paragraph = $value['entity']; // Use that, we're probably previewing.                             } elseif (!empty($value['target_id'])) {                                 $paragraph = Paragraph::load($value['target_id']);                             }                             if ($paragraph !== FALSE && $paragraph instanceof Paragraph && $paragraph->getType() === "text") {                                 $text = strip_tags($paragraph->get('field_text_body')->value);                                 break;                             }                         }                      }                      if (strlen($text) > 150) {                         $text = substr($text, 0, 150)." ...";                     }                      $text = str_replace("&nbsp;", " ", $text); // filter out artefact when editing with chrome                     $replacements[$original] = $text;                     break;             }         }     }      return $replacements;  }   
所以它在该令牌钩子中的那样是(检查我们当然有正确的令牌后)首先要查找不空的普通默认正文文本。仅仅因为那么这也适用于我的另一个(在这种情况下也更简单)内容类型。然后,代码查找名为 field_summary 的自定义字段。结果,有些用户实际上想要创建一个自定义摘要,所以呀,他们也可以做到这一点。对于那些没有(大多数......)的人来说,代码然后查找第一个段落实例,也是一个文本块(而不是空的)。最后但并非最不重要的是,标签被剥离,整个东西被截断到150个字符,有一些"......" 追加良好的衡量标准。

现在,我可以像我的metaTag设置中的任何令牌一样使用它: [node:custom_summary] ,以及 - 在Twig调整模块中有一点帮助 - 也在任何模板中:

  {{ drupal_token('node:custom_summary', { node: node }) }}   

当然,这种实施仍然可能太天真或者会有一种更好的方式,我也不确定这种解决方案的性能影响有多大。但是嘿 - 至少这作品!

你觉得什么?

 

Well, looks like it is time again to answer my own question!

So, since the Metatag Module I want to also use is based on tokens anyway, I havexc2xa0managed to implement this using my own module which in turn just defines an additional custom token which in turn returns my desired summary. Here is what my current custom_summary_token.module code looks like right now (still work in progress):

use Drupal\Core\Render\BubbleableMetadata; use Drupal\paragraphs\Entity\Paragraph;  function custom_summary_token_token_info(){     $type = [         'name' => t('Nodes'),         'description' => t('Tokens related to individual nodes.'),         'needs-data' => 'node'     ];      $node['custom_summary'] = array(         'name' => t("Custom Summary"),         'description' => t("Token for dynamically generating a node summary, depending on the content. Used for extracting text when not using standard body field, but only paragraphs."),     );      return [         'types' => ['node' => $type],         'tokens' => ['node' => $node],     ]; }  function custom_summary_token_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata){      if (!isset($data['node'])) { return; }      $replacements = array();     $node = $data['node'];      if($type == 'node' && !empty($node)) {          foreach ($tokens as $name => $original) {              switch ($name) {                  case 'custom_summary':                      if (!empty($node->body->value)) {                          $text = strip_tags($node->body->value);                      } else if ($node->field_summary && !empty($node->field_summary->getValue())) {                          $text = $node->field_summary->getValue()[0]["value"];                      } else if ($node->field_paragraph_test && !empty($node->field_paragraph_test->getValue())) {                          foreach ($node->field_paragraph_test->getValue() as $key => $value) {                             $paragraph = FALSE;                             if (!empty($value['entity'])) {                                 $paragraph = $value['entity']; // Use that, we're probably previewing.                             } elseif (!empty($value['target_id'])) {                                 $paragraph = Paragraph::load($value['target_id']);                             }                             if ($paragraph !== FALSE && $paragraph instanceof Paragraph && $paragraph->getType() === "text") {                                 $text = strip_tags($paragraph->get('field_text_body')->value);                                 break;                             }                         }                      }                      if (strlen($text) > 150) {                         $text = substr($text, 0, 150)." ...";                     }                      $text = str_replace("&nbsp;", " ", $text); // filter out artefact when editing with chrome                     $replacements[$original] = $text;                     break;             }         }     }      return $replacements;  } 

So what this does in that tokens hook is (after checking that we have the right token of course) first toxc2xa0look for an ordinary default body text which is not empty. Simply because then this also works for my other (in this case also simpler) content types. Then, the code looks for a custom field namedxc2xa0field_summary. Turned out that some users actually want to create a custom summary, so yeah now they can do that as well. For those who don't (the majority ...), the code then looks for the first paragraph instance which is also a text block (and not empty). Last but not least, tags are stripped, and the whole thing is truncated to 150 chars, with some "..." appended for good measure.

Now, I can use this just like any token in my Metatag setup:xc2xa0[node:custom_summary], and - with a little help from the twig tweak module - also in any template:xc2xa0

{{ drupal_token('node:custom_summary', { node: node }) }} 

Of course this implementation still might be too naive or there would be an even better way, also I am not sure how big the performance impact of such a solution is.xc2xa0But hey - at least this works!

What would you think?

 
 

相关问题

0  Hook_Node_Presave期间如何重新排序实体引用版本字段?  ( How do you reorder an entity reference revisions field during hook node presave ) 
我正在尝试根据节点保存的文本字段重新排序一些段落,因此作者不需要手动维护字母顺序,但是当我保存节点时,所有值都丢失。我尝试匹配$ node-&gt; get('field_paragraphs') - &gt; getValue(),但这似乎没有工作。 function mymodule_node_presave...

0  如何识别使用某个段落类型或模板的所有节点?  ( How can you identify all nodes that use a certain paragraph type or template ) 
在Drupal 7中,给定自定义段落包和关联的模板文件,有没有办法列出使用该捆绑包的所有节点?或者,如果它更容易,那种方法对于特定模块而不是段落类型的方法? 一个drupal核心模块更新( https://www.drupal.org/project / link / secories / 3095484 )在我们网...

3  如何从ConstraintValidator访问其他提交的值?  ( How do you access other submitted values from constraintvalidator ) 
可能很遗憾这里显而易见。所以在Drupal 8中我有一个内容类型。具有日期范围字段,然后使用段落,一个包含日期字段的几个字段的段落。 所以我需要验证它,以便日期范围字段(field_a)检查开始和结束是否正确。这是开始在最后或之前。没问题,它是完成和灰尘 - firstConstraintValidator.ph...

1  在Cron运行期间将段落字段设置为null时出错  ( Error while set a paragraph field to null during cron run ) 
我正在使用drupal 8,我已经实现了 hook_cron ,将节点字段设置为null。这是我的代码: if ($lesson->field_lesson_ended_at->value < $current_time && $session_id && count($paragraphs) > 0) { ...

0  如何将类添加到字段 - 段落生成的项目元素  ( How to add class to field item element generated by paragraphs ) 
我有一个名为"网格项目" 的段落类型。 我创建了一个名为"段落 - grid-item - default.html.twig" 的文件,其中我打印所有所需的字段。 这一切都按预期工作,但我需要将类(从某些列表字段)添加到元素"字段 - 项目" 。我可以在此元素的任何其他子项中添加类,但直接放在它上。 这是我的...

0  呈现段落参考字段.html.twig  ( Render paragraph reference field in page html twig ) 
在 page.html.twig 我想要显示一个段参考字段,其中包含左和右图_field。 节点中的引用字段的名称为: field_intro 。该字段链接到名为:text_left_right 的段落类型 使用以下代码我可以呈现段落,但如果我在段落类型添加额外的字段,则不会更新。我想呈现所有字段,即使我在将来添加一...

0  未经父母导入迁移到段落中  ( Migrate into paragraphs without parent import ) 
如果我有一个具有某种值的数据源,我可以处理那些附加到Drupal 8中的节点的段落,而无需运行先前的迁移以首先创建段落(然后依赖于Migration_Lookup)? 我是否需要某种进程插件(如将JSON数据导入节点使用)或者可以在yml中的简单通用子进程/映射配置中完成框中的框? ...

1  如何在身体和段落字段之间显示块?  ( How to show a block between the body and a paragraphs field ) 
对于Drupal 8页面上的较大文章内容类型,我希望具有以下结构: 标题图像/视频 主体(具有标题和某些文本的正常节点正文) 一个contanct块 段 对于标题图像/视频我不确定我是否只想创建2种不同的文章类型或找到一些魔法来做一个或另一个,但这很好。 接下来的主体,只需按照它并包含一些介绍文本。我想,我必须编写自...

0  库项目字段未显示删除按钮  ( Library item field doesnt show up the remove button ) 
我在我的drupal项目中使用段落和段落库模块。该段(a)段有文本领域(无限制)。我没有看到该字段上的删除按钮。我只需要一个页面的一个项目,但它会显示更多的一个字段。有没有办法删除它? ...

0  为什么以编程方式删除段落项仍然显示在节点上添加新段落后?  ( Why is the programmatically removed paragraph item still showing after adding a ) 
我在一个节点中有一个段落字段,包含无限制的添加段落。我正在以计划地删除这些段落。它删除但是当我添加一个新段落时,它会添加空白段落。 我正在使用此代码删除段落 use DrupalparagraphsParagraphInterface; use DrupalparagraphsEntityParagraph; ...

0  如何使用URL的段落中过滤视图?  ( How to filter a view from within a paragraph ideally using url ) 
我有一个基本页面,其中包含具有以下字段的段落: label =新闻视图 字段 类型 =视图参考(参考方法=默认) 此引用具有用于NodeID的上下文过滤器的视图。如果我在段参数(例如14)中设置了静态值,则基本页面显示为我想要的(使用NodeID = 14上的视图过滤)。 但是,我希望此页面根据URL中的内容进行...

2  使用节点视图中的段落文本字段中的视图下拉下拉下拉目  ( Use dropdown in views exposed filter on paragraph text field in node view ) 
我已经看过使用Node-&gt的文本字段中的视图中的视图下拉列表;标题?,但我需要从节点的段落字段中使用字段。 假设节点中的段落字段称为字段_pdfs,段落中的字段称为字段_pdf_title。 (节点 - &gt; field_pdfs - &gt; field_pdf_title)。 我尝试了以下代码: f...

0  在段落视图中使用段落文本字段上的视图下拉下拉目  ( Use dropdown in views exposed filter on paragraph text field in paragraph view ) 
我有它为节点工作,但我试过段落视图,它不起作用 这是代码: function hook_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id) { $storage = Drupal::getContaine...

0  如何创建视图以使用标题使用引导段落字段和组?  ( How do i create a view to use bootstrap paragraph fields and group by the title ) 
我对常见问题解答以及公开的组合字段过滤器进行了视图。我创建了一个常见问题解答内容类型,并添加了一个包含"问题" 和"答案" 字段的段落字段。我不能使用搜索API,并希望找到使用视图的方法。 如果我选择制作字段的页面,段落字段不适用于组合的字段搜索。 如果我选择执行段落字段的页面,我无法添加标题字段。 任何帮助都得...

0  如何在提交的段落字段中设置新值?  ( How to set a new value in a paragraph field on submit ) 
以段落的内容为内容,我将段落特定字段上的错误设置为此特定语法: $form_state->setErrorByName('field_paragraphs][' . $key . '][subform][field_sharepoint_file_url][' . $key2, t('Invalid URL')...

-1  以form_views_expode_form_alter以编程方式获取当前节点的所有段落  ( Get all the paragraphs of the current node programmatically in form views expose ) 
我有一个带有多个字段段落的内容类型。我想从form_views_expode_form_alter中的当前节点获取所有段落。 我尝试了 $node = menu_get_object(); $storage = Drupal::getContainer()->get('entity_type.manager...

0  控制段落的可见性,没有字段  ( Control visibility of paragraph without fields ) 
我正在预处理一个段落添加自定义表单,但我无法遇到可见性。我不需要本段上的任何字段。 如果我只是将表单添加到段落中,整个段落隐藏匿名用户。 function my_module_preprocess_paragraph__my_paragraph(&$variables) { $paragraph = $var...

0  分组视图中的段落字段  ( Group paragraph fields in views ) 
我已将段落字段添加为关系,并设法将我的字段添加到视图中,但我似乎无法将它们分组在一起。结果,节点实体正在吐出两次。是否可以将节点组合在一起? 电流: 0: { nid: '1', field_section_title: 'Section 1', field_section_referen...

0  具有相同计算机名称的字段是否有任何可能的冲突?  ( Is there any possible conflict for fields with the same machine name ) 
我正在尝试调试不显示字段的段落,我有 / admin /报告/字段 3个不同段落的字段的相同计算机名称 field_call_to_action_ref paragraph Entity reference revisions (module : entity_reference_revisio...

1  使用树枝渲染嵌套段落的字段  ( Rendering a nested paragraphs field using twig ) 
我们正在使用drupal 8段落模块,并且有一个段落,其中包含一个段落类型字段,称为"步骤" (机器名称fs_steps),允许编辑器添加许多"步骤" 段落(Machine Name FSS_Steps)父段呈现。 在枝条文件中,我们循环通过父步骤字段的实体,但是当我们尝试使用两个字段"标题" 字段时(此代码在fo...




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


Licensed under cc by-sa 3.0 with attribution required.