Բլոկ 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;
}