Autocompletar 3

Estructura

/autocompletar3 amb BD
│── style.css
│   
│── /js
│   ├── javascripts.js
│── index.html
│── cercar.php
│── Bd_conexions 
    ├── conexio_diccionari_bd.php

index.php

<?php
// Simulació de sessió i configuracions bàsiques
session_start();
?>

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>Eines Lingüístiques</title>
    <link rel="stylesheet" href="styles.css">
    <script src="js/jquery.min.js"></script>
</head>
<body>

    <h1>Cercador amb autocompletat</h1>

    <!-- Formulari de cerca -->
    <form id="cercaForm" method="POST" action="#">
        <div class="search-container">
            <input 
                type="text" 
                id="cercar"
                name="cercar" 
                onkeyup="mostrarAutocompletar()" 
                placeholder="Cerca..." 
                autofocus
            >
            <button type="submit">Cercar</button>
        </div>
    </form>

    <!-- Contenidor de l'autocompletat -->
    <div id="resultats_autocompletar_container">
        <ul id="resultats_autocompletar">
            <!-- Resultats dinàmics via JavaScript -->
        </ul>
    </div>
   
    <script src="js/scripts.js" defer></script>
</body>
</html>

script/javascripts.js 

// Funció per mostrar resultats d'autocompletar

function mostrarAutocompletar() {
    const cercarInput = document.getElementById("cercar");
    const cercarValue = cercarInput.value.trim();
  
    if (cercarValue.length > 0) {
        //alert("linia 8 arriba pero no entra php. Longitud de cercarValue: " + cercarValue.length);
        fetch("BD_conexions/conexio_diccionari_bd.php", {
            method: "POST",
            headers: { "Content-Type": "application/x-www-form-urlencoded" },
            body: "cercar=" + encodeURIComponent(cercarValue)
        })
        .then(response => response.json())
        .then(resultats => {
            const ul = document.getElementById("resultats_autocompletar");
            ul.innerHTML = '';  // Neteja els resultats anteriors

            resultats.forEach(paraula => {
                const li = document.createElement("li");
                li.textContent = paraula;
                li.onclick = function() { seleccionar(paraula); };
                ul.appendChild(li);
            });

            document.getElementById("resultats_autocompletar_container").style.display = resultats.length > 0 ? "block" : "none";
        })
        .catch(error => console.error("Error en l'autocompletat:", error));
    } else {
        document.getElementById("resultats_autocompletar_container").style.display = "none";
    }
}

// Funció per seleccionar una paraula i posar-la al cercador
function seleccionar(paraula) {
    document.getElementById("cercar").value = paraula;
    document.getElementById("resultats_autocompletar_container").style.display = "none";
}

Estils-styles.css

body {
    font-family: Arial, sans-serif;
    text-align: center;
    margin: 50px;
}

input {
    padding: 10px;
    width: 300px;
    font-size: 16px;
    margin-bottom: 10px;
}

#resultats {
    margin-top: 20px;
    border: 1px solid #ddd;
    width: 300px;
    margin-left: auto;
    margin-right: auto;
    text-align: left;
    padding: 10px;
}

conexio_diccionari_db.php

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

header("Content-Type: application/json"); // Assegura que s'envia JSON

// Simulació de resultats per a la prova
echo json_encode(["hola", "adéu", "bon dia", "bon vespre", "gràcies"]);
exit(); // Assegura't que no s'envia més contingut després del JSON
?>

autocompletar 2

estructura

/autocompletar 2 sense BD
│── style.css               (Estils per al formulari i els resultats)
│   
│── /js
│   ├── javascripts.js      (Logica JavaScript per l'autocompletat)
│
│── index.html              (Pàgina principal amb el formulari)
│── cercar.php              (No el necessites en aquest cas ja que és una simulació, 
│── Bd_conexions 
│   ├── conexio_diccionari_bd.php   (Simulació de la connexió amb la base de dades)

/autocompletar 2 sense BD
│── style.css
│   
│── /js
│   ├── javascripts.js
│── index.html
│── cercar.php
│── Bd_conexions 
    ├── conexio_diccionari_bd.php

index.php

<?php
// Simulació de sessió i configuracions bàsiques
session_start();
?>

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>Eines Lingüístiques</title>
    <link rel="stylesheet" href="styles.css">
    <script src="js/jquery.min.js"></script>
    <script src="js/scripts.js" defer></script>
</head>
<body>

    <h1>Cercador amb autocompletat</h1>

    <!-- Formulari de cerca -->
    <form id="cercaForm" method="POST" action="#">
        <div class="search-container">
            <input 
                type="text" 
                id="cercar"
                name="cercar" 
                onkeyup="mostrarAutocompletar()" 
                placeholder="Cerca..." 
                autofocus
            >
            <button type="submit">Cercar</button>
        </div>
    </form>

    <!-- Contenidor de l'autocompletat -->
    <div id="resultats_autocompletar_container">
        <ul id="resultats_autocompletar">
            <!-- Resultats dinàmics via JavaScript -->
        </ul>
    </div>

</body>
</html>

script/javascripts.js (Logica del JavaScript per l’autocompletat)

// Funció que mostra els resultats d'autocompletar
function mostrarAutocompletar() {
    const cercarInput = document.getElementById("cercar");
    const cercarValue = cercarInput.value.trim();

    if (cercarValue.length > 0) {
        // Simulació de dades d'autocompletar
        const resultats = ['hola', 'adéu', 'bon dia', 'bon vespre', 'gràcies'];

        // Filtrar resultats basat en l'input de cerca
        const resultatsFiltrats = resultats.filter(paraula => 
            paraula.toLowerCase().includes(cercarValue.toLowerCase())
        );

        // Mostrar els resultats
        const ul = document.getElementById("resultats_autocompletar");
        ul.innerHTML = '';  // Neteja els resultats anteriors

        resultatsFiltrats.forEach(paraula => {
            const li = document.createElement("li");
            li.textContent = paraula;
            li.onclick = function() { seleccionar(paraula); };
            ul.appendChild(li);
        });

        // Mostrar l'ul si hi ha resultats
        document.getElementById("resultats_autocompletar_container").style.display = "block";
    } else {
        // Si l'input està buit, amaga els resultats
        document.getElementById("resultats_autocompletar_container").style.display = "none";
    }
}

// Funció que selecciona una paraula i la posa a l'input
function seleccionar(paraula) {
    document.getElementById("cercar").value = paraula; // Posa el valor seleccionat
    document.getElementById("resultats_autocompletar_container").style.display = "none"; // Amaga els resultats
    document.getElementById("cercaForm").submit(); // Envia el formulari
}

Fitxer styles.css (Estils per al formulari i els resultats)

body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 20px;
    background-color: #f4f4f4;
}

h1 {
    text-align: center;
}

.search-container {
    display: flex;
    justify-content: center;
    align-items: center;
    margin-bottom: 20px;
}

#cercar {
    width: 60%;
    padding: 10px;
    font-size: 16px;
    margin-right: 10px;
}

button {
    padding: 10px;
    font-size: 16px;
}

#resultats_autocompletar_container {
    position: relative;
    max-width: 60%;
    margin: 0 auto;
}

#resultats_autocompletar {
    background-color: white;
    border: 1px solid #ccc;
    list-style-type: none;
    padding: 0;
    margin: 0;
    position: absolute;
    width: 100%;
    z-index: 1000;
}

#resultats_autocompletar li {
    padding: 10px;
    cursor: pointer;
}

#resultats_autocompletar li:hover {
    background-color: #f0f0f0;
}

Fitxer BD_conexions/conexio_diccionari_bd.php (Simulació de connexió amb la base de dades)

<?php
// Simulació d'una base de dades amb paraules per buscar
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $cercar = isset($_POST['cercar']) ? $_POST['cercar'] : '';
    
    // Dades de prova per simular resultats de cerca
    $resultats = ['hola', 'adéu', 'bon dia', 'bon vespre', 'gràcies'];

    // Filtrar resultats segons la cerca
    $resultats_filtrats = array_filter($resultats, function($paraula) use ($cercar) {
        return stripos($paraula, $cercar) !== false;
    });

    // Retornar els resultats en format HTML
    foreach ($resultats_filtrats as $resultat) {
        echo "<li onclick=\"seleccionar('$resultat')\">$resultat</li>";
    }
}
?>

Explicació dels fitxers:

  1. index.php: Aquest és el fitxer principal que conté el formulari de cerca i els resultats d’autocompletar. S’hi ha afegit una secció on es mostren els resultats filtrats a mesura que l’usuari escriu.
  2. scripts.js: Aquest script maneja la lògica de l’autocompletar. Utilitza la funció mostrarAutocompletar() per filtrar i mostrar els resultats quan l’usuari escriu alguna cosa, i seleccionar() per omplir el camp de cerca amb la paraula seleccionada.
  3. styles.css: Aquest fitxer conté els estils bàsics per al disseny del formulari i els resultats d’autocompletar. Els estils estan dissenyats per tenir una caixa de cerca amb un estil net i mostrar els resultats de cerca de manera interactiva.
  4. conexio_diccionari_bd.php: Simula una base de dades que retorna resultats segons el terme de cerca que s’envia per AJAX. Per ara, només simula una cerca de paraules en un array predefinit.

Com provar-ho:

Prova a seleccionar un resultat i veuràs com es completa l’input i es realitza el submit del formulari (simulant una cerca real).

Coloca aquests fitxers en el teu servidor local (XAMPP, WAMP, etc.).

Obre index.php en el navegador. Quan escriguis a l’input de cerca, es mostraran els resultats d’autocompletar sota el camp de cerca.

Autocompletar

flux

Usuari tecleja → onkeyup= cercar_bd(); → AJAX envia ‘cercar’ → PHP te dades+cercar, processa i retorna #resultats → JavaScript mostra el resultat

Tot el procés de consulta es fa de manera asincrònica a través d’AJAX, la qual cosa permet que la pàgina no es recarregui completament i els resultats es mostrin dinàmicament sense interrupcions. Això fa que l’experiència de l’usuari sigui més fluida.

Estructura

/autocompletar
│── /css
│   ├── style.css
│── /js
│   ├── script.js
│── index.html
│── cercar.php
│── db_config.php

cercar.php


if (isset($_POST['cercar'])) {
    $paraula = $conn->real_escape_string($_POST['cercar']);
    error_log("Paraula rebuda: " . $paraula); // Registra la paraula rebuda per la crida AJAX

    $sql = "SELECT catala FROM catala_iec WHERE catala LIKE '$paraula%' LIMIT 5";
    $result = $conn->query($sql);

    $respostes = array();
    
    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $respostes[] = htmlspecialchars($row['catala']);
        }
    } else {
        $respostes[] = "No s'han trobat resultats.";
    }
    
    // Retornem les dades en format JSON
    echo json_encode($respostes);
    error_log("Resposta JSON enviada: " . json_encode($respostes)); // Registra la resposta enviada en format JSON
}

$conn->close();
?>




index.html

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>Autocompletar</title>
    <link rel="stylesheet" href="styles.css">
    <script src="js/jquery.min.js"></script>
</head>
<body>

    <h1>Cercador & autocompletat</h1>

    <!-- Formulari de cerca -->
    <form id="cercaForm" method="POST" action="cercar.php">
        <div class="search-container">
            <input 
                type="text" 
                id="cercar"
                name="cercar" 
                onkeyup="mostrarAutocompletar()" 
                placeholder="Cerca..." 
                autofocus
            >
            <button type="submit">Cercar</button>
        </div>
    </form>

    <!-- Contenidor de l'autocompletat -->
    <div id="resultats_autocompletar_container">
        <ul id="resultats_autocompletar">
            <!-- Resultats dinàmics via JavaScript -->
        </ul>
    </div>
   
    <script src="js/scripts.js" defer></script>
</body>
</html>



CSS

body {
    font-family: Arial, sans-serif;
    text-align: center;
    margin: 50px;
}

input {
    padding: 10px;
    width: 300px;
    font-size: 16px;
    margin-bottom: 10px;
}

#resultats {
    margin-top: 20px;
    border: 1px solid #ddd;
    width: 300px;
    margin-left: auto;
    margin-right: auto;
    text-align: left;
    padding: 10px;
}

js/script.js (AJAX per a la cerca)

$(document).ready(function () {
    $("#cercar").on("keyup", function () {
        var paraula = $(this).val();
        console.log("Tecla premuda: " + paraula);

        if (paraula.length > 0) {
            $.ajax({
                url: "cercar.php",
                type: "POST",
                data: { cercar: paraula },
                success: function (resposta) {
                    console.log("Resposta AJAX rebuda");
                    var resultats = JSON.parse(resposta);
                    var htmlResultats = resultats.map(function (item) {
                        return "<li class='resultat'>" + item + "</li>";
                    }).join("");
                    $("#resultats_autocompletar").html(htmlResultats);
                },
                error: function () {
                    console.error("Error en la crida AJAX.");
                }
            });
        } else {
            $("#resultats_autocompletar").html(""); // Esborra els resultats si no hi ha text
        }
    });

    // Afegir esdeveniment de clic per als elements de resultat
    $(document).on("click", ".resultat", function () {
        var paraulaSeleccionada = $(this).text();
        console.log("Paraula seleccionada: " + paraulaSeleccionada);
        $("#cercar").val(paraulaSeleccionada);
    });
});


db_config.php

<?php
$host = "localhost";
$user = "root";       // Canvia-ho si cal
$pass = "beseit00";           // Canvia-ho si cal
$dbname = "polidic_cat"; // Nom de la teva BD

$conn = new mysqli($host, $user, $pass, $dbname);

// Comprovar la connexió
if ($conn->connect_error) {
    die("Error de connexió: " . $conn->connect_error);
}
?>

Interacció entre HTML, JavaScript (JS), AJAX i PHP

HTML -> JavaScript (JS) -> AJAX <-> PHP

El flux d’interacció seria així:

  • Es capturen els esdeveniments d’usuari amb onkeyup.
  • Es crida la funció cercar_bd() de JavaScript, que obté el valor de l’entrada de text i realitza una crida AJAX al fitxer PHP (prova.php).
  • El fitxer PHP processa la sol·licitud, pot interactuar amb la base de dades i retorna una resposta.
  • La resposta del servidor és gestionada per la funció success d’AJAX i es pot mostrar o utilitzar segons sigui necessari.

function cercar_bd() {   
    var cercar = $("#cercar").val(); // Obtenir el valor de l'entrada de text
    alert('Valor de cercar: ' + cercar);    
}

Capsa Replicadora

Aquest tipus d’entrada s’han de fer com HTML


<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Capsa Replicadora</title>
    <link rel="icon" href=".ico" type="image/x-icon">
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: flex-start;
            background-color: #f0f0f0;
            min-height: 100vh;
        }
        .container {
            background-color: rgb(213, 225, 225);
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            width: 80%;
            max-width: 800px;
            margin-top: 50px;
            box-sizing: border-box;
        }
        h1 {
            text-align: center;
            color: #333;
        }
        p {
            margin: 5px 0;
            color: #444;
        }
        .input-wrapper {
            width: 50%;
            margin: 0 auto 10px auto; /* Centra les entrades */
        }

        /* Responsivitat per a dispositius petits */
        @media (max-width: 600px) {
            .container {
                width: 90%;
                margin-top: 30px;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Capsa Replicadora</h1>
        
        <div class="input-wrapper">
            <label for="cercar">Cercar:</label>
            <input type="text" id="cercar" name="cercar" autofocus onkeyup="replicarText()">
        </div>
        <div class="input-wrapper">
            <label for="replicar">Replicar:</label>
            <input type="text" id="replicar" name="replicar">
        </div>
    </div>
    <script>
        function replicarText() {
            //alert('entra a replicar');
            var cercarInput = document.getElementById('cercar');
            var replicarInput = document.getElementById('replicar');
            replicarInput.value = cercarInput.value;
        }
    </script>
</body>
</html>

$_GET[‘dic’] i $_GET[‘lang] per passar informació a un formulari (dintre de la mateixa carpeta)

Per recollir les variables $_GET['dic'] i $_GET['lang] de la informació passada a través del navegador, podeu utilitzar el següent codi PHP:

<?php
// Recollir les variables del GET
$diccionari = isset($_GET['dic']) ? $_GET['dic'] : 'No definit';
$llenguatge = isset($_GET['lang']) ? $_GET['lang'] : 'No definit';

// Mostrar les variables
echo "El diccionari és: " . htmlspecialchars($diccionari) . "<br>";
echo "El llenguatge és: " . htmlspecialchars($llenguatge);
?>

per example si al navegador veiem: 192.168.1.41/poli/BD_conexions/conexio_diccionari_bd.php?dic=catala_castella&lang=cat

Al formulari que mostra les variables podem llegir:

El diccionari és: catala_castella
El llenguatge és: cat

$idioma = isset($_GET[‘lang’]) ? $_GET[‘lang’] : ‘cat’;

Aquesta instrucció és una forma concisa de definir una variable $idioma en funció de si el paràmetre lang existeix a l'URL. Això es fa utilitzant l'operador ternari, que és una alternativa compacta al condicional if-else. Aquí tens com funciona pas a pas:

isset($_GET['lang']):

Verifica si existeix el paràmetre lang a l'URL. Si l'usuari accedeix a la pàgina amb un enllaç del tipus index.php?lang=eus, llavors isset($_GET['lang']) tornarà true.

$_GET['lang']:

Si el paràmetre lang existeix (és a dir, isset($_GET['lang']) és true), el valor d'aquest paràmetre s'assignarà a $idioma. Per exemple, si l'URL és index.php?lang=eng, el valor de $idioma serà 'eng'.

: 'cat':

Si el paràmetre lang no existeix (és a dir, isset($_GET['lang']) és false), el valor per defecte 'cat' (català) s'assignarà a $idioma.

Python per llegir qualsevol àrea de text de Polidic

Sí, pots utilitzar Python per llegir qualsevol àrea de text del teu diccionari i convertir-lo a veu utilitzant biblioteques de text a veu com pyttsx3 o gTTS.

Aquí tens un exemple de com podries fer-ho amb la biblioteca pyttsx3:

Primer, instal·la la biblioteca pyttsx3: pip install pyttsx3.

import pyttsx3
from bs4 import BeautifulSoup

# Exemple de contingut HTML amb una àrea de text
html_content = """
<textarea id="myTextarea">Aquest és un text d'exemple que vull convertir a veu.</textarea>
"""

# Analitzar el contingut HTML
soup = BeautifulSoup(html_content, 'html.parser')

# Trobar l'àrea de text pel seu id
textarea = soup.find('textarea', {'id': 'myTextarea'})

# Llegir el contingut de l'àrea de text
if textarea:
    text_content = textarea.get_text()
    
    # Inicialitzar el motor de text a veu
    engine = pyttsx3.init()
    
    # Configurar les propietats de la veu (opcional)
    voices = engine.getProperty('voices')
    engine.setProperty('voice', voices[0].id)  # Selecciona la veu
    
    # Convertir text a veu
    engine.say(text_content)
    engine.runAndWait()
else:
    print("No s'ha trobat l'àrea de text.")

Això llegirà el contingut de l'àrea de text identificada pel seu id i el convertirà a veu. Pots adaptar aquest codi per llegir àrees de text del teu diccionari i convertir el text a veu.



Estructura del projecte Polidic

// Includes inicials
include_once('inicia_variables_sessio.php')
require('func.php'); 
---------------------------
<body>
    <!-- Inclou el menú -->
    <?php include_once('mes_taules_lang.php'); ?>
    <?php include_once('menu.php'); ?>

Estructura del projecte Polidic
<?php
/*
Estructura
/project/
│
├── index.php
|   ├── <body>:mes_taules_lang.php(include)
|   ├── <body> include'menu.php' ( necesita
|        la variable  $mes_taules_lang ->
|        a  $_GET[lang])|   
|  
├──inicia_variables_sessio.php
├── 
├── func.php
├── styles.css
├── images/
│
├── js/
│   ├── scripts.js !-- Gestiona el menú sandwich $_GET[lang];
│   ├── jquery.min.js
│   └── tiny.js
├── admin.php
|   └── ($_SESSION['admin']=1 retornar a admin)
├──Inicia.php
    ├──//reseteja SESSION i redirigeix a index.php
    ├──header('Location: /polidic/');
    └──($_SESSION['admin']=1 retornar a admin)

Busquedes d’Auto-compleció

“suggeriments automàtics” o “auto-compleció”. Aquest mètode es pot implementar en cercadors de diccionaris i altres aplicacions web per a oferir suggeriments mentre l’usuari escriu.

Per crear aquest efecte, pots utilitzar JavaScript amb una base de dades que contingui les paraules i les seves definicions. Aquí tens un exemple bàsic utilitzant JavaScript i HTML:

<!DOCTYPE html>
<html>
<head>
  <title>Auto-compleció</title>
  <style>
    .suggestions {
      border: 1px solid #ccc;
      max-height: 150px;
      overflow-y: auto;
      position: absolute;
      background-color: white;
    }
    .suggestion-item {
      padding: 10px;
      cursor: pointer;
    }
    .suggestion-item:hover {
      background-color: #ddd;
    }
  </style>
</head>
<body>
  <input type="text" id="search" placeholder="Escriu per cercar..." oninput="showSuggestions(this.value)">
  <div id="suggestions" class="suggestions"></div>

  <script>
    const dictionary = ['calamar', 'calamarsa', 'calamarsada', 'calamarsejar', 'calamar', 'calamars'] // Afegeix més paraules aquí
    
    function showSuggestions(query) {
      const suggestionsContainer = document.getElementById('suggestions');
      suggestionsContainer.innerHTML = ''; // Neteja les suggeriments anteriors
      if (query.length > 0) {
        const filteredWords = dictionary.filter(word => word.startsWith(query));
        filteredWords.forEach(word => {
          const suggestionItem = document.createElement('div');
          suggestionItem.textContent = word;
          suggestionItem.className = 'suggestion-item';
          suggestionItem.onclick = () => selectSuggestion(word);
          suggestionsContainer.appendChild(suggestionItem);
        });
      }
    }

    function selectSuggestion(word) {
      const searchInput = document.getElementById('search');
      searchInput.value = word;
      document.getElementById('suggestions').innerHTML = ''; // Neteja les suggeriments després de seleccionar una
    }
  </script>
</body>
</html>