New question

Question:

Date: 27-02-2025 08:12:29 (In Spanish)

[Aporte] API: chillerlan php-qrcode SIN Composer[Resolved]

Para los que algunas vez se han preguntado como instalar la librería https://github.com/chillerlan/php-qrcode SIN Composer aquí les dejo mi experiencia.

Hay una discusión dentro de GitHub donde se plantea esto, aquí el enlace https://github.com/chillerlan/php-qrcode/discussions/62 pero la solución planteada es incompleta, parece que los fabricantes de esta librería están casados con Composer y no quieren dar una alternativa sin esta dependencia.

Debo decirles que después de estar luchando toda una mañana, logre hacer funcionar la parte del código que a mi me interesaba, la generación de códigos QR, sin composer.

Para empezar debemos descargar la última versión de la librería (con soporte para PHP 8), aquí el repositorio de GitHub: https://github.com/chillerlan/php-qrcode, bajamos la "main".

También tenemos que descargar la dependencia "settings", aquí el repositorio de GitHub: https://github.com/chillerlan/php-settings-container. De éste último paquete lo que nos interesa son 2 archivos php:
/src/SettingsContainerAbstract.php
/src/SettingsContainerInterface.php
Estos dos archivos debemos ponerlos dentro de la librería php-qrcode, creando una carpeta "Settings" dentro de su /src/, o sea, quedarían:
/php-qrcode/src/Settings/SettingsContainerAbstract.php
/php-qrcode/src/Settings/SettingsContainerInterface.php

Para poder hacer uso de esta librería es necesario incluir algunos archivos en el lugar donde vamos a utlizarla, podemos hacer algo como:
// Requiere las clases necesarias directamente
require_once __DIR__ . '/src/QRCodeException.php';
require_once __DIR__ . '/src/Output/QRCodeOutputException.php';
require_once __DIR__ . '/src/Common/Version.php';
require_once __DIR__ . '/src/Common/EccLevel.php';
require_once __DIR__ . '/src/Common/MaskPattern.php';
require_once __DIR__ . '/src/Common/Mode.php';
require_once __DIR__ . '/src/Common/BitBuffer.php';
require_once __DIR__ . '/src/Common/GenericGFPoly.php';
require_once __DIR__ . '/src/Common/GF256.php';
require_once __DIR__ . '/src/Data/QRDataModeInterface.php';
require_once __DIR__ . '/src/Data/QRDataModeAbstract.php';
require_once __DIR__ . '/src/Data/Number.php';
require_once __DIR__ . '/src/Data/AlphaNum.php';
require_once __DIR__ . '/src/Data/Kanji.php';
require_once __DIR__ . '/src/Data/Hanzi.php';
require_once __DIR__ . '/src/Data/Byte.php';
require_once __DIR__ . '/src/Data/QRData.php';
require_once __DIR__ . '/src/Data/QRMatrix.php';
require_once __DIR__ . '/src/Data/ReedSolomonEncoder.php';
require_once __DIR__ . '/src/Settings/SettingsContainerInterface.php';
require_once __DIR__ . '/src/Settings/SettingsContainerAbstract.php';
require_once __DIR__ . '/src/Output/CssColorModuleValueTrait.php';
require_once __DIR__ . '/src/Output/QROutputInterface.php';
require_once __DIR__ . '/src/Output/QROutputAbstract.php';
require_once __DIR__ . '/src/Output/RGBArrayModuleValueTrait.php';
require_once __DIR__ . '/src/Output/QRGdImage.php';
require_once __DIR__ . '/src/Output/QRMarkup.php';
require_once __DIR__ . '/src/Output/QRMarkupSVG.php';
require_once __DIR__ . '/src/Output/QRGdImagePNG.php';
require_once __DIR__ . '/src/QROptionsTrait.php';
require_once __DIR__ . '/src/QRCodeReaderOptionsTrait.php';
require_once __DIR__ . '/src/QRCode.php';
require_once __DIR__ . '/src/QROptions.php';


En lo personal me cree un archivo tipo "bootstrap" con una clase Helper para simplificar la inclusión de la librería donde la necesito y hacer un uso más "friendly". Para esto cree dentro de la carpeta de la librería /php-qrcode/ un archivo llamado phpqrcode.php que incluyo donde debo hacer uso de la librería:

Aquí el código de phpqrcode.php:
<?php
// Requiere las clases necesarias directamente
require_once __DIR__ . '/src/QRCodeException.php';
require_once __DIR__ . '/src/Output/QRCodeOutputException.php';
require_once __DIR__ . '/src/Common/Version.php';
require_once __DIR__ . '/src/Common/EccLevel.php';
require_once __DIR__ . '/src/Common/MaskPattern.php';
require_once __DIR__ . '/src/Common/Mode.php';
require_once __DIR__ . '/src/Common/BitBuffer.php';
require_once __DIR__ . '/src/Common/GenericGFPoly.php';
require_once __DIR__ . '/src/Common/GF256.php';
require_once __DIR__ . '/src/Data/QRDataModeInterface.php';
require_once __DIR__ . '/src/Data/QRDataModeAbstract.php';
require_once __DIR__ . '/src/Data/Number.php';
require_once __DIR__ . '/src/Data/AlphaNum.php';
require_once __DIR__ . '/src/Data/Kanji.php';
require_once __DIR__ . '/src/Data/Hanzi.php';
require_once __DIR__ . '/src/Data/Byte.php';
require_once __DIR__ . '/src/Data/QRData.php';
require_once __DIR__ . '/src/Data/QRMatrix.php';
require_once __DIR__ . '/src/Data/ReedSolomonEncoder.php';
require_once __DIR__ . '/src/Settings/SettingsContainerInterface.php';
require_once __DIR__ . '/src/Settings/SettingsContainerAbstract.php';
require_once __DIR__ . '/src/Output/CssColorModuleValueTrait.php';
require_once __DIR__ . '/src/Output/QROutputInterface.php';
require_once __DIR__ . '/src/Output/QROutputAbstract.php';
require_once __DIR__ . '/src/Output/RGBArrayModuleValueTrait.php';
require_once __DIR__ . '/src/Output/QRGdImage.php';
require_once __DIR__ . '/src/Output/QRMarkup.php';
require_once __DIR__ . '/src/Output/QRMarkupSVG.php';
require_once __DIR__ . '/src/Output/QRGdImagePNG.php';
require_once __DIR__ . '/src/QROptionsTrait.php';
require_once __DIR__ . '/src/QRCodeReaderOptionsTrait.php';
require_once __DIR__ . '/src/QRCode.php';
require_once __DIR__ . '/src/QROptions.php';

use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;

class PHPQRCodeHelper {

    /**
     * Este método devuelve una img png en base 64
     * El parametro 'eccLevel' es el nivel de corrección de errores, determina cuántos datos puede "recuperar" el QR si está dañado, hay 4 niveles:
     *      QRCode::ECC_L (Low): ~7% de los datos pueden ser restaurados (genera códigos más compactos, útiles si necesitas ahorrar espacio).
     *      QRCode::ECC_M (Medium): ~15% de los datos pueden ser restaurados.
     *      QRCode::ECC_Q (Quartile): ~25% de los datos pueden ser restaurados (es un buen balance si esperas que el QR pueda dañarse levemente (doblez, manchas, etc.).
     *      QRCode::ECC_H (High): ~30% de los datos pueden ser restaurados.
     * El parametro 'scale' define el tamaño de cada "módulo" (el cuadradito negro del QR):
     *     scale: 2: módulos pequeños ? código QR compacto.
     *     scale: 10: módulos grandes ? código QR más grande y fácil de escanear.
     *     Usa 2 si necesitas un QR chico (para tickets, por ejemplo).
     *     Usa 10 si el QR debe ser leído desde cierta distancia (carteles, etiquetas grandes).
     * @param type $urlQr URL que se codifica en la imagen
     * @return type The encoded data base 64, as a string.
     */
    public static function generateQrPngBase64($urlQr, $scale = 10) {
        $options = new QROptions([
            'eccLevel' => chillerlan\QRCode\Common\EccLevel::Q, //es el valor para 'eccLevel' => QRCode::ECC_Q
            'outputInterface' => chillerlan\QRCode\Output\QRGdImagePNG::class, // Usar la interfaz para imágenes PNG
            'outputType' => 2, // 2 es el valor para QRCode::OUTPUT_IMAGE_PNG
            'scale' => $scale,
            'imageBase64' => false,
            'imageTransparent' => false
        ]);

        $qrCode = new QRCode($options);
        $qrImage = $qrCode->render($urlQr);
        return $qrImage;
    }

}


Ejemplo de uso:
//incluyo el archivo bootstrap:
require_once PATH_LIB . 'php-qrcode/phpqrcode.php'

$urlQr = 'https://www.phpcentral.com/';

//genero el QR:
$imgPngBase64 = PHPQRCodeHelper::generateQrPngBase64($urlQr);

//muestro el QR (acá pueden hacer lo que quieran, bajarlo a un archivo físico, adjuntarlo en un PDF, etc.):
header ('Content-Type: image/png');
echo $imgPngBase64;


Seguro esta integración podrá ser mejorada, si alguien tiene algo que aportar los escucho.

Saludos y buen código!
Tags: API - Component - Input - Installation - Library - PHP - PHP Advanced Votes: 0 - Answers: 0 - Views: 3 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

No replies for this question, be the first to answer.
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com