アプリケーションでCRUDにJTableを使用しています。データベースにデータを保存するメソッドをモデルに作成しました
「$ custom_data」変数に示されているように、「created」と「created_by」のカスタム入力を追加して、データベースに保存する必要があります。 $ form_dataが正常に保存されていることに注意してください。
public function create() {
$table = $this->getTable();
$jinput = JFactory::getApplication()->input->post;
$form_data = $jinput->get('jform', array(), 'array');
$custom_data = array(
'created' => JFactory::getDate()->toSql(),
'created_by' => JFactory::getUser()->id
);
if (!$table->save($form_data)) {
JError::raiseNotice(500, $table->getError());
return FALSE;
}
return $form_data;
}
あなたは別の方法を求めました、ここにそれは:-)です
そのような操作のIMHOに最適な場所は、JTableクラスのbindメソッドです。以下は、JTableクラスでこのメソッドをオーバーライドする方法の例です。
public function bind($src, $ignore = array())
{
// Call parent's bind method
if (parent::bind($src, $ignore))
{
// Do the following only when it's a new item ($this->id is 0 then)
if (!$this->id)
{
$this->created = JFactory::getDate()->toSql();
$this->created_by = JFactory::getUser()->id;
}
}
return true;
}
これで、これらの行は不要になります。
$custom_data = array(
'created' => JFactory::getDate()->toSql(),
'created_by' => JFactory::getUser()->id
);
$data += $custom_data;
モデルで$ table-> save()を呼び出しており、このメソッドはbind()メソッドを自動的に呼び出します。
私はこの問題を次のように解決することができました:
$ data = $ form_data + $ custom_data;を追加しました。他の推奨される方法はかなりあります。
public function create() {
$table = $this->getTable();
$jinput = JFactory::getApplication()->input->post;
$data = $jinput->get('jform', array(), 'array');
$custom_data = array(
'created' => JFactory::getDate()->toSql(),
'created_by' => JFactory::getUser()->id
);
$data += $custom_data;
try {
$table->save($data);
} catch (Exception $ex) {
if ($ex->getCode() == '404') {
throw new Exception($e->getMessage(), 404);
} else {
JFactory::getApplication()->enqueueMessage(JText::_('COM_HELPDESK_ERROR_OCCURRED'), 'error');
}
}
$id = array(
'id' => $table->id
);
$data += $id;
return $data;
}