web-dev-qa-db-fra.com

Problèmes avec la liste de sélection de champs de formulaire personnalisés

J'essaie de modifier le code créé par Component Creator. La modification que j'essaie de faire consiste à obtenir la liste de sélection pour enregistrer le numéro de pièce au lieu de la valeur d'index.

Il y a deux remarques importantes: 1. Le créateur de composant suppose que toutes les tables se trouvent dans la même base de données Joomla et qu'il a donc créé le code en conséquence. 2. J'ai créé un type de champ personnalisé qui se connecte à l'autre base de données et sélectionne les données de la table.

Tout semble fonctionner correctement et le formulaire enregistre les données dans la table lors de la soumission. La liste déroulante affiche bien mes numéros de pièces et me permet de sélectionner celle que je veux. Le problème est que lorsque je visualise les données dans phpMyAdmin, le champ de la table partno a un entier qui semble être l'index du tableau derrière la liste (et non l'ID d'enregistrement dans la table).

Je peux voir dans le fichier ./site/views/[nomform//mpt/default.php où le champ est rendu. Je ne suis pas sûr de savoir comment modifier cela pour obtenir le partno réel au lieu de l'index à sauvegarder.

<?php echo $this->form->renderField('partno'); ?>

<?php foreach((array)$this->item->partno as $value): ?>
    <?php var_dump($value); ?>
    <?php if(!is_array($value)): ?>
        <input type="hidden" class="partno" name="jform[partnohidden][<?php echo $value; ?>]" value="<?php echo $value; ?>" />';
    <?php endif; ?>
<?php endforeach; ?>

Toute aide serait grandement appréciée!

Information additionnelle:

hTML généré pour liste

<div class="control-group">
  <div class="control-label">
    <label id="jform_partno-lbl" for="jform_partno">
    Partno</label>
  </div>
  <div class="controls">
    <select id="jform_partno" name="jform[partno]" style="display: none;">
     <option value="0">              for [1/2 FPT SCH</option>
     <option value="1">              for [3/4 FPT SCH</option>
     <option value="2">         -&gt; [GALLOUP3140777 3/</option>
     <option value="3">         -&gt; [GALLOUP3206216 1/</option>
     <option value="4">       (B) DYN-AVI DA1246023-1</option>
     <option value="5">       and (C) DYN-AVI DA12460</option>
     <option value="6">   1. NO REDUCTION IN TUBING D</option>
     <option value="7">   2. NO BURRS ALLOWED ON THE </option>
     <option value="8">   3. HOLES MAY BE DRILLED PRI</option>
     <option value="9">   4. HOLES ARE 90 Degrees +/-</option>
     <option value="10">   5. HELIX PITCH IS 163 +/- 2</option>
    </select>
    <div class="chzn-container chzn-container-single" style="width: 220px;" title="" id="jform_partno_chzn">
      <a class="chzn-single">
        <span>              for [1/2 FPT SCH</span>
        <div><b></b></div>
      </a>
      <div class="chzn-drop">
        <div class="chzn-search">
           <input autocomplete="off" type="text">
        </div>
        <ul class="chzn-results"></ul>
      </div>
    </div>
  </div>
</div>

Voici deux fichiers supplémentaires qui ont été demandés:

./site/models/forms/taskform.xml

<form>
  <fieldset>
    <field name="id" type="text" readonly="true" class="readonly" default="0" description="JGLOBAL_FIELD_ID_DESC"/>
    <field name="task" required="true" message="Please enter a task." label="COM_TODO_FORM_LBL_TASK_TASK" description="COM_TODO_FORM_DESC_TASK_TASK" hint="COM_TODO_FORM_LBL_TASK_TASK"/>
    <field name="description" cols="80" rows="6" filter="safehtml" type="textarea" label="COM_TODO_FORM_LBL_TASK_DESCRIPTION" description="COM_TODO_FORM_DESC_TASK_DESCRIPTION" hint="COM_TODO_FORM_LBL_TASK_DESCRIPTION"/>
    <field name="due_date" class="inputbox" format="%d-%m-%Y" timeformat="12" filter="server_utc" minyear="-1" showtime="false" singleheader="true" todaybutton="false" weeknumbers="false" filltable="false" type="calendar" label="COM_TODO_FORM_LBL_TASK_DUE_DATE" description="COM_TODO_FORM_DESC_TASK_DUE_DATE" hint="COM_TODO_FORM_LBL_TASK_DUE_DATE"/>
    <field name="task_status" type="foreignkey" label="COM_TODO_FORM_LBL_TASK_TASK_STATUS" description="COM_TODO_FORM_DESC_TASK_TASK_STATUS" class="inputbox" input_type="list" table="#__todo_status" key_field="id" value_field="task_status" required="true" default=""/>
    <field name="partno" key_field="partno" value_field="partno" type="e2part" label="COM_TODO_FORM_LBL_TASK_PARTNO" description="COM_TODO_FORM_DESC_TASK_PARTNO" hint="COM_TODO_FORM_LBL_TASK_PARTNO"/>
    <field name="assigned_to" query="SELECT * FROM #__contact_details WHERE published = 1 ORDER BY name" key_field="id" value_field="name" type="sql" label="COM_TODO_FORM_LBL_TASK_ASSIGNED_TO" description="COM_TODO_FORM_DESC_TASK_ASSIGNED_TO" hint="COM_TODO_FORM_LBL_TASK_ASSIGNED_TO"/>
    <field name="created" type="timecreated" label="COM_TODO_FORM_LBL_TASK_CREATED" description="COM_TODO_FORM_DESC_TASK_CREATED" hidden="true" hint="COM_TODO_FORM_LBL_TASK_CREATED"/>
    <field name="modified" type="timecreated" label="COM_TODO_FORM_LBL_TASK_MODIFIED" description="COM_TODO_FORM_DESC_TASK_MODIFIED" hidden="true" hint="COM_TODO_FORM_LBL_TASK_MODIFIED"/>
    <field name="version_note" type="text" label="JGLOBAL_FIELD_VERSItoON_NOTE_LABEL" description="JGLOBAL_FIELD_VERSION_NOTE_DESC" class="inputbox" size="45" labelclass="control-label"/>
  </fieldset>
  <fieldset name="accesscontrol">
    <field name="asset_id" type="hidden" filter="unset"/>
    <field name="rules" type="rules" label="JFIELD_RULES_LABEL" translate_label="false" filter="rules" validate="rules" class="inputbox" component="com_todo" section="task"/>
  </fieldset>
</form>

./site/models/fields/e2part.php

<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');

JFormHelper::loadFieldClass('list');

class JFormFieldE2Part extends JFormFieldList {

    protected $type = 'e2part';

    public function getOptions() {
                $app = JFactory::getApplication();
                $partno = $app->input->get('partno'); // partno is the dynamic value which is being used in the view

                $servername = "localhost";
                $username = "someuser";
                $password="somepassword";
                $dbname = "bmp";
                $table = "estim";

                $db= new mysqli($servername, $username, $password, $dbname);

                if ($db->connect_error){
                    die("E2 Part (Estim) Connection failed: " . $conn_error);
                }

                $query  = "SELECT a.PartNo FROM " . $table . " AS a ";
                $query .= "WHERE a.PartNo > '' ";
                $query .= "ORDER BY PartNo";
                $result = mysqli_query($db, $query);


                if($result){
                    //output parts
                    while($row = mysqli_fetch_assoc($result)) { 
                        $parts[] = $row["PartNo"];
                    }
                }else {
                    die("E2 Part (Estim) Query failed: ");
                }


                // Merge any additional options in the XML definition.
                $options = array_merge(parent::getOptions(), $parts);
                return $options;
    }
}
2
maleman

raVan96 est génial, vous devriez avoir un champ SQL ou un champ Liste. Mais ce que vous avez est un champ SQL que vous avez remplacé par un champ Liste personnalisé. Il y a deux problèmes principaux.

Les attributs du champ formulaire xml

key_field et value_field s'appliquent uniquement aux champs SQL, pas à la liste des champs. Par conséquent, ils ne font rien ici et vous devriez les supprimer.

<field name="partno" key_field="partno" value_field="partno" type="e2part" label="COM_TODO_FORM_LBL_TASK_PARTNO" description="COM_TODO_FORM_DESC_TASK_PARTNO" hint="COM_TODO_FORM_LBL_TASK_PARTNO"/>

Le champ de liste personnalisé

Vous avez copié l'exemple de la documentation, mais cet exemple n'est pas très générique et fait des choses qui ne vous concernent pas. J'ai mis des commentaires en ligne et supprimé les éléments inutiles.

<?php
defined('_JEXEC') or die('Restricted access');

JFormHelper::loadFieldClass('list');

class JFormFieldE2Part extends JFormFieldList {

    protected $type = 'e2part';

    public function getOptions() {
        $servername = "localhost";
        $username = "someuser";
        $password="somepassword";
        $dbname = "bmp";
        $table = "estim";

        $db= new mysqli($servername, $username, $password, $dbname);

        if ($db->connect_error){
            die("E2 Part (Estim) Connection failed: " . $conn_error);
        }

        // Get the two columns for the value and text of the option,
        // but in your case it's just one column!
        $query  = "SELECT PartNo FROM " . $table;
        $query .= " WHERE PartNo > ''";
        $query .= " ORDER BY PartNo";
        $result = mysqli_query($db, $query);

        // Build the options as $options[value] = text
        $parts = [];
        if($result){
            while($row = mysqli_fetch_assoc($result)) { 
                $parts[$row["PartNo"]] = $row["PartNo"];
            }
        }else {
            die("E2 Part (Estim) Query failed: ");
        }
        return $parts;
    }
}
3
jamesgarrett

Vous pouvez vérifier le champ d'où il vient,

<? php echo $this->form->renderField('partno'); ?>

Cette ligne rendant votre champ 'partno', en regardant dans le HTML généré, il semble que ce soit jform. Vous devez donc aller à "site/components/[nom_composant] /models/forms/formsname # fichier.xml", vérifiez le nom du champ comme " partno 'il peut s'agir d'un champ SQL ou d'un champ Liste

  • S'il s'agit d'un champ sql, vérifiez l'attribut 'key_field' et 'value_field'. Il peut donc avoir les propriétés suivantes: key_field = "id", vous devez donc mettre à jour cette ligne pour qu'elle utilise la valeur que vous souhaitez enregistrer lors de l'envoi du formulaire.
3
Sudhir Sapkal