Օգտագործողի կոնտենտի ստեղծում
Դիտարանութիւն
Այս փաստաթուղթը նախատեսված է առաջին հերթին օբյեկտային PHP ծրագրավորման փորձ ունեցող ծրագրավորողների, Drupal 6 կամ Drupal 7-ի փորձ ունեցող և նրանց համար, ովքեր ցանկանում են ուսումնասիրել Drupal 8-ի սկզբունքները:
Drupal 8-ում Content Entity տիպի ստեղծման փաստաթուղթը պարունակում է հասանելի բոլոր ընտրանքների ամբողջական ցանկը։
Content Entity տիպի ստեղծում առանց բունդլի Drupal 8-ում
Այս դեպքում մենք ստեղծում ենք Drupal 8-ի content entity, որը չունի որևէ բունդլ։
Entity-ն չի կիրառում Field API-ն, այդ պատճառով էլ մնում է կոդում։ Սակայն դա կարող է օգտակար շրջանակ լինել Content Entities կառուցելու համար, քանի որ մենք ավելի բարդ տվյալներ ենք ներմուծելու հետագայում։
Վերջապես, քանի որ այստեղ կան որոշ OOP կոնցեպցիաներ, ես կհղվեմ համապատասխան փաստաթղթերին։
Հիմնաբառեր
Մեր մոդուլի անունը՝ advertiser։
Մեր content entity-ի տիպը նույնպես advertiser է։
Մեր նոր Drupal 8-ի advertiser content entity-ն կունենա հետևյալ դաշտերը՝
- UUID
- ID
Content Entity-ի սահմանումը Drupal 8-ում
Նախ, բոլոր կաշառած օբյեկտները այժմ գտնվում են modules/custom պանակում, այլ ոչ թե sites/all/modules/custom-ում։
Մեր մոդուլի ֆայլերի կառուցվածքը վերջնական փուլում կդառնա հետևյալը՝
modules/custom/advertiser$ ├── advertiser.info.yml └── src └── Entity └── Advertiser.php
Հղման համար կարող եք դիտել առկա Advertiser entity-ն՝ հավելյալ հնարավորություններով, ինչպիսիք են թեստերն ու սահմանափակման plugins-ը, սակայն մինչ այժմ ամեն ինչ կլինի պարզ։
Info ֆայլ
Սկսում ենք մեր մոդուլի սահմանմամբ module_name.info.yml ֆայլում, որը ինքնին հասկանալի է․
name: Advertiser type: module description: 'Barebones advertiser entity' package: custom core: 8.x
Entity-ի սկելետ
Advertiser entity-ի բազային դասը և առնչվող սքիման սահմանված են src/Entity/Advertiser.php ֆայլում։
Առաջին քայլը namespace-ի սահմանումն է մեր Advertiser Entity դասի համար, ինչը կօգնի, երբ կօգտագործենք մեր դասերը․
namespace Drupal\advertiser\Entity;
Այժմ ժամանակն է սահմանել մեր entity-ն՝ օգտագործելով անոտացիա։
Սա իրականում սահմանում է օբյեկտի տիպը, որին կարդում և պահպանում է cache-ում, այդ պատճառով փոփոխությունների դեպքում անհրաժեշտ է մաքրել cache-ը։
Քանի որ սա պարզ entity է, մենք օգտագործում ենք միայն մի քանի հատկություններ, ոչ թե handler-ներ, ինչպես օրինակ Access մոդուլը։
Մենք ունենք ֆունկցիոնալ մոդուլ, որը սահմանում է մեր user-defined content entity-ն, բայց կտեսնենք, որ advertiser աղյուսակը չի ստեղծվել տվյալների շտեմարանում։
$ drush sql-cli mysql> SHOW TABLES;
Սա տեղի է ունենում, քանի որ մեր դասում չկա մեթոդ, որը կգործի տվյալների շտեմարանի հետ։ Մենք պետք է նկարագրենք նվազագույն անհրաժեշտ մեթոդները, որոնք թույլ կտան entity-ին հարմար աշխատել տվյալների շտեմարանի հետ։
ContentEntityBase
Ընդհանուր առմամբ, մենք կարող ենք ավելացնել այս դասերը՝ ավելացնելով հետևյալը՝ use Drupal\Core\Entity\ContentEntityBase; մեր namespace-ի հայտարարությունից հետո՝ մեր սցրիպտի վերին մասում։ Սա դարձնում է այդ մեթոդները հասանելի մեր դասի համար, որը կարող է ընդլայնել կամ իրականացնել դրանք։
Մենք անում ենք երկու բան՝ ընդլայնում ենք արդեն գոյություն ունեցող ContentEntityBase դասը, որը արդեն ունի անհրաժեշտ մեթոդներ տվյալների շտեմարանի հետ փոխգործակցելու համար, և իրականացնում ենք ContentEntityInterface-ը՝ նկարագրելու համար ...
մեթոդներ, որոնք անհրաժեշտ են տվյալների շտեմարան մուտք գործելու համար։ Սա չի նկարագրում, թե ինչպես է դա իրականացվում։ Դասը, որն իրականացնում է (implements) ինտերֆեյսը, կարող է դա անել տարբեր եղանակներով։ Մենք կարող ենք իրականացնել այդ ինտերֆեյսը այնքան անգամ, որքան հարկ է, տարբեր մոտեցումներով։ Հետո կարող ենք փոխել իրականացման տեսակները առանց մեր կոդին վնաս պատճառելու, որովհետև ինտերֆեյսը սահմանում է, թե ինչպես ենք օգտագործելու այն, անկախ նրանից, թե ինչպես է այն իրականում աշխատում։ - https://secure.php.net/manual/en/language.oop5.interfaces.php
Այս ամենի արդյունքում մենք ստանում ենք հետևյալը։ Խորհուրդ է տրվում չմոռանալ ավելացնել ցանկացած նոր դաս՝ օգտագործելով use վերին մասում:
class Advertiser extends ContentEntityBase implements ContentEntityInterface {
Բայց մեզ դեռ պետք է օգտագործել այս նոր մեթոդները՝ տվյալներ բազայում տեղադրելու համար։ Սկսում ենք entity-ի հիմնական դաշտերից։
baseFieldDefinitions
baseFieldDefinitions մեթոդը պատկանում է ContentEntityBase դասին, որը մենք ընդլայնում ենք։
Այն պահանջում է մեկ պարամետր՝
Օբյեկտի տիպի սահմանումը։ Սա օգտակար է, երբ մեկ դասը օգտագործվում է մի քանի, հնարավոր է դինամիկ, օբյեկտների տիպերի համար։
Եվ այն վերադարձնում է՝
Օբյեկտի տիպի համար բազային դաշտերի սահմանումների զանգված՝ դաշտի անունով։
Այդպիսով, մենք իրականացնում ենք այն հետևյալ կերպ.
setLabel(t('ID')) ->setDescription(t('The ID of the Advertiser entity.')) ->setReadOnly(TRUE); // Հիմնական դաշտ, եզակի այս նախագծի սահմաններից դուրս։ $fields['uuid'] = BaseFieldDefinition::create('uuid') ->setLabel(t('UUID')) ->setDescription(t('The UUID of the Advertiser entity.')) ->setReadOnly(TRUE); return $fields; } ?>
արժե նշել, որ՝
«Համապատասխանում է օբյեկտի տիպի բազային դաշտերի սահմանմանը»։
- Սա բաց ստատիկ մեթոդ է FieldableEntityInterface-ում։
«Դաս entity-ի դաշտերի սահմանման համար»։
- Հիմնականում այն տրամադրում է դաշտերի ստեղծման, սահմանափակումների ավելացման և այլ մեթոդներ։
Լրիվ entity
Այսպիսով, ընդհանուր առմամբ մենք ունենք հետևյալը․
setLabel(t('ID')) ->setDescription(t('The ID of the Advertiser entity.')) ->setReadOnly(TRUE); // Հիմնական դաշտ, եզակի այս նախագծի սահմաններից դուրս։ $fields['uuid'] = BaseFieldDefinition::create('uuid') ->setLabel(t('UUID')) ->setDescription(t('The UUID of the Advertiser entity.')) ->setReadOnly(TRUE); return $fields; } } ?>
Մոդուլը տեղադրելուց հետո դուք պետք է տեսնեք, որ advertiser աղյուսակը ստեղծվել է տվյալների շտեմարանում։
$ drush sql-cli mysql> SHOW TABLES;
կամ
drush sqlq "show tables like 'advertiser'" drush sqlq "describe advertiser"
Եթե ձեր մոդուլը արդեն տեղադրված է, դուք պետք է կատարեք entity-ների թարմացում։
Դիտեք #2976035 CRUD գործողությունները պետք է օգտագործեն վերջին տեղադրված entity տիպը և field storage սահմանումները։ Այս փոփոխությունն այլևս հեռակա ռեժիմով չի կարող կատարվել, լրացուցիչ տեղեկությունների համար տես փոփոխությունների նոտաներ։
Խորհուրդ է տրվում օգտագործել Devel Entity Updates մոդուլը։
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.