CRUD Manajemen Artikel - Memperbaiki Fitur Ekspor

4 Maret 2025
  ·  

5 menit  ·  

Pada artikel sebelumnya, kita sudah menambahkan fitur ekspor data pada tabel artikel menggunakan Laravel DataTables. Fitur ini memungkinkan kita menyimpan data dalam berbagai format seperti Excel dan PDF—sangat berguna untuk kebutuhan laporan atau dokumentasi.

Namun, agar fitur ini dapat berjalan dengan baik, kita perlu melakukan instalasi beberapa dependency tambahan terlebih dahulu.

Pada artikel ini, kita akan membahas bagaimana cara mengatasi masalah tersebut.

Error Saat Ekspor ke Excel

Laravel DataTables membutuhkan package tambahan untuk bisa menjalankan fitur ekspor Excel, yaitu maatwebsite/excel.

Untuk mengatasi masalah ini, kita cukup menjalankan perintah berikut:

sail composer require "maatwebsite/excel:^3.1"

Setelah proses instalasi selesai, fitur ekspor ke Excel akan langsung bisa digunakan tanpa konfigurasi tambahan.

Error Saat Ekspor ke PDF

Berbeda dengan ekspor Excel yang solusinya relatif sederhana, proses ekspor ke PDF membutuhkan penanganan yang sedikit lebih kompleks, terutama jika kita menggunakan Laravel Sail dan lingkungan berbasis Docker.

Instalasi Laravel Snappy

Laravel DataTables mengandalkan package barryvdh/laravel-snappy untuk menghasilkan file PDF. Jalankan perintah berikut untuk melakukan instalasi package ini:

sail composer require barryvdh/laravel-snappy

Namun, setelah proses instalasi selesai, kita akan menghadapi error baru yang berkaitan dengan dependency eksternal yang dibutuhkan oleh Snappy, yaitu wkhtmltopdf.

laravel-snappy bekerja sebagai wrapper untuk wkhtmltopdf, sebuah tool berbasis command line yang mengkonversi HTML menjadi PDF.

The exit status code '127' says something went wrong: stderr: "sh: 1: /usr/local/bin/wkhtmltopdf: not found " stdout: "" command: /usr/local/bin/wkhtmltopdf --lowquality --margin-bottom '10mm' --margin-left '0' --margin-right '0' --margin-top '10mm' --orientation 'landscape' --no-outline ...

Karena Laravel Sail berjalan di dalam Docker, kita perlu menambahkan wkhtmltopdf secara manual ke dalam container.

Menambahkan wkhtmltopdf ke dalam Container

  1. Pertama, kita akan mem-publish konfigurasi Docker yang digunakan oleh Laravel Sail menggunakan perintah berikut:

    sail artisan sail:publish
    
    • Perintah ini akan menghasilkan beberapa file pada folder docker. Karena kita hanya akan menyesuaikan Dockerfile pada PHP 8.4, kita bisa menghapus folder lainnya sehingga struktur folder kita menjadi seperti berikut:

  2. Buka file docker-compose.yml, lalu sesuaikan kembali bagian volumes pada service pgsql menjadi sebagai berikut:

    📄 docker-compose.yml

    1
    2
    3
    
            volumes:
                - 'sail-pgsql:/var/lib/postgresql/data'
                - './vendor/laravel/sail/database/pgsql/create-testing-database.sql:/docker-entrypoint-initdb.d/10-create-testing-database.sql'
    
  3. Buka file docker/8.4/Dockerfile, lalu sesuaikan beberapa bagian kode berikut:

    📄 docker/8.4/Dockerfile

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    
    FROM ubuntu:22.04
    
    LABEL maintainer="Taylor Otwell"
    
    ARG WWWGROUP
    ARG NODE_VERSION=22
    ARG MYSQL_CLIENT="mysql-client"
    ARG POSTGRES_VERSION=17
    
    WORKDIR /var/www/html
    
    ENV DEBIAN_FRONTEND=noninteractive
    ENV TZ=UTC
    ENV SUPERVISOR_PHP_COMMAND="/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80"
    ENV SUPERVISOR_PHP_USER="sail"
    
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    RUN echo "Acquire::http::Pipeline-Depth 0;" > /etc/apt/apt.conf.d/99custom && \
        echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \
        echo "Acquire::BrokenProxy    true;" >> /etc/apt/apt.conf.d/99custom
    
    RUN apt-get update && apt-get upgrade -y \
        && mkdir -p /etc/apt/keyrings \
        && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python3 dnsutils librsvg2-bin fswatch ffmpeg nano  \
        && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xb8dc7e53946656efbce4c1dd71daeaab4ad4cab6' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \
        && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
        && apt-get update \
        && apt-get install -y php8.4-cli php8.4-dev \
           php8.4-pgsql php8.4-sqlite3 php8.4-gd \
           php8.4-curl php8.4-mongodb \
           php8.4-imap php8.4-mysql php8.4-mbstring \
           php8.4-xml php8.4-zip php8.4-bcmath php8.4-soap \
           php8.4-intl php8.4-readline \
           php8.4-ldap \
           php8.4-msgpack php8.4-igbinary php8.4-redis php8.4-swoole \
           php8.4-memcached php8.4-pcov php8.4-imagick php8.4-xdebug \
        && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
        && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
        && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
        && apt-get update \
        && apt-get install -y nodejs \
        && npm install -g npm \
        && npm install -g pnpm \
        && npm install -g bun \
        && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \
        && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
        && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \
        && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
        && apt-get update \
        && apt-get install -y yarn \
        && apt-get install -y $MYSQL_CLIENT \
        && apt-get install -y postgresql-client-$POSTGRES_VERSION \
        && apt-get -y autoremove \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    RUN CONSOLE_ARCH=$(uname -m) && \
        if [ "$CONSOLE_ARCH" = "x86_64" ]; then \
            ARCH="amd64"; \
        elif [ "$CONSOLE_ARCH" = "aarch64" ]; then \
            ARCH="arm64"; \
        elif [ "$CONSOLE_ARCH" = "ppc64le" ]; then \
            ARCH="ppc64el"; \
        else \
            echo "Unsupported architecture: $CONSOLE_ARCH"; \
            exit 1; \
        fi && \
        apt-get update && \
        apt-get install -y wget && \
        wget "https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_$ARCH.deb" && \
        apt install -y -f ./wkhtmltox_0.12.6.1-2.jammy_$ARCH.deb && \
        rm ./wkhtmltox_0.12.6.1-2.jammy_$ARCH.deb
    
    RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.4
    
    RUN groupadd --force -g $WWWGROUP sail
    RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
    
    COPY start-container /usr/local/bin/start-container
    COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
    COPY php.ini /etc/php/8.4/cli/conf.d/99-sail.ini
    RUN chmod +x /usr/local/bin/start-container
    
    EXPOSE 80/tcp
    
    ENTRYPOINT ["start-container"]
    
    • Baris 1
      Menggunakan Ubuntu 22.04 LTS sebagai base image. Hal ini dikarenakan versi stabil terakhir wkhtmltopdf (v0.12.6) hanya mendukung hingga Ubuntu 22.04 LTS.
    • Baris 27, 49
      Penyesuaian codename Ubuntu 22.04 LTS, yaitu jammy.
    • Baris 58-73
      Penambahan skrip instalasi wkhtmltopdf sesuai architecture CPU (x86_64, aarch64, atau ppc64le).
    • Baris 77-78
      Menghapus baris kode RUN userdel -r ubuntu yang tidak dibutuhkan lagi.
  4. Setelah semua penyesuaian di atas, rebuild container dengan perintah:

    sail build
    
  5. Jika berhasil, jalankan perintah sail up -d untuk menjalankan ulang container.

Sekarang, tombol ekspor PDF di Laravel DataTables akan berfungsi sebagaimana mestinya.



Fitur ekspor ke Excel dan PDF sangat berguna untuk meningkatkan fungsi aplikasi, terutama untuk kebutuhan laporan atau dokumentasi. Namun, fitur ini membutuhkan setup tambahan agar bisa berjalan lancar—terutama jika kita menggunakan Laravel Sail.

Di artikel berikutnya, kita akan lanjut membahas tentang menampilkan artikel. Dengan begitu, aplikasi blog yang kita bangun akan semakin fungsional dan dinamis. Jangan lewatkan, ya!

CRUD Manajemen Artikel - Memperbaiki Fitur Ekspor
Top