Skip to content

Commit 679d668

Browse files
committed
support for asset's native alt field
1 parent 1c8cafc commit 679d668

File tree

5 files changed

+83
-21
lines changed

5 files changed

+83
-21
lines changed

src/base/Field.php

+40-5
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,47 @@ public function fetchValue(): mixed
143143
// =========================================================================
144144

145145
/**
146-
* @param $elementIds
147-
* @param null $nodeKey
146+
* Save native field data on the elements.
147+
*
148+
* @param array $elementIds
149+
* @param string|null $nodeKey
150+
* @return void
151+
* @throws Throwable
152+
* @throws ElementNotFoundException
153+
* @throws Exception
154+
*/
155+
protected function populateNativeFields(array $elementIds, string $nodeKey = null): void
156+
{
157+
$this->populateFields($elementIds, $nodeKey, 'native');
158+
}
159+
160+
/**
161+
* @param array $elementIds
162+
* @param string|null $nodeKey
163+
* @return void
148164
* @throws Throwable
149165
* @throws ElementNotFoundException
150166
* @throws Exception
151167
*/
152-
protected function populateElementFields($elementIds, $nodeKey = null): void
168+
protected function populateElementFields(array $elementIds, string $nodeKey = null): void
169+
{
170+
$this->populateFields($elementIds, $nodeKey);
171+
}
172+
173+
/**
174+
* @param array $elementIds Array of elementIds to populate.
175+
* @param string|null $nodeKey
176+
* @param string $fieldType Type of field to populate, can be `custom` or `native`.
177+
* @return void
178+
* @throws Throwable
179+
* @throws ElementNotFoundException
180+
* @throws Exception
181+
*/
182+
private function populateFields(array $elementIds, string $nodeKey = null, string $fieldType = 'custom'): void
153183
{
154184
$elementsService = Craft::$app->getElements();
155-
$fields = Hash::get($this->fieldInfo, 'fields');
185+
$fieldTypeKey = $fieldType === 'custom' ? 'fields' : 'nativeFields';
186+
$fields = Hash::get($this->fieldInfo, $fieldTypeKey);
156187

157188
$fieldData = [];
158189

@@ -180,7 +211,11 @@ protected function populateElementFields($elementIds, $nodeKey = null): void
180211
foreach ($fieldData as $elementId => $fieldContent) {
181212
$element = $elementsService->getElementById($elementId, null, Hash::get($this->feed, 'siteId'));
182213

183-
$element->setFieldValues($fieldContent);
214+
if ($fieldType === 'native') {
215+
$element->setAttributes($fieldContent);
216+
} else {
217+
$element->setFieldValues($fieldContent);
218+
}
184219

185220
Plugin::debug([
186221
$this->fieldHandle => [

src/fields/Assets.php

+5
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public function parseField(): mixed
8787
$upload = Hash::get($this->fieldInfo, 'options.upload');
8888
$conflict = Hash::get($this->fieldInfo, 'options.conflict');
8989
$fields = Hash::get($this->fieldInfo, 'fields');
90+
$nativeFields = Hash::get($this->fieldInfo, 'nativeFields');
9091
$node = Hash::get($this->fieldInfo, 'node');
9192
$nodeKey = null;
9293

@@ -252,6 +253,10 @@ public function parseField(): mixed
252253
$this->populateElementFields($foundElements, $nodeKey);
253254
}
254255

256+
if ($nativeFields) {
257+
$this->populateNativeFields($foundElements, $nodeKey);
258+
}
259+
255260
$foundElements = array_unique($foundElements);
256261

257262
// Protect against sending an empty array - removing any existing elements

src/templates/_includes/elements/assets/map.html

+20-8
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,26 @@ <h2>{{ tab.name }} Fields</h2>
8686
<th>{{ 'Default Value'|t('feed-me') }}</th>
8787
</thead>
8888
<tbody>
89-
{% for layoutField in tab.getElements()|filter(e => e is instance of('craft\\fieldlayoutelements\\CustomField')) %}
90-
{% set field = layoutField.getField() %}
91-
{% set fieldClass = craft.feedme.fields.getRegisteredField(className(field)) %}
92-
{% set template = fieldClass.getMappingTemplate() %}
93-
94-
{% set variables = { name: field.name, handle: field.handle, feed: feed, feedData: feedData, field: field, fieldClass: fieldClass } %}
95-
96-
{% include template ignore missing with variables only %}
89+
{% for layoutField in tab.getElements()|filter(e => e is instance of('craft\\fieldlayoutelements\\CustomField') or e is instance of('craft\\fieldlayoutelements\\assets\\AltField')) %}
90+
{% if layoutField is instance of('craft\\fieldlayoutelements\\assets\\AltField') %}
91+
{% set variables = {
92+
name: 'Alternative Text'|t('feed-me'),
93+
handle: 'alt',
94+
feed: feed,
95+
feedData: feedData,
96+
attribute: true,
97+
} %}
98+
99+
{% include 'feed-me/_includes/fields/default' ignore missing with variables only %}
100+
{% else %}
101+
{% set field = layoutField.getField() %}
102+
{% set fieldClass = craft.feedme.fields.getRegisteredField(className(field)) %}
103+
{% set template = fieldClass.getMappingTemplate() %}
104+
105+
{% set variables = { name: field.name, handle: field.handle, feed: feed, feedData: feedData, field: field, fieldClass: fieldClass } %}
106+
107+
{% include template ignore missing with variables only %}
108+
{% endif %}
97109
{% endfor %}
98110
</tbody>
99111
</table>

src/templates/_includes/fields/_base.html

+14-7
Original file line numberDiff line numberDiff line change
@@ -199,18 +199,25 @@
199199
{% for elementField in elementFields %}
200200
{% set fieldClass = craft.feedme.fields.getRegisteredField(className(elementField)) %}
201201
{% set template = fieldClass.getMappingTemplate() %}
202-
203-
{% if parentPath is defined %}
204-
{% set path = parentPath|merge([ 'fields', elementField.handle ]) %}
202+
{% set attribute = elementField['attribute'] ?? null %}
203+
{% set elementFieldHandle = elementField['handle'] ?? attribute ?? '' %}
204+
205+
{% if parentPath is defined and attribute %}
206+
{% set path = parentPath|merge([ 'nativeFields', elementFieldHandle ]) %}
207+
{% elseif parentPath is defined %}
208+
{% set path = parentPath|merge([ 'fields', elementFieldHandle ]) %}
209+
{% elseif attribute %}
210+
{% set path = [ handle, 'nativeFields', attribute ] %}
205211
{% else %}
206-
{% set path = [ handle, 'fields', elementField.handle ] %}
212+
{% set path = [ handle, 'fields', elementFieldHandle ] %}
207213
{% endif %}
208214

209215
{# Be smart about what we include to child field templates #}
210216
{% include template ignore missing with {
211-
name: elementField.name,
212-
handle: elementField.handle,
213-
instructionHandle: elementField.handle,
217+
name: elementField['name'] ?? elementField['label'] ?? '',
218+
attribute: elementField['attribute'] ?? null,
219+
handle: elementFieldHandle,
220+
instructionHandle: elementFieldHandle,
214221
isSubElementField: true,
215222
path: path,
216223

src/web/twig/variables/FeedMeVariable.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Craft;
66
use craft\elements\User as UserElement;
77
use craft\feedme\Plugin;
8+
use craft\fieldlayoutelements\assets\AltField;
89
use craft\fields\Checkboxes;
910
use craft\fields\Color;
1011
use craft\fields\Date;
@@ -16,6 +17,7 @@
1617
use craft\fields\PlainText;
1718
use craft\fields\RadioButtons;
1819
use craft\fields\Url;
20+
use craft\helpers\ArrayHelper;
1921
use craft\helpers\DateTimeHelper;
2022
use craft\helpers\Html;
2123
use craft\helpers\UrlHelper;
@@ -240,7 +242,7 @@ public function getElementLayoutByField($type, $field): ?array
240242
}
241243

242244
if (($fieldLayout = Craft::$app->getFields()->getLayoutById($source->fieldLayoutId)) !== null) {
243-
return $fieldLayout->getCustomFields();
245+
return ArrayHelper::merge($fieldLayout->getCustomFields(), $fieldLayout->getAvailableNativeFields());
244246
}
245247

246248
return null;
@@ -352,6 +354,7 @@ public function supportedSubField($class): bool
352354
RadioButtons::class,
353355
'craft\ckeditor\Field',
354356
'craft\redactor\Field',
357+
AltField::class,
355358
];
356359

357360
return in_array($class, $supportedSubFields, true);

0 commit comments

Comments
 (0)