Drupal 8在块中选择字段

时间:2017-07-09 07:07:30

标签: javascript drupal-modules drupal-8

您好我在创建的模块中有这个代码,我在控制器类的函数中输出:

$output ="
        <span id="dateofshow"> Date of Show:<select id="showdate" class="js-
    showtimes-select Showtimes-select">'
        <option value="2017-07-07">Sat, Jul  7</option>
        <option value="2017-07-08">Sat, Jul  8</option>
        <option value="2017-07-09">Sat, Jul  9</option>
        etc...
        </select></span>"
return output;

当我输出它自己的页面时它会正确显示但是当我把它变成一个块时它被剥离出来并且看起来像这样:

<span id="dateofshow"> Date of Show: Fri, Jul  7Sat, Jul  8Sun, Jul  9Mon, Jul  10Tue, Jul  11Wed, Jul  12Thu, Jul  13Fri, Jul  14Sat, Jul  15Sun, Jul  16Mon, Jul  17Tue, Jul  18Wed, Jul  19Thu, Jul  20Wed, Jul  26Thu, Jul  27Wed, Aug  2Thu, Aug  3Wed, Aug  9Thu, Aug  10Fri, Aug  25Sat, Aug  26Sun, Aug  27Mon, Aug  28Tue, Aug  29Wed, Aug  30Thu, Aug  31</span>

此代码中的style="display: block;"标记也以块形式被剥离出来,并且在同一个函数中:

<div id="2017-07-07" class="js-showtimes-date" style="display: block;">

在Drupal 8中这样做的正确方法是什么?

更新:以下是我正在使用的代码,其中包含一些不相关的部分:

tlistingcontroller.php

namespace Drupal\ttimes\Controller;

use Symfony\Component\HttpFoundation\Response;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use \DateTime;

class tlistingsController 
{
  public function buildtimes(){
  $output = "";

xmlpath = \Drupal::service('file_system')->realpath(file_default_scheme() . "://").'/x/'.'siteId.xml';
$schedResult = simplexml_load_file($xmlpath);

  $output .= <span id="dofshow"> Date of Show: <select id="showd" class="js-showtimes-select Showtimes-select">';
  foreach($schedResult->xpath('//EBDates/EBDate') as $dates){
            $dateformat = date_format ( new DateTime($dates->BDate) , 'D, M  j');
            $output .= '<option value="'. $dates->BDate . '">'. $dateformat . '</option>';
  $output .= '</select></span>';
  return $output;
}
public function tlistings_page() {  //This is what gets called in the .routing.yml file
    return array(
      '#type' => 'markup',
      '#attached' => array(
        'library' => array(
          'tlisting/global',),),
      '#markup' => $this->buildtimes(),
    );  
    }
}

我更新了它,因为我第一次发布它是通过添加一个带有一些css和js的库,所以我可以这样做。函数读取和xml文件然后从中输出数据,部分数据是它提取并放入select和options标签的日期。如何使用选择表单,但使用函数中提取的数据放在当前相同的位置?

2 个答案:

答案 0 :(得分:0)

出于安全考虑,drupal剥离了html和内联样式。更好的方法是使用表单API并实现类FormBase。

FormAPI Drupal 8

您还应该查看此tutorial

答案 1 :(得分:0)

如果你想保持跨度,你可以使用前缀和后缀:

$options['2017-07-07'] = 'Sat, Jul  7';
$options['2017-07-08'] = 'Sat, Jul  8';
$options['2017-07-09'] = 'Sat, Jul  9';

$form['showdate'] = array(
  '#type' => 'select',
  '#options' => $options,
  '#required' => TRUE,
  '#title' => $this->t('Date of Show:'),
  '#prefix' => '<span id="dateofshow">',
  '#suffix' => '</span>');

据我了解,您必须使用渲染数组上的属性来输出内联样式。

  $form['showdate'] = array(
  '#type' => 'select',
  '#options' => $options,
  '#required' => TRUE,
  '#title' => $this->t('Date of Show:'),
  '#prefix' => '<span id="dateofshow">',
  '#suffix' => '</span>',
  '#attributes' => array ('style' => 'display: block;'));

我的建议不是要对抗Drupal输出的标记,而是使用它。如果您提供有关您要实现的目标的更多信息,我将很乐意扩展。

<强>更新 以下是一些可能会根据您的更新帮助您的代码。我没有测试过这个。

$xmlpath = \Drupal::service('file_system')->realpath(file_default_scheme() . "://").'/x/'.'siteId.xml';
  $schedResult = simplexml_load_file($xmlpath);
  $options = array();
  foreach($schedResult->xpath('//EBDates/EBDate') as $dates)
  {
    $options[$dates->BDate] = date_format ( new DateTime($dates->BDate) , 'D, M  j');
  }
  $form['showdate'] = array(
    '#type' => 'select',
    '#options' => $options,
    '#required' => TRUE,
    '#title' => $this->t('Date of Show:'),
    '#attributes' => array (
      'class' => array(
        'js-showtimes-select',
        'Showtimes-select')));