9.10. Drupal Fields API: Drupal դաշտերը տվյալների բազայում:
Այս հոդվածում կփորձենք հասկանալ, թե ինչպես են աշխատում դաշտերը Drupal-ում, ինչի համար են դրանք նախատեսված և ինչպես են օգնում արագ կայքեր մշակել Drupal-ով:
Մենք արդեն աշխատել ենք դաշտերի հետ նախորդ հոդվածներում՝
7.5. Ծառայությունների բլոկի դրոշմում bootstrap սյունակներով
7.6. Isotope պատկերասրահ Drupal-ում
7.7. Բլոկ YouTube տեսանյութով Drupal-ում
Հիմա հասկանանք, թե ինչպես է դա աշխատում։ Գնանք Article տիպի կոնտենտի դաշտերի խմբագրում և ավելացնենք նոր Link տիպի դաշտ՝
/admin/structure/types/manage/article/fields
Երբ ստեղծում եք նոր հոդված, կունենաք երկու դաշտ՝ հղումի URL և հղման տեքստ՝
Յուրաքանչյուր նոր դաշտ ստեղծելիս ադմինի միջոցով՝ տվյալների բազայում ստեղծվում են երկու աղյուսակ՝
{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
Բայց եթե ուզում եք ստեղծել Link դաշտ բլոկի համար, ապա անհրաժեշտ է ստեղծել նոր դաշտ։ Տարբեր Entity տեսակների միջև նույն դաշտը հնարավոր չէ վերօգտագործել։ Ստեղծենք Link դաշտ Basic Block տիպի համար՝
/admin/structure/block/block-content/manage/basic/fields/add-field
Ինչպես տեսնում եք դաշտ ստեղծելիս՝ գոյություն ունեցող դաշտերի ցանկում Link դաշտ չկա, որովհետև Block և Node-ը տարբեր Entity տեսակներ են։
Եվ ինչպես nodes-ի դեպքում, այստեղ էլ կստեղծվեն երկու աղյուսակ՝ Link դաշտի տվյալների պահպանման համար բլոկների մեջ՝
block_content_revision__field_link և block_content__field_link։
Հիմա հասկանանք՝ ինչպես է Drupal-ը պահպանում նույն դաշտի տվյալները տարբեր բանդլների համար։ Մենք ստեղծեցինք Link դաշտ Article նոդի համար, բայց հետո այն օգտագործեցինք նաև Basic Page նոդի համար։ Ավելի հարմար է կայքի կոնֆիգուրացիան արտահանենք թղթապանակի մեջ և նայենք ֆայլերը, բայց կարելի է նաև որոնել config աղյուսակում՝ phpMyAdmin-ի կամ Adminer-ի միջոցով՝
Եթե փնտրեք բոլոր կոնֆիգուրացիաները, որոնք պարունակում են «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
Այս ֆայլերում պահվում են դաշտի մուտքագրման ձևերի կարգավորումները։
Այդպես մենք կարող ենք յուրաքանչյուր բանդլի համար կարգավորել դաշտի մուտքագրման ձևը։
Drupal 8-ում Field Instance հասկացությունը փոխարինվել է CRUD API-ով։
https://www.drupal.org/node/2054619
Օրինակներ դաշտերի հետ աշխատելու մասին՝
https://www.drupal.org/node/2012896
Մենք այստեղ դիտարկեցինք միայն այն հատվածը, որը վերաբերում է տվյալների պահմանը։ Հաջորդ դասերում կքննարկենք դաշտերի տվյալների մուտքագրումն ու արտածումը, ինչպես նաև կստեղծենք մեր սեփական դաշտի տիպ։