我正在尝试创建一个自定义模块,其中包含一个块的配置,允许块具有自定义字段。我在上传图像时遇到问题,然后在网站上的块中进行渲染。
目前这是我的阻止文件的样子;
使用Drupal \ Core \ Block \ BlockBase; 使用Drupal \ Core \ Form \ FormStateInterface;
/**
* Provides a 'hello' block.
*
* @Block(
* id = "hello_block",
* admin_label = @Translation("Hello"),
* category = @Translation("Hello world block")
* )
*/
class HelloBlock extends BlockBase
{
/**
* {@inheritdoc}
*/
public function blockForm($form, FormStateInterface $formState)
{
$form['heading'] = array(
'#type' => 'textfield',
'#title' => t('Heading'),
'#description' => t('Enter the main heading'),
'#default_value' => 'Main heading'
);
$form['sub_heading'] = array(
'#type' => 'textfield',
'#title' => t('Sub heading'),
'#description' => t('Enter the sub heading'),
'#default_value' => 'Sub heading'
);
$form['body'] = array(
'#type' => 'text_format',
'#title' => t('Body'),
'#description' => t('Main body'),
'#format' => 'full_html',
'#rows' => 50,
'#default_value' => ''
);
$form['image'] = array(
'#type' => 'managed_file',
'#upload_location' => 'public://upload/hello',
'#title' => t('Image'),
'#upload_validators' => [
'file_validate_extensions' => ['jpg', 'jpeg', 'png', 'gif']
],
'#default_value' => isset($this->configuration['image']) ? $this->configuration['image'] : '',
'#description' => t('The image to display'),
'#required' => true
);
return $form;
}
/**
* {@inheritdoc}
*/
public function blockSubmit($form, FormStateInterface $formState)
{
$this->configuration['heading'] = $formState->getValue('heading');
$this->configuration['sub_heading'] = $formState->getValue('sub_heading');
$this->configuration['body'] = $formState->getValue('body');
$this->configuration['image'] = $formState->getValue('image');
}
/**
* {@inheritdoc}
*/
public function build()
{
$markup = '<h1>'.$this->configuration['heading'].'</h1>';
$markup .= '<h2>'.$this->configuration['sub_heading'].'</h2>';
$markup .= '<img src="'.$this->configuration['image']['value'].'">';
$markup .= '<div>' . $this->configuration['body'] . '</div>';
return array(
'#type' => 'markup',
'#markup' => $markup,
);
}
}
有人可以提供一些关于图像没有出现的指示吗?我假设我错过了什么。
保存在正文中的文本(text_format)也会在网站上显示为“数组”,如果有人可以提供帮助,那就太好了,其他明智的我会提出另一个问题。
答案 0 :(得分:0)
保存该表单时,图像字段中的值为文件ID。
因此,您可以使用以下方法获取文件对象和路径:
$image = \Drupal\file\Entity\File::load($fid);
$path = file_create_url($image->getFileUri());
然后,您将在标记变量中使用该路径输出图像。可能存在一种更语义的方式来以“ Drupal-ish”形式输出格式化的图像,但这将使您入门。
哦,还有body字段,请使用
$form_state->getValue('body')['value'];
在您的标记中。
顺便说一句,我喜欢使用Devel和ksm()函数!