首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Drupal8,添加一个带有预览功能的BuildForm中的图像字段

问Drupal8,添加一个带有预览功能的BuildForm中的图像字段
EN

Stack Overflow用户
提问于 2015-12-05 10:24:45
回答 5查看 10.4K关注 0票数 4

我从一个buildForm函数创建了一个自定义表单。在这个表单中,我想添加一个图像字段。

我可以通过以下代码做到这一点:

代码语言:javascript
复制
$form['main']['image'] = array(
    '#type' => 'text_format',
    '#title' => t('image'),
    '#default_value' => array(10),
);

我可以上传图像并将其从表单中删除。然而,当我上传一张图片时,我没有这个预览。我的意思是,当我通过Drupal UI创建内容时。我可以添加一个预先配置的"image“字段。当我通过这个" image“字段上传一张图片时,我得到了该图片的预览。

在这里,当我以编程方式创建field元素时,当我上传她时,我没有预览图像。当我通过" image“字段上传图片时,如何使用Drupal api来预览图片?

EN

回答 5

Stack Overflow用户

发布于 2016-07-08 21:59:49

下面是我如何让我的表单显示缩略图。我基本上所做的是将ImageWidget::process中的代码放入主题预处理器中,并将元素的#theme属性设置为image_widget。

窗体类中的图像元素应如下所示:

代码语言:javascript
复制
$form['profile_image'] = [
   '#type' => 'managed_file',
   '#title' => t('Profile Picture'),
   '#upload_validators' => array(
       'file_validate_extensions' => array('gif png jpg jpeg'),
       'file_validate_size' => array(25600000),
   ),
   **'#theme' => 'image_widget',**
   **'#preview_image_style' => 'medium',**
   '#upload_location' => 'public://profile-pictures',
   '#required' => TRUE,
];

在name_of_default_theme.theme文件中,您需要以下内容:

代码语言:javascript
复制
function name_of_default_theme_preprocess_image_widget(&$variables) {
    $element = $variables['element'];

    $variables['attributes'] = array('class' => array('image-widget', 'js-form-managed-file', 'form-managed-file', 'clearfix'));

    if (!empty($element['fids']['#value'])) {
        $file = reset($element['#files']);
        $element['file_' . $file->id()]['filename']['#suffix'] = ' <span class="file-size">(' . format_size($file->getSize()) . ')</span> ';
        $file_variables = array(
            'style_name' => $element['#preview_image_style'],
            'uri' => $file->getFileUri(),
        );

        // Determine image dimensions.
        if (isset($element['#value']['width']) && isset($element['#value']['height'])) {
            $file_variables['width'] = $element['#value']['width'];
            $file_variables['height'] = $element['#value']['height'];
        } else {
            $image = \Drupal::service('image.factory')->get($file->getFileUri());
            if ($image->isValid()) {
                $file_variables['width'] = $image->getWidth();
                $file_variables['height'] = $image->getHeight();
            }
            else {
                $file_variables['width'] = $file_variables['height'] = NULL;
            }
        }

        $element['preview'] = array(
            '#weight' => -10,
            '#theme' => 'image_style',
            '#width' => $file_variables['width'],
            '#height' => $file_variables['height'],
            '#style_name' => $file_variables['style_name'],
            '#uri' => $file_variables['uri'],
        );

        // Store the dimensions in the form so the file doesn't have to be
        // accessed again. This is important for remote files.
        $element['width'] = array(
            '#type' => 'hidden',
            '#value' => $file_variables['width'],
        );
        $element['height'] = array(
            '#type' => 'hidden',
            '#value' => $file_variables['height'],
        );
    }

    $variables['data'] = array();
    foreach (Element::children($element) as $child) {
        $variables['data'][$child] = $element[$child];
    }
}

该解决方案运行良好,但图像模块缺少一个带有@FormElement注释的类。这就是元素不能正确呈现的原因。

票数 11
EN

Stack Overflow用户

发布于 2016-02-01 18:56:44

您可以尝试使用managed_file类型吗?

代码语言:javascript
复制
'#type' => 'managed_file'
票数 3
EN

Stack Overflow用户

发布于 2019-01-04 05:28:13

答案很好thx,我所做的唯一改变是使用Token作为上传位置,Bytes作为文件上传大小,尽管我猜这取决于用例。类似于下面的代码(为了简单起见,去掉了大部分代码。

代码语言:javascript
复制
namespace Drupal\my_module\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Component\Utility\Bytes;
use Drupal\Core\Utility\Token;

class SampleForm extends FormBase
{

  protected $currentUser;

  protected $token;


  public function __construct(AccountProxyInterface $current_user, Token $token) {
    $this->currentUser = $current_user;
    $this->token = $token;
  }


  public static function create(ContainerInterface $container)
  {
    return new static(
      $container->get('current_user'),
      $container->get('token')
    );
  }


  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    $form['sample_image'] = [
        '#type' => 'managed_file',
        '#title' => t('Profile Picture'),
        '#upload_validators' => array(
          'file_validate_extensions' => array('gif png jpg jpeg'),
          'file_validate_size' => file_upload_max_size() / pow(Bytes::KILOBYTE, 2) . 'M',
        ),
      '#theme' => 'image_widget',
      '#preview_image_style' => 'medium',
      '#upload_location' => $this->token->replace('private://[date:custom:Y]-[date:custom:m]'),
      '#required' => TRUE,
    ];

    return $form;
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34100546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档