JavaScriptを使用して[追加]ボタンをクリックすると動的テキストボックスを作成するコードを開発しました-
Javascript
function GetDynamicTextBox(value,index) {
return
'<input type="text" name="jform[options][]" id="jform_options_'+index+'" value="">' +
'<input type="button" value="Remove" class="remove btn-danger" />'
}
formname.xml
<field name="options][" type="text" label="Options" multiple="true" description=""></field>
[追加]ボタンをクリックすると、n個のテキストボックスが追加されます。しかし、私はこのフィールドをデータベースに保存する際に問題に直面しています。
データベース
columnname = options, type= text
テキストボックスに入力した値をjson形式で保存したい。このため、コントローラの保存方法をオーバーライドしようとしています-
controllername.php
public function save($key = null, $urlVar = null){
if($_POST['jform']){
$jinput = JFactory::getApplication()->input;
$postData = $jinput->post->get('jform', array(), 'array');
$postData['options']=json_encode(implode(',',$postData['options']));
// Save it back to the $_POST global variable
JRequest::setVar('jform', $postData, 'post');
}
// Finally, save the processed form data
return parent::save('id', $urlVar);
}
ただし、フォームの残りの値はすべて保存されますが、「オプションフィールド」は保存されません。 -注:私が達成しようとしていることを理解するために添付の画像を見ることができます
コンポーネントのモデルでprepareTableを使用してそれを行うことができます。これをチェックしてください例チェックボックスの「カテゴリ」の配列の値を取得し、それらを保存して、implodeを使用してコンマ区切りの値変数を作成します。
もちろん、json_encodeを使用することもできます。
protected function prepareTable($table)
{
// Set the publish date to now
$db = $this->getDbo();
if($table->id==0)
{
$table->created = JFactory::getDate()->toSql();
}
$table->modified = JFactory::getDate()->toSql();
$jinput = JFactory::getApplication()->input;
$categories = $jinput->get('categories',null,'ARRAY');
if($categories!=null)
$table->categories = implode(",",$categories);
else
$table->categories ='';
}
オプションをデータベースに配列jsonとして保存する必要があるため、この行を変更します
$postData['options']=json_encode(implode(',',$postData['options']));
に
$postData['options']=json_encode($postData['options']);
次に、モデルのloadFormDataメソッドで、配列をデコードするためにjson_decodeを使用する必要があります
繰り返しフィールド タイプをフォームに使用することもできます。フィールドの名前をparamsに設定すると、すべてのジョブがjoomlaによって処理されます