9.11. Drupal Entity API: Ստեղծեք ձեր սեփական Entity տեսակը: Ստեղծեք Entity տեսակ՝ օգտագործելով Drupal Console-ը:
Մենք արդեն ուսումնասիրել ենք Form API-ն, Fields API-ն և գիտենք, թե ինչպես է տվյալները Drupal-ում պահվում տվյալների բազայում։ Այժմ անդրադառնանք բոլոր Drupal կայքերի հիմքին՝ Entity API-ին։
Դուք երևի նկատել եք, որ դաշտերը ինքնուրույն գոյություն չունեն, այլ «կցված» են էություններ՝ նոդեր, բլոկներ, տաքսոնոմիայի տերմիններ, տեսքներ և այլն։ Կարող եք ստեղծել փաթեթային էություններ, օրինակ՝ նյութերի տեսակներ, բլոկի տեսակներ, տաքսոնոմիայի բառարաններ։ Բայց ի՞նչ անել, եթե անհրաժեշտ է ստեղծել նոր էություն սեփական փաթեթներով։ Այս դեպքում անհրաժեշտ կլինի օգտագործել Entity API՝ նոր էություն ստեղծելու համար։
Ես ամբողջ կոդը ավելացրել եմ GitHub-ում՝ drupalbook_product մոդուլի մեջ, կարող եք ներբեռնել մոդուլը և ավելացնել ձեր կայքում․
https://github.com/levmyshkin/drupalbook8
Ամենապարզ ճանապարհը նոր էության տեսակ ստեղծելու՝ դա օգտագործելն է Drupal Console-ը, քանի որ անհրաժեշտ է կատարել ընդամենը մեկ հրաման։
Հաճախ չէ անհրաժեշտ նոր էության տեսակ ստեղծել։ Շատ փոքր և միջին նախագծերում հիմք են ընդունում contrib մոդուլները, օրինակ՝ Commerce-ը՝ օնլայն խանութների համար։
https://www.drupal.org/project/commerce
Եթե պատրաստվում եք ստեղծել ձեր սեփական մոդուլը, հնարավոր է՝ ձեզ անհրաժեշտ լինի նոր էության տեսակ, սակայն հնարավոր է նաև Drupal-ի մեջ գտնեք արդեն պատրաստի մոդուլ՝ համապատասխան ֆունկցիոնալությամբ, և այն ընդլայնեք։
Այս հոդվածում մենք կուսումնասիրենք Entity API-ն և կստեղծենք մեր սեփական Product էության տեսակ, որը կարող է ծառայել որպես փոքր կատալոգ կամ խանութի հիմք։ Եթե որոշեք ստեղծել սեփական խանութ, խիստ խորհուրդ եմ տալիս օգտագործել Commerce մոդուլը՝ ժամանակ և ռեսուրս խնայելու համար։
Երբ ցանկանում եք ստեղծել նոր էության տեսակ, հարց է առաջանում՝ ինչու չստեղծել պարզապես Product տիպի նոր նոդ և օգտագործել այն կատալոգի համար։ Այո, սա կարելի է անել փոքր կատալոգների համար՝ օգտագործելով Views և պարզ ֆիլտրեր գնի, մնացորդի և այլնի համար։ Բայց երբ ապրանքների քանակը դառնում է հազարավոր, մենեջերը դժվարությամբ կգտնի անհրաժեշտ ապրանքը բովանդակության էջում։ Նա կցանկանա ֆիլտրել ըստ անվան, կատեգորիայի, գույնի և այլ հատկությունների՝ մեկ էջում՝
/admin/content
Սա կդառնա խառնաշփոթ և կխանգարի այլ բովանդակության տեսակների՝ Լուրերի, Հոդվածների, Իրադարձությունների և Էջերի կառավարմանը։ Այդ պատճառով նման դեպքերում ստեղծում են առանձին Product էության տեսակ՝ սեփական ադմին պանելով։
Եկեք սկսենք Product էության առանձին տեսակ ստեղծել։ Նախքան հրամանի կատարումը, խորհուրդ է տրվում պահուստային պատճեն անել կայքից, գոնե տվյալների բազայի։ Քանի որ էության տեսակ ստեղծելու գործընթացում ստեղծվում են կոնֆիգներ, որոնք գրվում են տվյալների բազայում, և եթե ինչ-որ բան սխալ գնա ու կոնֆիգները գրվեն առանց համապատասխան ֆայլերի, դա կարող է կոտրել կայքը։ Նախ պահուստավորեք։
Այժմ ստեղծում ենք նոր մոդուլ, ինչը կարելի է անել նաև Drupal Console-ով․
drupal generate:module
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-module.html
$ vendor/bin/drupal generate:module
// Բարի գալուստ Drupal մոդուլի գեներատոր
Մուտքագրեք նոր մոդուլի անունը.
> Drupalbook Product
Մոդուլի մեքենայական անունը [drupalbook_product]:
>
Մոդուլի ուղին [modules/custom]:
>
Մոդուլի նկարագրությունը [My Awesome Module]:
> Products catalog
Փաթեթի անունը [Custom]:
>
Drupal-ի Core տարբերակը [8.x]:
>
Ցանկանու՞մ եք .module ֆայլ ստեղծել (yes/no) [yes]:
> no
Նշել մոդուլը որպես ֆիչա (feature) (yes/no) [no]:
> no
Ավելացնե՞լ composer.json ֆայլ (yes/no) [yes]:
> no
Ավելացնե՞լ մոդուլի կախվածություններ (yes/no) [no]:
> no
Ստեղծե՞լ unit test class (yes/no) [yes]:
> no
Ստեղծե՞լ թեմայացվող կաղապար (yes/no) [yes]:
> no
Շարունակե՞լ գործողությունը (yes/no) [yes]:
> yes
Ստեղծված կամ թարմացված ֆայլեր
Ստեղծման ուղի՝ /home/laptop/projects/drupalbook
1 - /modules/custom/drupalbook_product/drupalbook_product.info.yml
Ստեղծված տողերի քանակը՝ "5"
Կամ ուղղակի ստեղծեք մոդուլ՝ drupalbook_product.info.yml ֆայլով․
name: 'drupalbook_product'
type: module
description: 'Products catalog'
core: 8.x
package: 'Drupalbook'
Այժմ կարող ենք գեներացնել Product էության տեսակ։
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-entity-content.html
$ drupal generate:entity:content
$ vendor/bin/drupal generate:entity:content
// Բարի գալուստ Drupal-ի պարունակության էության գեներատոր
Մուտքագրեք մոդուլի անունը [admin_toolbar]:
> drupalbook_product
Մուտքագրեք նոր պարունակության էության PHP դասի անունը [DefaultEntity]:
> DrupalbookProductEntity
Նշեք նոր պարունակության էության մեքենայական անունը [drupalbook_product_entity]:
>
Նշեք նոր պարունակության էության պիտակը [Drupalbook product entity]:
> Product
Նշեք base-path-ը պարունակության էության ուղղորդումների համար [/admin/structure]:
>
Ցանկանու՞մ եք, որ այս էությունն ունենա փաթեթներ (bundles)? (yes/no) [no]:
> yes
Ձեր էությունն թարգմանելի՞ է: (yes/no) [yes]:
> yes
Ձեր էությունն վերանայելի՞ է (revisionable): (yes/no) [yes]:
> no
// generate:entity:config
Նշեք base-path-ը կարգավորման էության ուղիների համար [/admin/structure]:
>
Ստեղծված կամ թարմացված ֆայլեր
Ստեղծման ուղի՝ /home/laptop/projects/drupalbook
1 - modules/custom/drupalbook_product/drupalbook_product.permissions.yml
2 - modules/custom/drupalbook_product/drupalbook_product.links.menu.yml
3 - modules/custom/drupalbook_product/drupalbook_product.links.task.yml
4 - modules/custom/drupalbook_product/drupalbook_product.links.action.yml
5 - modules/custom/drupalbook_product/src/DrupalbookProductEntityAccessControlHandler.php
6 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTranslationHandler.php
7 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityInterface.php
8 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntity.php
9 - modules/custom/drupalbook_product/src/DrupalbookProductEntityHtmlRouteProvider.php
10 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityViewsData.php
11 - modules/custom/drupalbook_product/src/DrupalbookProductEntityListBuilder.php
12 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntitySettingsForm.php
13 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityForm.php
14 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityDeleteForm.php
15 - modules/custom/drupalbook_product/drupalbook_product_entity.page.inc
16 - modules/custom/drupalbook_product/templates/drupalbook_product_entity.html.twig
17 - modules/custom/drupalbook_product/templates/drupalbook-product-entity-content-add-list.html.twig
18 - modules/custom/drupalbook_product/drupalbook_product.module
19 - modules/custom/drupalbook_product/config/schema/drupalbook_product_entity_type.schema.yml
20 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityTypeInterface.php
21 - modules/custom/drupalbook_product/src/Entity/DrupalbookProductEntityType.php
22 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTypeHtmlRouteProvider.php
23 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityTypeForm.php
24 - modules/custom/drupalbook_product/src/Form/DrupalbookProductEntityTypeDeleteForm.php
25 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTypeListBuilder.php
Ստեղծված տողեր՝ "1060"
Այժմ, երբ մոդուլը գեներացված է, կարող եք այն ակտիվացնել, որպեսզի կայքում երևա նոր էության տեսակը․
Entity-ի ստեղծման ժամանակ Drupal Console-ը հարցնում է, թե ինչ տեսակի պետք է լինի էությունը։
Մուտքագրեք նոր պարունակության էության դասը [DefaultEntity]:
Մեր էության PHP դասի անունը, խորհուրդ է տրվում անունի վերջում ավելացնել Entity։
Մուտքագրեք նոր պարունակության էության մեքենայական անունը [drupalbook_product_entity]:
Մեքենայական անունը առաջարկվում է դասի անվան հիման վրա, եթե սեղմեք Enter, կօգտագործվի առաջարկված անունը։
Մուտքագրեք base-path-ը էության ուղիների համար [/admin/structure]:
Ձեր էության տեսակն կունենա իր սեփական էջը CRUD գործողությունների համար․
Ապրանքի էջի տեսքը սկզբնականում շատ պարզ է, բայց կարելի է այն բարելավել ապագայում կամ ստեղծել Views-ով․
Նոր էություն ստեղծելու համար անհրաժեշտ է նախ ստեղծել այս էության փաթեթ՝ bundle։ Մենք ընտրել էինք փաթեթով էություն․
Ցանկանու՞մ եք, որ էությունն ունենա փաթեթներ (yes/no):
Հետևաբար, ստեղծում ենք նոր ապրանքի տեսակ։ Սա անհրաժեշտ է՝ տարբեր դաշտեր ավելացնելու համար՝ քաշ, չափս, գույն և այլն։ Օրինակ՝ մոնիտորները կունենան անկյունագիծ, իսկ կոշիկները՝ չափս։
Եկեք ստեղծենք նոր ապրանքի տեսակ՝ Հագուստ․
Այժմ կարող եք հարմարեցնել դաշտերը ձեր ապրանքի տեսակի համար․
Առնվազն անհրաժեշտ է գնի դաշտը։
Եկեք ստեղծենք մի քանի ապրանք և նայենք տվյալների բազան։ Մենք ունենք drupalbook_product_entity աղյուսակը, որտեղ պահվում են մեր ապրանքների UUID-ները․
Կա նաև drupalbook_product_entity_field_data աղյուսակը, որտեղ պահվում են Properties։ Սրանք հատուկ դաշտեր են էության, որոնք պահվում են ուղղակի աղյուսակներում, քանի որ դրանք չեն փոփոխվում վերանայումից կախված։ Օրինակ՝ Name դաշտը՝ դա էության պիտակն է (node-ի դեպքում՝ Title)։
Եթե ավելացնենք դաշտեր, ապա յուրաքանչյուր դաշտի համար կստեղծվեն երկու աղյուսակ, քանի որ մենք ընտրել էինք վերանայումների աջակցություն՝
Ձեր էությունը վերանայելի՞ է (yes/no) [yes]
Հիմա արդեն կարծում եմ՝ հասկանում եք, թե ինչպես կարելի է ստեղծել նոր էության տեսակներ։ Հաջորդ հոդվածներում մենք կշարունակենք ընդլայնել մեր հարմարեցված կատալոգի/խանութի հնարավորությունները։
Ես ամբողջ կոդը ավելացրել եմ GitHub-ում՝ drupalbook_product մոդուլի մեջ, կարող եք ներբեռնել մոդուլը և ավելացնել ձեր կայքում․