Ошибка в model.php

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 5 июня 2016 в 00:58
Доброго времени суток. Не сильно пока разобрался с синтаксисом движка но всё же. Писал формы и экшины для админки компонента и столкнулся с такой бедой.
вот такой экшн
  1. $user = $this->model->get_user($id);
  2. $form = $this->getForm('edituser');
  3. $is_submitted = $this->request->has('submit');
  4. if ($is_submitted)
  5. {
  6. $user_info = $form->parse($this->request, $is_submitted);
  7. $errors = $form->validate($this, $user);
  8. if (!$errors){
  9. $this->model->updateUser($user_info[id], $user_info);
  10. $this->redirectToAction('users');
  11. }
  12. if ($errors){
  13. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  14. }
  15.  
  16. }
  17. $template = cmsTemplate::getInstance();
  18. return $template->render('backend/form_edituser', array(
  19. 'form' => $form,
  20. 'errors' => $errors,
  21. 'user' => $user
  22. ));
и такая модель
  1. public function check_user($user_id)
  2. {
  3. return $this->getItemByField('spusers', 'spec_id', $user_id);
  4. }
  5. public function updateUser($id, $user_info)
  6. {
  7. $this->filterEqual('id', $id);
  8. return $this->updateFiltered('spusers', $user_info);
  9. }
Вроде всё хорошо на первый взгляд, компонент запускается, принимает параметры, получает данные с базы, но когда пытаюсь обновить инфу в базе, то начинается непонятное поведение. Меняется только одна ячейка в бд и только юзера с id = 1. Все остальные ячейки либо обнуляются, либо просто не сохраняются. использовал и
  1. return $this->update('spusers', $id, $user_info);
и
  1. $this->filterEqual('id', $id);
  2. return $this->updateFiltered('spusers', $user_info);
Но беда одна и та же. Подскажите как исправить? С меня +++
#2 5 июня 2016 в 01:04
  1. $errors = $form->validate($this, $user);
В валидацию передаете $user хотя от формы получаете $user_info
#3 5 июня 2016 в 01:10


  1. $errors = $form->validate($this, $user);
В валидацию передаете $user хотя от формы получаете $user_info

Evanescence

Исправил, но проблема осталась прежней.
#4 5 июня 2016 в 01:42
Попробуйте так
  1. if (!$errors){
  2. $this->model->update('spusers', $id, $user_info);
  3. $this->redirectToAction('users');
  4. }
#5 5 июня 2016 в 05:23
Вывод сделайте массива который передаете в базу, сразу поймете в чем ошибка. Переменная пользователя откуда берется? случаем не с корня? обычно у админа id=1
#6 5 июня 2016 в 14:13


Вывод сделайте массива который передаете в базу, сразу поймете в чем ошибка. Переменная пользователя откуда берется? случаем не с корня? обычно у админа id=1

kirkr

проверил массив, почему-то весь массив обнуляется кроме одной переменной в массиве, а ключевые поля с основной информацией и идентификаторами берутся с юзера с id 1. Получаю значение id при старте действия из аргумента функции.
  1. public function run($id = 1)
за счёт этого параметра получаю инфу о пользователе, действие всё получает и выводит в форме для редактирования, то есть данные получены, а при обратном вызове действия из формы, действие почему-то не получает настоящий массив. Как исправить ситуацию?
вот массив который я получаю обратно с пометками какие данные не верные в результате:
Array ( [id] => 1(id не верно, всегда возвращается id 1 не важно какого userа я редактирую) [spec_id] => 35(spec_id не верно, всегда возвращается id 35 не важно какого userа я редактирую) [name] => Михаил(то же самое всегда берётся с поля одного и того же юзера) [sername] => Михайлов(то же самое всегда берётся с поля одного и того же юзера) [type_user] => 0(устанавливается, но учитывая что id всегда один, то устанавливается всегда одному и тому же. [balance] => 0(Не верно, всегда получает 0 даже если что-то указать другое) [expiration] => 0000-00-00 00:00:00(неверно, всегда получает ноли даже если указать что-то другое )

Названия элементов массива полностью соответствуют названиям полей с бд, но почему-то вот такое искажение получает массив).
Подскажите в чём может быть проблема искажения, потому что я её в упор не вижу.
#7 5 июня 2016 в 14:26

public function run($id = 1)

Михаил
Вам надо получать так
  1. public function run($id = false)
Иначе у вас всегда будет $id = 1. И тут не важно какого пользователя вы редактируете.
Ещё если планируете обновлять только одну строчку в таблице БД, то лучше использовать
  1. $this->model->update('spusers', $id, $user_info);
Строка
  1. $this->updateFiltered('spusers', $user_info);
это для обновления нескольких строк.
#8 5 июня 2016 в 14:44


public function run($id = 1)

Михаил
Вам надо получать так
  1. public function run($id = false)
Иначе у вас всегда будет $id = 1. И тут не важно какого пользователя вы редактируете.
Ещё если планируете обновлять только одну строчку в таблице БД, то лучше использовать
  1. $this->model->update('spusers', $id, $user_info);
Строка
  1. $this->updateFiltered('spusers', $user_info);
это для обновления нескольких строк.

Loadырь

Пробовал как вы писали, не помогло, результат тот же. Рискнул сделать получение данных стандартным методом php, а именно заменил строку:
  1. $user_info = $form->parse($this->request, $is_submitted);
вот такими строками:
  1. $user_info = $_POST; //получаем весь массив POST
  2. array_splice($user_info, 0, 1); //Вырезаем первый элемент массива, так как он имеет не нужные в нашем деле данные([csrf_token] )
Дальше оставил код без изменений и всё начало работать.
То есть проблема заключается в строке:
  1. $user_info = $form->parse($this->request, $is_submitted);
она не срабатывает так как должна работать.
У кого есть идеи почему?
#9 5 июня 2016 в 15:24

public function run($id = false)

Михаил
У вас случайно в $id не массив передаётся?
пропишите после этой строки dump чтобы стало так
  1. public function run($id = false){
  2. dump($id);
и посмотрите что передаётся в этот экшн.
#10 5 июня 2016 в 15:29


public function run($id = false)

Михаил
У вас случайно в $id не массив передаётся?
пропишите после этой строки dump чтобы стало так
  1. public function run($id = false){
  2. dump($id);
и посмотрите что передаётся в этот экшн.

Loadырь

нет, не массив, с дампа выдаётся цифра(id)
#11 5 июня 2016 в 16:13
Михаил, таким же образом проверяйте все переменные, смотрите где и что прилетает в экшен и в какой момент данные теряются.
также пропишите после
  1. if ($is_submitted){
такой код
  1. dump(cmsCore::getInstance()->request->getAll());
Он выведет данные всех полей формы.
#12 5 июня 2016 в 16:19

  1. dump(cmsCore::getInstance()->request->getAll());

Loadырь

выдало искажённые данные. данные искажены таким образом как я описывал выше.
Все остальные переменные и массивы уже давно проверил и они имеют верные значения.
#13 5 июня 2016 в 16:20

выдало искажённые данные

Михаил
Значит ваша форма их вам шлёт такими.
#14 5 июня 2016 в 16:25


выдало искажённые данные

Михаил
Значит ваша форма их вам шлёт такими.

Loadырь

Тогда я вообще ничего не понимаю.
Почему тогда получение массива $_POST возвращает верные данные?
Пока что буду использовать свой способ

заменил строку:
Код PHP:
$user_info = $form->parse($this->request, $is_submitted);
вот такими строками:
Код PHP:
$user_info = $_POST; //получаем весь массив POST
array_splice($user_info, 0, 1); //Вырезаем первый элемент массива, так как он имеет не нужные в нашем деле данные([csrf_token] )
Дальше оставил код без изменений и всё начало работать.

Михаил

А если уже найду причину или кто подскажет, то использую стандартные функции движка для получения данных из формы.
#15 5 июня 2016 в 16:35

Вырезаем первый элемент массива, так как он имеет не нужные в нашем деле данные([csrf_token]

Михаил
Странная у вас форма. csrf_token — это одно из полей формы. Вероятно, у вас сама форма оформлена в файле шаблона. Либо, у вас несколько форм на странице. Хотя, гадать тут можно бесконечно.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.