如何返回编辑表格?

时间:2012-01-10 20:25:44

标签: joomla

我的控制器(管理员)中有这段代码:

function save(){
        $model = $this->getModel('mymodel');

        if ($model->store($post)) {
            $msg = JText::_( 'Yes!' );
        } else {
            $msg = JText::_( 'Error :(' );
        }
        $link = 'index.php?option=com_mycomponent&view=myview';
        $this->setRedirect($link, $msg);
}

在模特中我有:

function store(){
        $row =& $this->getTable();

        $data = JRequest::get('post');
        if(strlen($data['fl'])!=0){
            return false;
        }

        [...]

这是有效的 - 生成错误消息,但它返回到项目列表视图。我想留在编辑视图中输入数据。怎么做?

2 个答案:

答案 0 :(得分:5)

在您的控制器中,您可以:

if ($model->store($post)) {
   $msg = JText::_( 'Yes!' );
} else {
    // stores the data in your session
    $app->setUserState('com_mycomponent.edit.mymodel.data', $validData);

    // Redirect to the edit view
    $msg = JText::_( 'Error :(' );
    $this->setError('Save failed', $model->getError()));
    $this->setMessage($this->getError(), 'error');
    $this->setRedirect(JRoute::_('index.php?option=com_mycomponent&view=myview&id=XX'), false));
}

然后,您将需要从会话中加载数据,如:

JFactory::getApplication()->getUserState('com_mycomponent.edit.mymodel.data', array());

通常这会加载到模型中的方法“loadFormData”中。加载数据的位置取决于您如何实现组件。如果您使用Joomla的表单api,则可以将以下方法添加到模型中。

protected function loadFormData()
{
    // Check the session for previously entered form data.
    $data = JFactory::getApplication()->getUserState('com_mycomponent.edit.mymodel.data', array());

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

    return $data;
}

编辑:

但请注意,如果你的控制器继承自“JControllerForm”,Joomla的API已经可以为你完成所有这些,你不需要重写save方法。创建组件的最佳方法是复制Joomla核心组件中的内容,例如com_content

答案 1 :(得分:0)

不建议重写save或任何方法。

如果您真的想覆盖某些内容并希望在保存之前或之后更新某些内容,则应使用JTable文件。

例如:

/**
 * Example table
 */
class HelloworldTableExample extends JTable
{
    /**
     * Method to store a node in the database table.
     *
     * @param   boolean  $updateNulls  True to update fields even if they are null.
     *
     * @return  boolean  True on success.
     */
    public function store($updateNulls = false)
    {
        // This change is before save
        $this->name = str_replace(' ', '_', $this->name);

        if (!parent::store($updateNulls))
        {
            return false;
        }

        // This function will be called after saving table
        AnotherClass::functionIsCallingAfterSaving();
    }
}

您可以使用JTable类扩展任何方法,这是推荐的方法。