Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\aggregator\Entity;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Cache\Cache;
|
Chris@0
|
6 use Drupal\Core\Entity\ContentEntityBase;
|
Chris@0
|
7 use Drupal\Core\Entity\EntityStorageInterface;
|
Chris@0
|
8 use Drupal\aggregator\ItemInterface;
|
Chris@0
|
9 use Drupal\Core\Entity\EntityTypeInterface;
|
Chris@0
|
10 use Drupal\Core\Field\BaseFieldDefinition;
|
Chris@0
|
11 use Drupal\Core\Url;
|
Chris@0
|
12
|
Chris@0
|
13 /**
|
Chris@0
|
14 * Defines the aggregator item entity class.
|
Chris@0
|
15 *
|
Chris@0
|
16 * @ContentEntityType(
|
Chris@0
|
17 * id = "aggregator_item",
|
Chris@0
|
18 * label = @Translation("Aggregator feed item"),
|
Chris@17
|
19 * label_collection = @Translation("Aggregator feed items"),
|
Chris@17
|
20 * label_singular = @Translation("aggregator feed item"),
|
Chris@17
|
21 * label_plural = @Translation("aggregator feed items"),
|
Chris@17
|
22 * label_count = @PluralTranslation(
|
Chris@17
|
23 * singular = "@count aggregator feed item",
|
Chris@17
|
24 * plural = "@count aggregator feed items",
|
Chris@17
|
25 * ),
|
Chris@0
|
26 * handlers = {
|
Chris@0
|
27 * "storage" = "Drupal\aggregator\ItemStorage",
|
Chris@0
|
28 * "storage_schema" = "Drupal\aggregator\ItemStorageSchema",
|
Chris@0
|
29 * "view_builder" = "Drupal\aggregator\ItemViewBuilder",
|
Chris@0
|
30 * "access" = "Drupal\aggregator\FeedAccessControlHandler",
|
Chris@0
|
31 * "views_data" = "Drupal\aggregator\AggregatorItemViewsData"
|
Chris@0
|
32 * },
|
Chris@0
|
33 * uri_callback = "Drupal\aggregator\Entity\Item::buildUri",
|
Chris@0
|
34 * base_table = "aggregator_item",
|
Chris@0
|
35 * render_cache = FALSE,
|
Chris@0
|
36 * list_cache_tags = { "aggregator_feed_list" },
|
Chris@0
|
37 * entity_keys = {
|
Chris@0
|
38 * "id" = "iid",
|
Chris@0
|
39 * "label" = "title",
|
Chris@0
|
40 * "langcode" = "langcode",
|
Chris@0
|
41 * }
|
Chris@0
|
42 * )
|
Chris@0
|
43 */
|
Chris@0
|
44 class Item extends ContentEntityBase implements ItemInterface {
|
Chris@0
|
45
|
Chris@0
|
46 /**
|
Chris@0
|
47 * {@inheritdoc}
|
Chris@0
|
48 */
|
Chris@0
|
49 public function label() {
|
Chris@0
|
50 return $this->get('title')->value;
|
Chris@0
|
51 }
|
Chris@0
|
52
|
Chris@0
|
53 /**
|
Chris@0
|
54 * {@inheritdoc}
|
Chris@0
|
55 */
|
Chris@0
|
56 public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
|
Chris@0
|
57 /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
|
Chris@0
|
58 $fields = parent::baseFieldDefinitions($entity_type);
|
Chris@0
|
59
|
Chris@0
|
60 $fields['iid']->setLabel(t('Aggregator item ID'))
|
Chris@0
|
61 ->setDescription(t('The ID of the feed item.'));
|
Chris@0
|
62
|
Chris@0
|
63 $fields['langcode']->setLabel(t('Language code'))
|
Chris@0
|
64 ->setDescription(t('The feed item language code.'));
|
Chris@0
|
65
|
Chris@0
|
66 $fields['fid'] = BaseFieldDefinition::create('entity_reference')
|
Chris@0
|
67 ->setLabel(t('Source feed'))
|
Chris@0
|
68 ->setRequired(TRUE)
|
Chris@0
|
69 ->setDescription(t('The aggregator feed entity associated with this item.'))
|
Chris@0
|
70 ->setSetting('target_type', 'aggregator_feed')
|
Chris@0
|
71 ->setDisplayOptions('view', [
|
Chris@0
|
72 'label' => 'hidden',
|
Chris@0
|
73 'type' => 'entity_reference_label',
|
Chris@0
|
74 'weight' => 0,
|
Chris@0
|
75 ])
|
Chris@0
|
76 ->setDisplayConfigurable('form', TRUE);
|
Chris@0
|
77
|
Chris@0
|
78 $fields['title'] = BaseFieldDefinition::create('string')
|
Chris@0
|
79 ->setLabel(t('Title'))
|
Chris@0
|
80 ->setDescription(t('The title of the feed item.'));
|
Chris@0
|
81
|
Chris@0
|
82 $fields['link'] = BaseFieldDefinition::create('uri')
|
Chris@0
|
83 ->setLabel(t('Link'))
|
Chris@0
|
84 ->setDescription(t('The link of the feed item.'))
|
Chris@0
|
85 ->setDisplayOptions('view', [
|
Chris@0
|
86 'region' => 'hidden',
|
Chris@0
|
87 ])
|
Chris@0
|
88 ->setDisplayConfigurable('view', TRUE);
|
Chris@0
|
89
|
Chris@0
|
90 $fields['author'] = BaseFieldDefinition::create('string')
|
Chris@0
|
91 ->setLabel(t('Author'))
|
Chris@0
|
92 ->setDescription(t('The author of the feed item.'))
|
Chris@0
|
93 ->setDisplayOptions('view', [
|
Chris@0
|
94 'label' => 'hidden',
|
Chris@0
|
95 'weight' => 3,
|
Chris@0
|
96 ])
|
Chris@0
|
97 ->setDisplayConfigurable('view', TRUE);
|
Chris@0
|
98
|
Chris@0
|
99 $fields['description'] = BaseFieldDefinition::create('string_long')
|
Chris@0
|
100 ->setLabel(t('Description'))
|
Chris@0
|
101 ->setDescription(t('The body of the feed item.'));
|
Chris@0
|
102
|
Chris@0
|
103 $fields['timestamp'] = BaseFieldDefinition::create('created')
|
Chris@0
|
104 ->setLabel(t('Posted on'))
|
Chris@0
|
105 ->setDescription(t('Posted date of the feed item, as a Unix timestamp.'))
|
Chris@0
|
106 ->setDisplayOptions('view', [
|
Chris@0
|
107 'label' => 'hidden',
|
Chris@0
|
108 'type' => 'timestamp_ago',
|
Chris@0
|
109 'weight' => 1,
|
Chris@0
|
110 ])
|
Chris@0
|
111 ->setDisplayConfigurable('view', TRUE);
|
Chris@0
|
112
|
Chris@0
|
113 // @todo Convert to a real UUID field in
|
Chris@0
|
114 // https://www.drupal.org/node/2149851.
|
Chris@0
|
115 $fields['guid'] = BaseFieldDefinition::create('string_long')
|
Chris@0
|
116 ->setLabel(t('GUID'))
|
Chris@0
|
117 ->setDescription(t('Unique identifier for the feed item.'));
|
Chris@0
|
118
|
Chris@0
|
119 return $fields;
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 /**
|
Chris@0
|
123 * {@inheritdoc}
|
Chris@0
|
124 */
|
Chris@0
|
125 public function getFeedId() {
|
Chris@0
|
126 return $this->get('fid')->target_id;
|
Chris@0
|
127 }
|
Chris@0
|
128
|
Chris@0
|
129 /**
|
Chris@0
|
130 * {@inheritdoc}
|
Chris@0
|
131 */
|
Chris@0
|
132 public function setFeedId($fid) {
|
Chris@0
|
133 return $this->set('fid', $fid);
|
Chris@0
|
134 }
|
Chris@0
|
135
|
Chris@0
|
136 /**
|
Chris@0
|
137 * {@inheritdoc}
|
Chris@0
|
138 */
|
Chris@0
|
139 public function getTitle() {
|
Chris@0
|
140 return $this->get('title')->value;
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 /**
|
Chris@0
|
144 * {@inheritdoc}
|
Chris@0
|
145 */
|
Chris@0
|
146 public function setTitle($title) {
|
Chris@0
|
147 return $this->set('title', $title);
|
Chris@0
|
148 }
|
Chris@0
|
149
|
Chris@0
|
150 /**
|
Chris@0
|
151 * {@inheritdoc}
|
Chris@0
|
152 */
|
Chris@0
|
153 public function getLink() {
|
Chris@0
|
154 return $this->get('link')->value;
|
Chris@0
|
155 }
|
Chris@0
|
156
|
Chris@0
|
157 /**
|
Chris@0
|
158 * {@inheritdoc}
|
Chris@0
|
159 */
|
Chris@0
|
160 public function setLink($link) {
|
Chris@0
|
161 return $this->set('link', $link);
|
Chris@0
|
162 }
|
Chris@0
|
163
|
Chris@0
|
164 /**
|
Chris@0
|
165 * {@inheritdoc}
|
Chris@0
|
166 */
|
Chris@0
|
167 public function getAuthor() {
|
Chris@0
|
168 return $this->get('author')->value;
|
Chris@0
|
169 }
|
Chris@0
|
170
|
Chris@0
|
171 /**
|
Chris@0
|
172 * {@inheritdoc}
|
Chris@0
|
173 */
|
Chris@0
|
174 public function setAuthor($author) {
|
Chris@0
|
175 return $this->set('author', $author);
|
Chris@0
|
176 }
|
Chris@0
|
177
|
Chris@0
|
178 /**
|
Chris@0
|
179 * {@inheritdoc}
|
Chris@0
|
180 */
|
Chris@0
|
181 public function getDescription() {
|
Chris@0
|
182 return $this->get('description')->value;
|
Chris@0
|
183 }
|
Chris@0
|
184
|
Chris@0
|
185 /**
|
Chris@0
|
186 * {@inheritdoc}
|
Chris@0
|
187 */
|
Chris@0
|
188 public function setDescription($description) {
|
Chris@0
|
189 return $this->set('description', $description);
|
Chris@0
|
190 }
|
Chris@0
|
191
|
Chris@0
|
192 /**
|
Chris@0
|
193 * {@inheritdoc}
|
Chris@0
|
194 */
|
Chris@0
|
195 public function getPostedTime() {
|
Chris@0
|
196 return $this->get('timestamp')->value;
|
Chris@0
|
197 }
|
Chris@0
|
198
|
Chris@0
|
199 /**
|
Chris@0
|
200 * {@inheritdoc}
|
Chris@0
|
201 */
|
Chris@0
|
202 public function setPostedTime($timestamp) {
|
Chris@0
|
203 return $this->set('timestamp', $timestamp);
|
Chris@0
|
204 }
|
Chris@0
|
205
|
Chris@0
|
206 /**
|
Chris@0
|
207 * {@inheritdoc}
|
Chris@0
|
208 */
|
Chris@0
|
209 public function getGuid() {
|
Chris@0
|
210 return $this->get('guid')->value;
|
Chris@0
|
211 }
|
Chris@0
|
212
|
Chris@0
|
213 /**
|
Chris@0
|
214 * {@inheritdoc}
|
Chris@0
|
215 */
|
Chris@0
|
216 public function setGuid($guid) {
|
Chris@0
|
217 return $this->set('guid', $guid);
|
Chris@0
|
218 }
|
Chris@0
|
219
|
Chris@0
|
220 /**
|
Chris@0
|
221 * {@inheritdoc}
|
Chris@0
|
222 */
|
Chris@0
|
223 public function postSave(EntityStorageInterface $storage, $update = TRUE) {
|
Chris@0
|
224 parent::postSave($storage, $update);
|
Chris@0
|
225
|
Chris@0
|
226 // Entity::postSave() calls Entity::invalidateTagsOnSave(), which only
|
Chris@0
|
227 // handles the regular cases. The Item entity has one special case: a newly
|
Chris@0
|
228 // created Item is *also* associated with a Feed, so we must invalidate the
|
Chris@0
|
229 // associated Feed's cache tag.
|
Chris@0
|
230 if (!$update) {
|
Chris@0
|
231 Cache::invalidateTags($this->getCacheTagsToInvalidate());
|
Chris@0
|
232 }
|
Chris@0
|
233 }
|
Chris@0
|
234
|
Chris@0
|
235 /**
|
Chris@0
|
236 * {@inheritdoc}
|
Chris@0
|
237 */
|
Chris@0
|
238 public function getCacheTagsToInvalidate() {
|
Chris@0
|
239 return Feed::load($this->getFeedId())->getCacheTags();
|
Chris@0
|
240 }
|
Chris@0
|
241
|
Chris@0
|
242 /**
|
Chris@0
|
243 * Entity URI callback.
|
Chris@0
|
244 */
|
Chris@0
|
245 public static function buildUri(ItemInterface $item) {
|
Chris@0
|
246 return Url::fromUri($item->getLink());
|
Chris@0
|
247 }
|
Chris@0
|
248
|
Chris@0
|
249 }
|