3

シンプルなコンポーネントを作成します。チェックボックスをオンにして新しいレコードを保存すると、正常に保存されます。戻って以前にチェックした項目のチェックを外すと、チェック済みに戻ります。隠しフィールドと関係があると思い、手動で入れて遊んだのですが、それでも直らなかったので取り出しました。

私がいる場所は次のとおりです。xmlスニペット:

<fieldset name="checks">
  <field name="checkbox1"
    type="checkbox"
    label="First Checkbox"
    value="1"
    filter="intval"         
  /> 

   <field name="checkbox2"
    type="checkbox"
    label="Second Checkbox"
    value="1"
    filter="intval"         
  /> 

 ...

</fieldset>

edit.phpファイル:

<div class="width-45 fltlft">
  <fieldset class="adminform">
    <legend>Checkboxes</legend>
    <ul class="adminformlist">
      <?php foreach ($this->form->getFieldset('checks') as $field): ?>
        <li>
          <?php echo $field->label; ?>
          <?php echo $field->input; ?>
        </li>
      <?php endforeach ?>
    </ul>
  </fieldset>
</div>

また、form.tokenの前の最後にこれを追加しました:

<input type="hidden" name="task" id="task" value="completion.edit" />

xmlでvalue="1"を削除しようとしましたが、チェックがまったく保存されないという逆の問題が発生しました。

何か案は?

ありがとう!

=============================

編集:

モデル:

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

jimport('joomla.application.component.modeladmin');

class AssessModelCompletion extends JModelAdmin
{
//tells it what kind of record and the prefix

    public function getTable($type = 'Completion', $prefix = 'AssessTable', $config = array())
    {
        return JTable::getInstance($type, $prefix, $config);
    }

    //Load the data into the edit form
    protected function loadFormData()
    {
        $data = JFactory::getApplication()->getUserState('com_assess.edit.completion.data', array()); //first try to get the data from the session, not db

        if (empty($data)) {
            $data = $this->getItem(); //this gets the data
        }

        return $data;

    }

    //Stores data in a session in case a field is missed
    public function getForm($data = array(), $loadData = true)
    {
        $form = $this->loadForm('com_assess.completion', 'completion', array('control' => 'jform', 'load_data' => $loadData));

        return $form;
    }
}

そしてテーブル:

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

class AssessTableCompletion extends JTable
{
    public function __construct(&$db)
    {
        parent::__construct('#__tablename_completions', 'completion_id', $db);
    }
}

======================================

参照: https ://stackoverflow.com/questions/6964333/joomla-1-6-admin-form-processing-grouped-checkboxes-in-form

チュートリアルコードはJoomla2.5では機能しなくなりました

http://docs.joomla.org/Developing_a_Model-View-Controller_%28MVC%29_Component_for_Joomla!1.7_-_Part_09#Adding_a_toolbar

4

5 に答える 5

1

モデル/テーブルコードが表示されていないため、 の目的を誤解している可能性があると思いますJForm-それは純粋にフォームのレンダリングのためです。モデル/テーブルには、多値フィールドに対して返される配列を処理する何かが必要です。

サム・モファットが言ったように:

データをレンダリングするために使用されるフォーム定義と、それらを永続化するために使用されるモデルおよびテーブル構造との間に結合はありません

于 2012-05-23T23:40:31.133 に答える
1

そのため、多くのフィールドがあり、edit.php フィールドでそれらを単純にループして、きれいに保ちたいと考えました。提供されたすべての回答は正しいものでしたが、実装するのは簡単ではありませんでした。すぐに面倒になったり、機能させるのに苦労したり、よりクリーンな方法を見つけられなかったりしました。私はこれをしばらく噛んでいましたが、今日、基本的にフィールドオーバーライドと呼ばれるものに出くわしました。

キー:

標準フォーム フィールド タイプは joomla/libraries/joomla/form/fields/ にあります。そこにカスタム フィールドを保存したり、独自のコードでこのパスを使用したりする必要はありませんが、通常は標準型が良い例です。

コンポーネントに属するカスタム フィールド タイプは通常、administrator/components//models/fields にあります。コードでこのパスまたは別のパスを指定できます

それで、checkbox.php を models/fields にコピーしました。次に、ファイルの最後に向かって、checkbox タグの前に空のフィールドを追加しました。

<input type="hidden" name="'.$this->name.'" id="'.$this->id.'" value="0" /><input type="checkbox" .....

今、チェックボックスが必要なときはいつでも、空のフィールドも書き込まれます。最も効率的なソリューションではないかもしれませんが、実装が簡単で、うまくいけば他の人を助けることができます.

[編集]

注意として、Joomla の更新ごとに、変更があった場合に備えてコアのバージョンを比較する必要があるでしょう。

于 2012-08-29T02:25:54.830 に答える
1

ドキュメントには、チェックボックスを手動で処理する必要はないと記載されていますが、これは正しくありません。

チェックボックスがチェックされていない場合、値は $_POST 配列で送信されないため、値は上書きされず、保存されないため、チェックボックスをオフにすることはできません。これを修正するには、次のように、テーブル bind() 関数でチェックボックスの特別な処理を記述する必要があります。

class YourcomponentTableYourview extends JTable 
{ 
    /** 
     * Constructor 
     * 
     * @param JDatabase A database connector object 
     */ 
    public function __construct(&$db) 
    { 
        parent::__construct('#__your_table_name', 'id', $db); 
    } 

    public function bind($array, $ignore = '') 
    { 
        if (!isset($array['name_of_field'])) 
                    $array['name_of_field'] = 0 ; 

        return parent::bind($array, $ignore); 
    } 
} 
于 2012-07-23T13:55:46.667 に答える