Как вернуться к редактированию формы? - PullRequest
2 голосов
/ 11 января 2012

У меня есть этот код в моем контроллере (admin):

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 ]

5 голосов
/ 11 января 2012

В вашем контроллере вы можете:

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 "в вашей модели.Где загрузить эти данные, будет зависеть от того, как вы реализуете свой компонент.Если вы используете форму API Joomla, то вы можете добавить следующий метод к вашей модели.

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;
}

РЕДАКТИРОВАТЬ:

НО, обратите внимание, что API Joomla уже может сделать все это для васесли ваш контроллер наследует от «JControllerForm», вам не нужно переписывать метод сохранения.Лучший способ создать ваш компонент - скопировать то, что находится в основных компонентах Joomla, например, com_content

0 голосов
/ 26 мая 2015

Не рекомендуется переписывать save или любой другой метод.

Если вы действительно хотите что-то переопределить и хотите обновить что-либо до или после сохранения, вам следует использовать JTable file.

Например:

/**
 * 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, и это рекомендуемый способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...