RSS teasers: After a lot of iterations, a lot of things are working

... so let's finally geta snapshot.
This commit is contained in:
benjamin melançon 2019-01-17 13:13:15 -05:00
parent 1fad6093ad
commit 49713f7af1
4 changed files with 218 additions and 0 deletions

View file

@ -0,0 +1,45 @@
{#
/**
* @file
* Theme override for a field.
*
* To override output, copy the "field.html.twig" from the templates directory
* to your theme's directory and customize it, just like customizing other
* Drupal templates such as page.html.twig or node.html.twig.
*
* Instead of overriding the theming for all fields, you can also just override
* theming for a subset of fields using
* @link themeable Theme hook suggestions. @endlink For example,
* here are some theme hook suggestions that can be used for a field_foo field
* on an article node type:
* - field--node--field-foo--article.html.twig
* - field--node--field-foo.html.twig
* - field--node--article.html.twig
* - field--field-foo.html.twig
* - field--text-with-summary.html.twig
* - field.html.twig
*
* Available variables:
* - attributes: HTML attributes for the containing element.
* - label_hidden: Whether to show the field label or not.
* - title_attributes: HTML attributes for the title.
* - label: The label for the field.
* - multiple: TRUE if a field can contain multiple items.
* - items: List of all the field items. Each item contains:
* - attributes: List of HTML attributes for each item.
* - content: The field item's content.
* - entity_type: The entity type to which the field belongs.
* - field_name: The name of the field.
* - field_type: The type of the field.
* - label_display: The display settings for the label.
*
* @see template_preprocess_field()
*/
#}
<description>
{% for item in items %}
{{ item.content|render|escape }}
{% endfor %}
{# the closing description tag is found in the RSS view template so that we can
add a Read more link — we don't have the node information to make it here!
See views/views-view-row-rss--taxonomy-term--feed-teasers.html.twig #}

View file

@ -0,0 +1,108 @@
{#
/**
* @file
* Theme override to display a node.
*
* Available variables:
* - node: The node entity with limited access to object properties and methods.
* Only method names starting with "get", "has", or "is" and a few common
* methods such as "id", "label", and "bundle" are available. For example:
* - node.getCreatedTime() will return the node creation timestamp.
* - node.hasField('field_example') returns TRUE if the node bundle includes
* field_example. (This does not indicate the presence of a value in this
* field.)
* - node.isPublished() will return whether the node is published or not.
* Calling other methods, such as node.delete(), will result in an exception.
* See \Drupal\node\Entity\Node for a full list of public properties and
* methods for the node object.
* - label: The title of the node.
* - content: All node items. Use {{ content }} to print them all,
* or print a subset such as {{ content.field_example }}. Use
* {{ content|without('field_example') }} to temporarily suppress the printing
* of a given child element.
* - author_picture: The node author user entity, rendered using the "compact"
* view mode.
* - metadata: Metadata for this node.
* - date: Themed creation date field.
* - author_name: Themed author name field.
* - url: Direct URL of the current node.
* - display_submitted: Whether submission information should be displayed.
* - attributes: HTML attributes for the containing element.
* The attributes.class element may contain one or more of the following
* classes:
* - node: The current template type (also known as a "theming hook").
* - node--type-[type]: The current node type. For example, if the node is an
* "Article" it would result in "node--type-article". Note that the machine
* name will often be in a short form of the human readable label.
* - node--view-mode-[view_mode]: The View Mode of the node; for example, a
* teaser would result in: "node--view-mode-teaser", and
* full: "node--view-mode-full".
* The following are controlled through the node publishing options.
* - node--promoted: Appears on nodes promoted to the front page.
* - node--sticky: Appears on nodes ordered above other non-sticky nodes in
* teaser listings.
* - node--unpublished: Appears on unpublished nodes visible only to site
* admins.
* - title_attributes: Same as attributes, except applied to the main title
* tag that appears in the template.
* - content_attributes: Same as attributes, except applied to the main
* content tag that appears in the template.
* - author_attributes: Same as attributes, except applied to the author of
* the node tag that appears in the template.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional output populated by modules, intended to be
* displayed after the main title tag that appears in the template.
* - view_mode: View mode; for example, "teaser" or "full".
* - teaser: Flag for the teaser state. Will be true if view_mode is 'teaser'.
* - page: Flag for the full page state. Will be true if view_mode is 'full'.
* - readmore: Flag for more state. Will be true if the teaser content of the
* node cannot hold the main body content.
* - logged_in: Flag for authenticated user status. Will be true when the
* current user is a logged-in member.
* - is_admin: Flag for admin user status. Will be true when the current user
* is an administrator.
*
* @see template_preprocess_node()
*
* @todo Remove the id attribute (or make it a class), because if that gets
* rendered twice on a page this is invalid CSS for example: two lists
* in different view modes.
*/
#}
BOW! BOW BEFORE MY POWER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<a class="teaser media content" href="{{ url }}">
{% set has_title_paragraph = false %}
{% if content.field_body_paragraph %}
{% for i, paragraph in content.field_body_paragraph if i|first != '#' %}
{% if content.field_body_paragraph['#items'][i].entity.type.0.entity.id == 'title' %}
{% set has_title_paragraph = true %}
{{ paragraph }}
{% endif %}
{% endfor %}
{% endif %}
{% if not has_title_paragraph %}
<div class="media-left">
{{ content.field_image }}
{% if node.bundle == 'blog' and content.field_authors is not empty %}
<p class="byline is-mono">
By {{ content.field_authors }}<br />
On {{ date }}
</p>
{% endif %}
</div>
<div class="media-content content">
<h3 class="title is-5">{{ label }}</h3>
<div class="subtitle is-6">
{{ content.field_summary }}
</div>
</div>
{% endif %}
</a>
<!-- Unexpected extra content -->
{{ content|without('field_body_paragraph', 'field_authors', 'field_image', 'field_summary', 'uid', 'created') }}

View file

@ -0,0 +1,37 @@
{#
/**
* @file
* Theme override to display an item in a views RSS feed.
*
* Available variables:
* - title: RSS item title.
* - link: RSS item link.
* - description: RSS body text.
* - item_elements: RSS item elements to be rendered as XML (pubDate, creator,
* guid).
*
* @see template_preprocess_views_view_row_rss()
*
* web/core/modules/node/src/Plugin/views/row/Rss.php manages to process the
* node rendering without a node template being involved, and i'm not exactly
* sure how, but we work around it by taking each field we enable in the RSS
* Teaser view mode and overriding the field template, so go see various
* field--*--rss-teaser.html.twig templates to see inside 'description'.
*/
#}
<item>
<title>{{ title }}</title>
<link>{{ link }}</link>
<guid isPermaLink="true">{{ link }}</guid>
<comments>{{ link }}#comments</comments>
{# The RSS Teaser view mode *must* be configured to output the body paragraph
(summary) LAST; see below for why. #}
{{ description|render|raw }}
<a href="{{ item.node.url }}">Read more and discuss at agaric.coop.</a>
{# Opening description tag is in paragraph template used for description,
see field/field--field-body-paragraph--rss-teaser.html.twig and only the
closing description tag is here so that we can have the read more link
here (the node info isn't available in the paragraph field template, ugh.
Also this is horrific and don't try this at home, kids. #}
</description>
</item>

View file

@ -0,0 +1,28 @@
{#
/**
* @file
* Theme override to display an item in a views RSS feed.
*
* Available variables:
* - title: RSS item title.
* - link: RSS item link.
* - description: RSS body text.
* - item_elements: RSS item elements to be rendered as XML (pubDate, creator,
* guid).
*
* @see template_preprocess_views_view_row_rss()
*/
#}
<item>
<title>{{ title }}</title>
<link>{{ link }}</link>
<description>{{ description }}</description>
{% for item in item_elements -%}
<{{ item.key }}{{ item.attributes -}}
{% if item.value -%}
>{{ item.value }}</{{ item.key }}>
{% else -%}
{{ ' />' }}
{% endif %}
{%- endfor %}
</item>