Drupal 8如何使用自定义块配置保存和渲染图像

时间:2018-02-23 20:42:13

标签: drupal-8

我正在尝试创建一个自定义模块,其中包含一个块的配置,允许块具有自定义字段。我在上传图像时遇到问题,然后在网站上的块中进行渲染。

目前这是我的阻止文件的样子;

使用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)也会在网站上显示为“数组”,如果有人可以提供帮助,那就太好了,其他明智的我会提出另一个问题。

1 个答案:

答案 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()函数!