Բլոկ API
Զեկույց
Drupal 8-ում բլոկները իրականում բաղկացած են երկու առանձին API կառուցվածքից՝ ստեղծելու օգտատերերի միջերես, որը նման է Drupal-ի նախորդ տարբերակներում օգտագործվողին: Այս երկու API-ն են՝ Block Plugin API, որը ինքնուրույն API է բազմակի օգտագործման համար, և Block Entity API, որը հատուկ է Drupal 8-ի համար բլոկների տեղադրման և տեսանելիության վերահսկման:
Block Plugin API-ով բլոկների ստեղծում
Մոդուլի մեջ ձեր կողմից սահմանված բլոկներ ստեղծելու համար անհրաժեշտ է ուսումնասիրել և հասկանալ պլագինների API-ն և մասնավորապես անոթացիաների վրա հիմնված պլագինների հայտնաբերում մեխանիզմը, որը Drupal 8-ն օգտագործում է ձեր բլոկը սահմանող կոդը հայտնաբերելու համար:
Օգտագործողի կողմից սահմանված բլոկ ստեղծելու քայլերն են՝
- Ստեղծել բլոկային պլագին անոթացիաների միջոցով
- Ընդլայնել Drupal\Core\Block\BlockBase դասը
- Կիրառել Drupal\Core\Block\BlockPluginInterface ինտերֆեյսի մեթոդները՝ ըստ ձեր օգտագործման հատուկ դեպքի
Ավելի՜ն դարձնել բլոկը տեսանելի Drupal-ի և ձեր օգտատերերի համար
Drupal-ն օգտագործում է PSR-4 ստանդարտը հայտնաբերության համար: Գիտակցելով, որ մոդուլի անունը fax է, ձեր բլոկների կոդը պետք է տեղադրվի fax/src/Plugin/Block/ պանակում: Հետևյալ ֆայլի անունը պետք է համապատասխան լինի դասին, որ պարունակում է: Օրինակ, եթե ուզում ենք սահմանել FaxBlock դաս, ապա այն պետք է լինի ֆայլում fax/src/Plugin/Block/FaxBlock.php հետևյալ օրինակով՝
namespace Drupal\fax\Plugin\Block; use Drupal\Core\Block\BlockBase; /** * Provides a 'Fax' block. * * @Block( * id = "fax_block", * admin_label = @Translation("Fax block"), * ) */ class FaxBlock extends BlockBase { // Override BlockPluginInterface methods here. }
Անոթացիայում նշված id հատկությունը սահմանում է ձեր բլոկի եզակի մեքենայական ընթեռնելի նույնականացուցիչը և անունը, որը կտեսնվի այլ կոդից: admin_label անոթացիան սահմանում է բլոկի ընթեռնելի անունը, որը օգտագործվում է ադմինիստրատիվ միջերեսում: Անոթացիայի հասանելի հատկությունները կարելի է գտնել \Drupal\Core\Block\Annotation\Block-ում (հասանելի հատկություններ):
Ամենատարածված երկու մեթոդներն են վերօրակագրվել՝
- BlockPluginInterface::build() - պետք է վերադարձնի ռենդերային զանգված, որը սահմանում է բովանդակությունը, որ դուք ուզում եք, որ բլոկը ցուցադրի
- BlockBase::access() - վերահսկում է բլոկի տեսանելիությունը: Չափելի է, որ վերադարձնի AccessResult օբյեկտ
Ավելացնել օգտատիրոջ կարգավորելի պարամետրեր ձեր բլոկին
Կարող եք նաև ավելացնել օգտատիրոջ կարգավորելի պարամետրեր բլոկի կարգավորումների ձևում՝ վերօգտագործելով BlockPluginInterface::blockForm() և BlockPluginInterface::blockSubmit() մեթոդները, ապա օգտագործելով BlockBase::setConfigurationValue() և BlockBase::getConfiguration():
Հաջորդ օրինակում մենք ավելացնում ենք նոր տեքստային դաշտ blockForm() մեթոդում, ապա պահում ենք օգտատիրոջ մուտքագրված տվյալները blockSubmit() մեթոդում: Կոդը ցույց է տալիս, թե ինչպես կարելի է ստանալ, ստուգել և թարմացնել արժեքները համապատասխան մեթոդներով:
use Drupal\Core\Block\BlockBase; use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Form\FormBuilderInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Access\AccessResult; use Drupal\Core\Cache\Cache; /** * Provides a 'Fax' block. * * @Block( * id = "fax_block", * admin_label = @Translation("Fax block"), * ) */ class FaxBlock extends BlockBase implements BlockPluginInterface { // Access method here ... /** * {@inheritdoc} */ public function build() { $config = $this->getConfiguration(); $fax_number = isset($config['fax_number']) ? $config['fax_number'] : ''; return array( '#markup' => $this->t('The fax number is @number!', array('@number' => $fax_number)), ); } /** * {@inheritdoc} */ public function blockForm($form, FormStateInterface $form_state) { $form = parent::blockForm($form, $form_state); // Retrieve existing configuration for this block. $config = $this->getConfiguration(); // Add a form field to the existing block configuration form. $form['fax_number'] = array( '#type' => 'textfield', '#title' => t('Fax number'), '#default_value' => isset($config['fax_number']) ? $config['fax_number'] : '', ); return $form; } /** * {@inheritdoc} */ public function blockSubmit($form, FormStateInterface $form_state) { // Save our custom settings when the form is submitted. $this->setConfigurationValue('fax_number', $form_state->getValue('fax_number')); } /** * {@inheritdoc} */ public function blockValidate($form, FormStateInterface $form_state) { $fax_number = $form_state->getValue('fax_number'); if (!is_numeric($fax_number)) { $form_state->setErrorByName('fax_number', t('Needs to be an integer')); } } }
Կարող եք նաև օգտագործել BlockBase::getConfiguration() մեթոդը build()-ում՝ կարգավորումներ ստանալու և դրանք ձեր օգտատերերին ցուցադրելու համար: Ձեր բլոկի access() մեթոդը կարող է պարունակել ավելի բարդ տրամաբանություն՝ որոշելու համար՝ բլոկը ցուցադրվի, թե ոչ:
Օգտագործման թույլտվության մեթոդի օրինակ:
/** * {@inheritdoc} */ public function access(AccountInterface $account, $return_as_object = FALSE) { return \Drupal\Core\Access\AccessResult::allowedIf($account->isAuthenticated()); }
Կարող եք նաև ստեղծել ձեր սեփական կեշավորման պայմանները:
Կեշ-թեգերի կիրառման մեթոդի օրինակ. Ավելին կեշ-թեգերի մասին իմանալու համար:
/** * {@inheritdoc} */ public function getCacheTags() { return \Drupal\Core\Cache\Cache::mergeTags(parent::getCacheTags(), ['node_list']); }
Եթե ցանկանում եք փոխել բլոկի առավելագույն կեշի ժամանակը 0-ի, ավելի շատ իմանալ կեշի առավելագույն տարիքի մասին՝
public function getCacheMaxAge() { // Եթե ցանկանում եք անջատել այս բլոկի կեշավորումը: return 0; }
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.