你现在的位置:首页 > PHP网站建设知识库 > Joomla > 正文

Joomla的List form field type从数据库取得选项

最新做joomla后台功能遇到一个这样的问题,记录如下:
在Joomla标准的field type中有一个list类别,也就是html中的select元素。

标准的用法是这样

<field name="mylistvalue" type="list" default="" label="Select an option" description="">
  <option value="0">Option 1</option>
  <option value="1">Option 2</option>
</field>
但是这里就存在一个问题,这些option都是固定值,假如我需要从数据库取得呢,比如产品的类别,这时我们就不能用它默认的这个了,那又想以xml配置的方式来显示表单该怎么办呢?
这时我想到能不能list类型的我自己生成表单呢?于是试了下,在xml中去掉这个field,然后在view.html.php中通过model取到数据,$this->typeList = $model->getTypeList();

然后在default.php中

<div>Type</div>
  <div>
     <select name="jform[type]">
        <?php
            foreach($this->typeList as $i=>$row){
                echo "<option value='".$row['id']."'>".$row['type']."</option>";
            }
        ?>
     </select>
  </div>
  <?php foreach($this->form->getFieldset() as $field): ?>    
     <div><?php echo $field->label;echo $field->input; ?></div>
  <?php }endforeach; ?>

这样确实在页面中显示了数据库中的数据,但出现了一个问题,保存的时候这个select的值保存不到

通过查看firebug的post数据,确认post了jform[type]的值到后台;看来只能是后台入库时候的问题了,想到刚才在models\forms\product.xml中去掉了type的field定义,是不是跟这个有关呢?于是恢复之前的代码,可以入库保存。看来joomla本身数据的保存是通过读取xml配置文件来对应数据库字段的

既然是这样,那也好办,我仍然给它写在xml中,

<field name="type" type="text"
            label="COM_FOLD_PRODUCT_TYPE_LABEL"
            description="COM_FOLD_PRODUCT_TYPE_DESC"
            size="40"
            class="input"
            required="true"
        />

实际用不到这个field定义,就没用list类型,可以简单点。然后在布局文件default.php中加上一个判断,如果是type,就用自定义的select表单代替

<?php foreach($this->form->getFieldset() as $field): ?>
                <?php if($field->name == "jform[type]"){ ?>
                    <div style="margin-bottom:5px;">Type</div>
                    <div>
                        <select id="jform_type" class="input" name="jform[type]" aria-invalid="true">
                        <?php
                            foreach($this->typeList as $i=>$row){
                                echo "<option value='".$row['id']."'>".$row['type']."</option>";
                            }
                        ?>
                        </select>
                    </div>
                <?php }else{ ?>
                    <div><?php echo $field->label;echo $field->input; ?></div>
            <?php }endforeach; ?>

经过测试,正常入库,至此问题解决!