Drupal մոդուլում բլոկի սահմանում
Բաժին V Դրամական ուղեցույց Drupal 8-ի հիմնական մոդուլների ստեղծման համար
.info-ից մինչև թեստեր, միայն հիմնականները
Հիշո՞ւմ եք, որ սկզբում այս դասի մեջ ասել էի, որ մենք կսահմանենք բլոկ՝ ֆորմայով։ Հիմա ժամանակն է այդ հարցին անդրադառնալու։
/src/Form/LoremIpsumBlockForm.php
<?php
namespace Drupal\loremipsum\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
/**
* Lorem Ipsum բլոկի ֆորմա
*/
class LoremIpsumBlockForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'loremipsum_block_form';
}
Այս ֆայլը շատ նման է կարգավորումների ֆայլին, բացառությամբ այն բանի, որ այն ընդլայնում է FormBase դասը։
Նա նաև ունի buildForm() մեթոդ, որը գրեթե այսպիսի տեսք ունի.
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// Քանի՞ պարբերություն։
// $options = new array();
$options = array_combine(range(1, 10), range(1, 10));
$form['paragraphs'] = [
'#type' => 'select',
'#title' => $this->t('Պարբերություններ'),
'#options' => $options,
'#default_value' => 4,
'#description' => $this->t('Քանի՞'),
];
// Քանի՞ արտահայտություն։
$form['phrases'] = [
'#type' => 'textfield',
'#title' => $this->t('Արտահայտություններ'),
'#default_value' => '20',
'#description' => $this->t('Ամենաշատը յուրաքանչյուր պարբերության համար'),
];
// Գործարկել։
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Ստեղծել'),
];
return $form;
}
Այս մեթոդը օգտագործվում է բլոկում ֆորման տեղադրելու համար, որի միջոցով օգտվողները կարգավորում են, թե քանի տեքստային նմուշ են ցանկանում ստեղծել։
Մի մոռացեք նաև validateForm() և submitForm() մեթոդները.
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
$phrases = $form_state->getValue('phrases');
if (!is_numeric($phrases)) {
$form_state->setErrorByName('phrases', $this->t('Խնդրում ենք օգտագործել թիվ։'));
}
if (floor($phrases) != $phrases) {
$form_state->setErrorByName('phrases', $this->t('Խնդրում ենք ոչ տասնորդական թվեր։'));
}
if ($phrases < 1) {
$form_state->setErrorByName('phrases', $this->t('Խնդրում ենք օգտագործել զրոյից մեծ թիվ։'));
}
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$form_state->setRedirect('loremipsum.generate', [
'paragraphs' => $form_state->getValue('paragraphs'),
'phrases' => $form_state->getValue('phrases'),
]);
}
}
Այժմ անցնենք բլոկին.
<?php
namespace Drupal\loremipsum\Plugin\Block;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
/**
* Ներկայացնում է Lorem ipsum բլոկ, որով կարող եք ցանկացած վայրում գեներացնել տեքստ։
*
* @Block(
* id = "loremipsum_block",
* admin_label = @Translation("Lorem ipsum բլոկ"),
* )
*/
class LoremIpsumBlock extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
// Վերադարձնում է ֆորման՝ @ Form/LoremIpsumBlockForm.php-ից։
return \Drupal::formBuilder()->getForm('Drupal\loremipsum\Form\LoremIpsumBlockForm');
}
LoremIpsumBlock դասը ընդլայնում է BlockBase-ը և ունի չորս հիմնական մեթոդ, որոնք պետք է իրականացվեն՝ build(), blockAccess(), blockForm() և blockSubmit(): Առաջին մեթոդը պարզապես ցուցադրում է ֆորման, որը սահմանվել է մեր նախորդ քայլում։
Հաջորդը կարգավորվում է մուտքի վերահսկողությունը՝
/**
* {@inheritdoc}
*/
protected function blockAccess(AccountInterface $account) {
return AccessResult::allowedIfHasPermission($account, 'generate lorem ipsum');
}
Սահմանեք բլոկի ֆորման ադմինիստրատիվ էկրանին.
/**
* {@inheritdoc}
*/
public function blockForm($form, FormStateInterface $form_state) {
$form = parent::blockForm($form, $form_state);
$config = $this->getConfiguration();
return $form;
}
Ներկայացման ֆունկցիան.
/**
* {@inheritdoc}
*/
public function blockSubmit($form, FormStateInterface $form_state) {
$this->setConfigurationValue('loremipsum_block_settings', $form_state->getValue('loremipsum_block_settings'));
}
}
Այժմ մեր բլոկը պետք է աշխատի։