9.9.1. Drupal-ում կոնֆիգուրացիայի կառավարում։ Ներմուծել բովանդակություն և կոնֆիգուրացիա։
Երբ դուք ներմուծում եք կոնֆիգուրացիան մեկ կայքից մյուսը, որոշ կոնֆիգուրացիաներ անհրաժեշտ են բովանդակության արտածման համար, բայց կոնֆիգուրացիայի մեջ բուն բովանդակություն չկա։ Այս դասում մենք կբացատրենք, թե ինչպես տեղափոխել բլոկներ, հանգույցներ (nodes) և դասակարգման տերմիններ (taxonomy terms) մեկ կայքից մյուսը։
Եկեք ստեղծենք բլոկ մեկ կայքում և տեղափոխենք դրա կոնֆիգուրացիան մյուս կայք՝ ինչպես տեղափոխել կոնֆիգուրացիաներ, կարող եք տեսնել նախորդ հոդվածում՝ 9.9. Կոնֆիգուրացիաների հետ աշխատանքը Drupal-ում. Active, Sync կոնֆիգուրացիա, կոնֆիգերի փոխանցում DEV-ից LIVE
Դուք կտեսնեք հետևյալ սխալը՝ "This block is broken or missing. You may be missing content or you might need to enable the original module.":
Բլոկին անհրաժեշտ է block բովանդակության էություն (entity)՝ կոնկրետ UUID-ով։ UUID-ը էության (entity) եզակի նույնացուցիչն է։ Նույն բլոկը նույնիսկ նույն բովանդակությամբ ստեղծելով՝ նոր UUID կստեղծվի, և կոնֆիգուրացիան չի ճանաչի այն։ Կարող եք տեսնել անհրաժեշտ UUID-ը բլոկի կոնֆիգուրացիայի մեջ՝
Մի շփոթեք բլոկի UUID-ը և կոնֆիգի UUID-ը։ Բանն այն է, որ կոնֆիգերը ևս էություններ են Drupal-ում, բայց ի տարբերություն բովանդակության էությունների (բլոկներ, հանգույցներ), կոնֆիգերը կոնֆիգուրացիոն էություններ են։ Հետագայում կծանոթանանք ContentEntity և ConfigEntity դասերի հետ։
Հիմա երբ գիտենք անհրաժեշտ UUID-ը, մենք պետք է ստեղծենք այդ բլոկը ծրագրային եղանակով՝ hook_update_n() ֆունկցիայի միջոցով՝
https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Extension!hook_update_N
hook_update_n()-ը պետք է ավելացվի մոդուլի .install ֆայլում։ Այն կգործի update.php կամ drush-ի միջոցով բազայի թարմացման ժամանակ։ Ամեն նոր hook_update_n() պետք է ունենա եզակի թիվ՝ սովորաբար 8000 և բարձր Drupal 8.x-ի համար։
/modules/custom/drupalbook/drupalbook.install
/**
* Հավելում ենք պարզ տեքստային բլոկ նկարով։
*/
function drupalbook_update_8001(&$sandbox) {
$uuid = 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142';
$block = \Drupal::entityTypeManager()->loadEntityByUuid('block_content', $uuid);
if (empty($block)) {
$block = \Drupal\block_content\Entity\BlockContent::create([
'info' => 'Պարզ բլոկ տեքստով և նկարով',
'type' => 'basic',
'uuid' => $uuid
]);
$block->body->value = 'Բարև աշխարհ!';
$block->save();
}
}
Այժմ այս կոդը պետք է տեղափոխել երկրորդ կայք և բացել update.php՝
Drupal-ը կգտնի թարմացումը և կստեղծի բլոկը։
Նկատեք, որ բլոկը ստեղծելուց առաջ ստուգվում է՝ արդյոք այն արդեն գոյություն ունի։ Սա անհրաժեշտ է, որպեսզի առաջին կայքում կրկնօրինակ UUID-ով բլոկ չստեղծվի։
Նշենք նաև, որ միայն տեքստն է փոխանցվում, նկարները՝ CKEditor-ի միջոցով ներբեռնված, չեն փոխանցվում, և դրանք պետք է առանձին տեղափոխել։ Կարող եք օգտագործել drush, ssh, ftp կամ տեղադրել git-ում (եթե ֆայլերը քիչ են)։ Տեղակայման (deployment) գործընթացը տարբեր նախագծերում կարող է տարբեր լինել։
Նույնը վերաբերում է դասակարգման տերմինների ստեղծմանը։ Կոնֆիգերով փոխանցվում են միայն բառարանի կարգավորումները։ Տերմինները պետք է ստեղծվեն առանձին, օրինակ՝
\Drupal\taxonomy\Entity\Term;
/**
* Ծրագրային եղանակով taxonomy term ստեղծում։
*/
function drupalbook_update_8002(&$sandbox) {
$term = Term::create([
'name' => 'Drupal 8',
'vid' => 'tags',
])->save();
}
vid դաշտում նշվում է բառարանի մեքենայական անունը։
Հանգույց ստեղծելու համար կարող եք օգտվել հետևյալ կոդից՝
/**
* Ծրագրային եղանակով node ստեղծում։
*/
function drupalbook_update_8003(&$sandbox) {
$node = \Drupal\node\Entity\Node::create(['type' => 'page']);
$node->set('title', 'Մեր մասին');
$body = [
'value' => 'Տեքստ մեր մասին',
'format' => 'basic_html',
];
$node->set('body', $body);
$node->status = 1;
$node->enforceIsNew();
$node->save();
}
Կարելի է նաև գրել այսպես՝
$node->body->format = 'basic_html';
$node->body->value = 'Տեքստ մեր մասին';
Ամեն անգամ նոր hook_update_n() ավելացնելիս անհրաժեշտ է գործարկել update.php։ Եթե դուք օգտագործում եք Acquia կամ այլ հոսթինգ ավտոմատ տեղակայմամբ, ապա դա տեղի կունենա ինքնաբար։
Կոդի օրինակները կարող եք տեսնել GitHub-ում՝
https://github.com/levmyshkin/drupalbook8