Перезапись метода JControllerForm save() для обрезки данных POST не имеет никакого эффекта

У меня есть компонент с контроллером MyproductControllerGeneralsetting, который расширяет JControllerForm. Внутри MyproductControllerGeneralsetting я перезаписываю метод save из родительского класса, чтобы изменить $_POST данные, а затем метод перезаписи вызывает метод save родительского класса для фактического сохранения.

Вот перезаписанный метод в MyproductControllerGeneralsetting:

/**
 * We overwrite the saved form data and trim them to avoid spaces
 */
public function save($key = null, $urlVar = null){
    if($_POST['jform']){
        foreach($_POST['jform'] as $key=>&$value){
            $value = trim($value);
        }
    }

    // Finally, save the processed form data (calls JControllerForm-save())
    parent::save('id', $urlVar);
}

Дело в том, что, несмотря на то, что я обрезал каждое поле данных POST в этом методе перезаписи, если у меня есть отправленные значения, такие как «значение» (обратите внимание на пробел в конце), они не обрезаются.

Я проверил метод save класса JControllerForm, и, похоже, он получает данные из POST здесь:

$data  = $this->input->post->get('jform', array(), 'array');

Может в этом причина? Это получение кэшированных данных или что-то в этом роде?


person Dzhuneyt    schedule 29.04.2013    source источник


Ответы (2)


Вместо того, чтобы пытаться получить значения из $_POST напрямую, попробуйте получить и установить данные так же, как это делает родительский класс — используя внутренний указатель на (общий) экземпляр класса JInput.

Вот модифицированный, работающий, перезаписанный метод save:

/**
 * We overwrite the saved form data and trim them to avoid spaces
 */
public function save($key = null, $urlVar = null){
    if($_POST['jform']){

        // Get the original POST data
        $original = JRequest::getVar('jform', array(), 'post', 'array');

        // Trim each of the fields
        foreach($original as $key=>$value){
            $original[$key] = trim($value);
        }

        // Save it back to the $_POST global variable
        JRequest::setVar('jform', $postData, 'post');
    }

    // Finally, save the processed form data
    return parent::save('id', $urlVar);
}
person Dzhuneyt    schedule 29.04.2013
comment
Я думаю, что либо $postData должно быть $original, либо $original[$key] должно быть $postData[$key] - person jost21; 30.09.2018

Контроллер в любом случае не подходит для таких вещей, или есть конкретная причина, по которой вы хотите сделать это в контроллере? Лучше посмотрите на функцию prepareTable в модели. Там у вас уже есть объект таблицы со свойствами для сохранения, и вы можете очистить их перед сохранением.

Дополнительная информация: если вы расширяете JControllerForm, вы можете указать

/**
 * @since   1.6
 */
protected $view_item = 'item';

/**
 * @since   1.6
 */
protected $view_list = 'items';

По умолчанию $view_item будет соответствовать контексту. $view_list пытается угадать множественную версию $view_item. Обычно путем добавления s в конец.

person Bakual    schedule 29.04.2013
comment
Хорошо, но я также делаю перенаправление на основе того, действительны ли данные POST или нет. Я предполагаю, что перенаправление из модели не является хорошей практикой MVC? - person Dzhuneyt; 02.05.2013
comment
Я думаю, что если форму не удастся сохранить, контроллер по умолчанию перенаправит обратно в форму с сообщением об ошибке. Вот почему вы можете указать элемент и представление списка в контроллере. - person Bakual; 02.05.2013
comment
Вот почему вы можете указать элемент и представление списка в контроллере. Можно поподробнее об этой части? - person Dzhuneyt; 02.05.2013
comment
Добавил немного информации в ответ - person Bakual; 02.05.2013
comment
Меня это тоже зацепило, но вместо того, чтобы автоматически ставить во множественное число букву s, он угадывал, что мое представление верхнего уровня — это awardsentries, а не awardsentrys. Что технически правильно, но нигде, где я мог бы найти, это упоминается в соглашении об именах классов. Потребовалось много догадок, чтобы привести меня сюда. - person Martyn Shutt; 25.04.2015