Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

9.10. Drupal Fields API: Drupal դաշտերը տվյալների բազայում:

19/04/2025, by Ivan

Menu

mysql

Այս հոդվածում կփորձենք հասկանալ, թե ինչպես են աշխատում դաշտերը Drupal-ում, ինչի համար են դրանք նախատեսված և ինչպես են օգնում արագ կայքեր մշակել Drupal-ով:

Մենք արդեն աշխատել ենք դաշտերի հետ նախորդ հոդվածներում՝

7.5. Ծառայությունների բլոկի դրոշմում bootstrap սյունակներով

7.6. Isotope պատկերասրահ Drupal-ում

7.7. Բլոկ YouTube տեսանյութով Drupal-ում

Հիմա հասկանանք, թե ինչպես է դա աշխատում։ Գնանք Article տիպի կոնտենտի դաշտերի խմբագրում և ավելացնենք նոր Link տիպի դաշտ՝

/admin/structure/types/manage/article/fields

add field

Երբ ստեղծում եք նոր հոդված, կունենաք երկու դաշտ՝ հղումի URL և հղման տեքստ՝

link

Յուրաքանչյուր նոր դաշտ ստեղծելիս ադմինի միջոցով՝ տվյալների բազայում ստեղծվում են երկու աղյուսակ՝

{entity_type}__{field_name}
{entity_type}_revision__{field_name}

Drupal-ը աջակցում է վերափոխումներ (revisions), ուստի բոլոր տվյալները գոնե մեկ անգամ կրկնվում են, քանի որ միակ վերափոխումը ձեր հոդվածի ընթացիկ տարբերակն է։ Դաշտերը և ամբողջ Fields API-ն գոյություն ունեն՝ տվյալների բազայի հետ աշխատանքը հեշտացնելու համար։ Մենք պարզապես դաշտեր ենք ստեղծում ադմինից, իսկ Drupal-ը ինքն է ստեղծում համապատասխան աղյուսակները MySQL-ում։

MySQL-ի աղյուսակների անվանումից արդեն պարզ է դառնում, որ նույն դաշտը հնարավոր է օգտագործել նույն տեսակի մեկենաների (entity type) մեջ։ Օրինակ՝ մենք կարող ենք Link դաշտը օգտագործել նաև Basic Page տիպի մեջ՝ որպես արդեն գոյություն ունեցող դաշտ՝

/admin/structure/types/manage/page/fields/add-field

add field

Բայց եթե ուզում եք ստեղծել Link դաշտ բլոկի համար, ապա անհրաժեշտ է ստեղծել նոր դաշտ։ Տարբեր Entity տեսակների միջև նույն դաշտը հնարավոր չէ վերօգտագործել։ Ստեղծենք Link դաշտ Basic Block տիպի համար՝

/admin/structure/block/block-content/manage/basic/fields/add-field

Ինչպես տեսնում եք դաշտ ստեղծելիս՝ գոյություն ունեցող դաշտերի ցանկում Link դաշտ չկա, որովհետև Block և Node-ը տարբեր Entity տեսակներ են։

Եվ ինչպես nodes-ի դեպքում, այստեղ էլ կստեղծվեն երկու աղյուսակ՝ Link դաշտի տվյալների պահպանման համար բլոկների մեջ՝

tables and views

block_content_revision__field_link և block_content__field_link։

Հիմա հասկանանք՝ ինչպես է Drupal-ը պահպանում նույն դաշտի տվյալները տարբեր բանդլների համար։ Մենք ստեղծեցինք Link դաշտ Article նոդի համար, բայց հետո այն օգտագործեցինք նաև Basic Page նոդի համար։ Ավելի հարմար է կայքի կոնֆիգուրացիան արտահանենք թղթապանակի մեջ և նայենք ֆայլերը, բայց կարելի է նաև որոնել config աղյուսակում՝ phpMyAdmin-ի կամ Adminer-ի միջոցով՝

select config

Եթե փնտրեք բոլոր կոնֆիգուրացիաները, որոնք պարունակում են «link» բառը՝

SELECT * FROM `config` WHERE CONVERT(`name` USING utf8mb4) LIKE '%link%' LIMIT 50

Կգտնենք հետևյալ կոնֆիգուրացիաները՝

field.field.block.block_content.basic.field_link
field.field.node.article.field_link
field.field.node.page.field_link
field.storage.block_content.field_link
field.storage.node.field_link

Յուրաքանչյուր Entity տեսակի համար դաշտի Field Storage կոնֆիգ է ստեղծվում։ Այս կոնֆիգը պարունակում է այն տվյալները, որոնք անհրաժեշտ են MySQL աղյուսակներում այդ դաշտի տվյալների պահպանման համար։ Մեր դեպքում՝ block_content_field_link, block_content_revision_field_link, node__field_link, node_revision__field_link։

Այժմ ուսումնասիրենք՝ ինչպես է Link մոդուլը պահում տվյալները։ Բացենք դաշտի Field Storage կոնֆիգը՝

uuid: dba847ef-f4d6-4462-a2ee-f642a007fca6
langcode: en
status: true
dependencies:
  module:
    - block_content
    - link
id: block_content.field_link
field_name: field_link
entity_type: block_content
type: link
settings: {  }
module: link
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

Եկեք դիտարկենք այս տողերը՝ հասկանալու համար, թե ինչ է պահվում Field Storage կոնֆիգում։

uuid — Յուրահատուկ ID տվյալ կոնֆիգի համար։
langcode — Լեզվի կոդ, որը նաև օգտագործվում է բազմալեզու բովանդակության համար։
status — Ցույց է տալիս՝ արդյոք դաշտը ակտիվ է։
dependencies — Կախվածություն համապատասխան մոդուլներից։
id — Կոնֆիգի machine name։
field_name — Դաշտի անվանում, որը օգտագործվում է կոդում։
entity_type — Ինչ Entity տեսակի վրա է կիրառվում դաշտը։
type — Դաշտի տիպը՝ մեր դեպքում՝ link։
settings — Դաշտի կարգավորումներ։
module — Որ մոդուլն է սահմանում այս դաշտի տիպը։
locked — Արգելափակված է արդյոք դաշտը փոփոխումից։
cardinality — Քանի արժեք կարելի է մուտքագրել մեկ Entity-ի համար։
translatable — Թարգմանելի է արդյոք դաշտը։
indexes — Ինդեքսներ՝ որոնման օպտիմալացման համար։
persist_with_no_fields — Պահպանե՞լ արդյոք Field Storage-ը, եթե դաշտը հեռացվել է բոլոր Bundle-ներից։
custom_storage — Եթե true է, նշանակում է տվյալների պահման համար օգտագործվում է հատուկ աղյուսակ։

Բացենք նաև Link դաշտի տիպը սահմանող PHP դասը՝

core/modules/link/src/Plugin/Field/FieldType/LinkItem.php

Այս դասում՝ propertyDefinitions() մեթոդով սահմանվում են՝

public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
  $properties['uri'] = DataDefinition::create('uri')->setLabel(t('URI'));
  $properties['title'] = DataDefinition::create('string')->setLabel(t('Link text'));
  $properties['options'] = MapDataDefinition::create()->setLabel(t('Options'));
  return $properties;
}

Սրանք են դաշտի բաղադրիչները՝ URI, վերնագիր և պարամետրեր։ Տեսեք node__field_link աղյուսակում դրանք առկա են։

Այժմ հասել ենք Fields API թեմային Drupal-ում։ Դաշտերի տեսակները սահմանվում են PHP դասերի միջոցով, որոնք օգտագործվում են տվյալների մուտքագրման ձևերը ստեղծելու, պահելու և արտածելու համար։

Երբ Article և Basic Page բովանդակության տեսակների համար մենք ստեղծեցինք դաշտեր՝ մենք օգտագործեցինք մեկ Field Storage, բայց առանձին Field Instance յուրաքանչյուր բանդլի համար։ Այս կոնֆիգուրացիաները պահվում են տարբեր YAML ֆայլերում՝

field.field.node.article.field_link.yml
field.field.node.page.field_link.yml
field.field.block.block_content.basic.field_link.yml

Այս ֆայլերում պահվում են դաշտի մուտքագրման ձևերի կարգավորումները։

link

Այդպես մենք կարող ենք յուրաքանչյուր բանդլի համար կարգավորել դաշտի մուտքագրման ձևը։

Drupal 8-ում Field Instance հասկացությունը փոխարինվել է CRUD API-ով։
https://www.drupal.org/node/2054619

Օրինակներ դաշտերի հետ աշխատելու մասին՝
https://www.drupal.org/node/2012896

Մենք այստեղ դիտարկեցինք միայն այն հատվածը, որը վերաբերում է տվյալների պահմանը։ Հաջորդ դասերում կքննարկենք դաշտերի տվյալների մուտքագրումն ու արտածումը, ինչպես նաև կստեղծենք մեր սեփական դաշտի տիպ։