/ / Перезапис JControllerForm save () Метод обрізання даних POST не має ефекту - joomla, joomla-extensions, overwrite

Перезапис методу JControllerForm save () для обрізання даних POST без ефекту - joomla, joomla-extensions, overwrite

У мене є компонент, який називається контролером 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");

Можливо, це причина? Це отримання кешованих даних чи щось інше?

Відповіді:

4 для відповіді № 1

Замість того, щоб намагатися отримати значення з $_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);
}

4 для відповіді № 2

Контролер в будь-якому випадку є неправильним місцем для таких речей, або є конкретна причина, за якою ви хочете це зробити в контролері? Краще подивіться на prepareTable функція в моделі. Там у вас вже є об’єкт таблиці із властивостями для збереження, і ви можете дезінфікувати їх перед збереженням.

Додаткова інформація: Якщо продовжити JControllerForm, ви можете вказати

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

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

За замовчуванням $view_item буде дорівнювати контексту. $view_list намагається вгадати плюралізовану версію $view_item. Зазвичай, додаючи s до кінця.