Как использовать Datatables с Symfony 4 и Webpack Encore? - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь использовать Datatables в проекте Symfony 4, используя Webpack Encore, я прочитал документацию по datatables об интеграции с пряжей , множество уроков и вопросов по SO, но я все еще могу 'не понимаю, как заставить это работать ... Я перепробовал все возможные конфигурации и получил ошибки, или просто ничего не происходит. Я закончил с:

Версии пакета (package.json):

{
    "devDependencies": {
        "@fortawesome/fontawesome-free": "^5.6.3",
        "@symfony/webpack-encore": "^0.22.0",
        "bootstrap": "^4.2.1",
        "jquery": "^3.3.1",
        "node-sass": "^4.11.0",
        "popper.js": "^1.14.6",
        "sass-loader": "^7.0.1",
        "webpack-notifier": "^1.6.0"
    },
    "license": "UNLICENSED",
    "private": true,
    "scripts": {
        "dev-server": "encore dev-server",
        "dev": "encore dev",
        "watch": "encore dev --watch",
        "build": "encore production --progress"
    },
    "dependencies": {
        "datatables.net-bs4": "^1.10.20",
        "flag-icon-css": "^3.2.1"
    }
}

webpack.config.js:

Я отключил загрузчик AMD (см. Последние строки):

var Encore = require('@symfony/webpack-encore');

Encore
    .setOutputPath('public/build/')
    .setPublicPath('/build')

    .addEntry('app', './assets/js/app.js')

    // will require an extra script tag for runtime.js
    // but, you probably want this, unless you're building a single-page app
    .enableSingleRuntimeChunk()

    // FEATURE CONFIG
    .cleanupOutputBeforeBuild()
    .enableBuildNotifications()
    .enableSourceMaps(!Encore.isProduction())
    // enables hashed filenames (e.g. app.abc123.css)
    .enableVersioning(Encore.isProduction())
    // enables Sass/SCSS support
    .enableSassLoader()
    // uncomment if you're having problems with a jQuery plugin
    .autoProvidejQuery()
;

var config = Encore.getWebpackConfig();
//disable amd loader
config.module.rules.unshift({
    parser: {
        amd: false,
    }
});
module.exports = config;

app.js

require('../css/app.scss');
// JQuery and Bootstrap
const $ = require('jquery');
require('bootstrap');
// Datatables and datatables-BS4
require('datatables.net-bs4')();
$.fn.dataTable = $.fn.DataTable = global.DataTable = require('datatables.net-bs4');

// Should probably be in the template...
$(document).ready(function() {
     console.log('Applying DT');
     $('#tabletest').DataTable();
});

Файл тестового шаблона:

{% block stylesheets %}
    {{ encore_entry_link_tags('app') }}
{% endblock %}

{% block body %}
  <table id="tabletest">
    <thead>
        <tr>
            <td>A</td>
            <td>B</td>
            <td>C</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
        </tr>
       <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
        </tr> 
    </tbody>
</table>
{% endblock %}

{% block javascripts %}
    {{ encore_entry_script_tags('app') }}
{% endblock %}

Отключив загрузчик AMD в веб-пакете и добавив строку $.fn.dataTable = $.fn.DataTable = global.DataTable = require('datatables.net-bs4'); в app.js, у меня нет ошибок javascript, но таблицы данных не применяются к таблице #tabletest ...

Может кто-нибудь направить меня в правильном направлении? Благодарю.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

изменить const $ = require('jquery'); на window.$ = window.jQuery = require('jquery');

У меня была такая же проблема, потому что window.jQuery не был определен - с изменениями выше он должен работать правильно.

app.js

require('../css/app.scss');

window.$ = window.jQuery = require('jquery'); //changed
require('bootstrap');
require('datatables.net-bs4');
//removed $.fn.dataTable - not required

$(document).ready(function() {
     console.log('Applying DT');
     $('#tabletest').DataTable();
});
1 голос
/ 11 ноября 2019

Я использую datatables-bs4 таким же образом, единственная разница в app.js, способ, которым я требую это и jQuery, и он работает нормально:

// require jQuery normally
import $ from 'jquery';
// create global $ and jQuery variables
global.$ = global.jQuery = $;

import 'bootstrap' ;

require('datatables.net-bs4')( window, $ );

$(document).ready(function () {
    $("#myTable").DataTable(
        // options
    );
});
...