М

Михаил

+78
Репутация
262
Рейтинг
#1 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 5 июня 2016 в 16:45


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

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

Loadырь

форма прописана в отдельном файле формы, form_edituser.php. В шаблоне грузится только одна форма.
Это пишу экшн админки, грешу что такие глюки из-за того что реализация для админки делается.
#2 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 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] )
Дальше оставил код без изменений и всё начало работать.

Михаил

А если уже найду причину или кто подскажет, то использую стандартные функции движка для получения данных из формы.
#3 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 5 июня 2016 в 16:19

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

Loadырь

выдало искажённые данные. данные искажены таким образом как я описывал выше.
Все остальные переменные и массивы уже давно проверил и они имеют верные значения.
#4 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 5 июня 2016 в 15:29


public function run($id = false)

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

Loadырь

нет, не массив, с дампа выдаётся цифра(id)
#5 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 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);
она не срабатывает так как должна работать.
У кого есть идеи почему?
#6 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 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 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 5 июня 2016 в 01:10


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

Evanescence

Исправил, но проблема осталась прежней.
#1 [ЕСТЬ РЕШЕНИЕ] Ошибка в model.php 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);
Но беда одна и та же. Подскажите как исправить? С меня +++
#8 Добавляем капчу в комментарии 22 апреля 2016 в 10:21



Видимо что-то упустил. Для 2-й реализовано по умолчанию?

Pasechnik
Моё решение написано для компонента комментарии во второй ветке ICMS

Михаил
Работа отличная! Но вот будет ли что то для ё ветки? По поводу добавления капчи в объявления тоже отлично!

Заралик

Смотря что необходимо. Может найду время сделаю.
#9 Добавляем капчу в комментарии 20 апреля 2016 в 13:48

Видимо что-то упустил. Для 2-й реализовано по умолчанию?

Pasechnik
Моё решение написано для компонента комментарии во второй ветке ICMS
#10 Добавляем капчу в комментарии 20 апреля 2016 в 12:57


Это как я понял для 2 ветки?

Заралик

Да, для 2 ветки.

Михаил, как реализовать подобное для объявлений? Может подскажете, очень нужно.

Pasechnik

Для 1-й ветки?
#1 Добавляем капчу в комментарии 20 апреля 2016 в 10:52
Здравствуйте! Решил сделать обзорную статья как добавить компонент recapcha в комментарии для гостей в Instant CMS2. Давайте пожалуй начнём.

1. Открываем файл по пути "/system/languages/ru/controllers/comments/comments.php". После шестой строки:
  1. define('LANG_COMMENTS_OPT_IS_GUESTS_HINT', 'Незарегистрированные пользователи смогут добавлять комментарии');
вставляем ещё две строки:
  1. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS', 'Показывать капчу гостям');
  2. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS_HINT', 'Отображать капчу при добавлении комментариея гостем чтобы избежать спама в комментариях');
Дальше открываем файл по пути "/system/languages/en/controllers/comments/comments.php". После шестой строки:
  1. define('LANG_COMMENTS_OPT_IS_GUESTS_HINT', 'Not registered users will be able to add comments');
вставляем две строки:
  1. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS', 'Show CAPTCHA for guests');
  2. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS_HINT', 'Show the captcha by adding a guest commentary to avoid comment spam');
Здесь мы указали текстовые метки для опции включения капчи для гостей в админке компонента.

2. Дальше открываем файл по пути: "/system/controllers/comments/backend/forms/form_options.php". После 16 строки(после блока
  1. new fieldCheckbox('is_guests', array(
  2. 'title' => LANG_COMMENTS_OPT_IS_GUESTS,
  3. 'hint' => LANG_COMMENTS_OPT_IS_GUESTS_HINT,
  4. )),
) вставляем вот такой код:
  1. new fieldCheckbox('capcha_for_guests', array(
  2. 'title' => LANG_COMMENTS_CAPCHA_FOR_GUESTS,
  3. 'hint' => LANG_COMMENTS_CAPCHA_FOR_GUESTS_HINT,
  4. )),
Этим мы добавляем новую опцию в админке комментариев.

3. Теперь идём в файл "/templates/имя_используемого_шаблона(исходный шаблон — default)/controllers/comments/list.tpl.php". После шестой строки:
  1. <?php $is_karma_allowed = $user->is_logged && !cmsUser::isPermittedLimitHigher('comments', 'karma', $user->karma); ?>
вставляем строки:
  1. <?php $captcha_for_guests = cmsEventsManager::hook('captcha_html'); ?>
  2. <?php $enable_capcha = !empty($this->controller->options['capcha_for_guests']); ?>
и в этом же файле после 98-ой строки:
  1. <?php echo $user->is_logged ? html_editor('content') : html_textarea('content'); ?>
вставляем код:
  1. <?php if (!$user->is_logged && $enable_capcha)
  2. {
  3. echo $captcha_for_guests;
  4. } ?>
Здесь мы прописываем что если выбрана опция "Показывать гостям капчу" то для всех гостей при добавлении показывать капчу.

4. Теперь открываем файл "/system/controllers/comments/actions/submit.php". В этом файле сразу после 136-ой строки (после блока кода:
  1. $comment = array(
  2. 'user_id' => $user->id,
  3. 'parent_id' => $parent_id,
  4. 'target_controller' => $target_controller,
  5. 'target_subject' => $target_subject,
  6. 'target_id' => $target_id,
  7. 'content' => $content,
  8. 'content_html' => $content_html,
  9. 'author_url' => $user->ip
  10. );
Вставляем вот такой код:
  1. if (!$user->is_logged && $enable_capcha)
  2. {
  3. $is_captcha_for_comments_valid = cmsEventsManager::hook('captcha_validate', $this->request);
  4. if (!$is_captcha_for_comments_valid)
  5. {
  6. $result_capcha_invalid = array(
  7. 'error' => 'capcha_invalid',
  8. 'message' => LANG_CAPTCHA_ERROR
  9. );
  10. $template->renderJSON($result_capcha_invalid);
  11. }
  12. }
Здесь мы смотрим включена ли капча и если включена, то проверяем правильно ли она разгадана, если да, то добавляем комментарий, если нет то выбрасываем сообщение об ошибке.

Теперь смотрим в админеке комментариев в опциях должен появиться параметр "Показывать капчу гостям" и если вы его включите то для всех кто не зарегистрировался при попытке добавить комментарий будет выводиться капча. Демо здесь, recapcha для гостей включена.

Архив с обновлёнными файлами для добавления рекапчи в комментарии. Работает на 2.5.0-2.5.1 с другими версиями не тестился, чтобы установить просто извлекаем всё из архива в корень сайта с заменой предварительно сделав бэкап.
#11 Мобильный сайт | Смена шаблона 19 января 2016 в 23:28


Я у себя делаю так. В файле core/cms.php где то после блока

  1. //проверяем был ли переопределен язык через сессию
  2. if (isset($_SESSION['lang'])) { $inConf->lang = $_SESSION['lang']; }
  3. self::loadLanguage('lang');
вставил такой блок
  1.  
  2. $smartphone = strtolower($_SERVER['HTTP_USER_AGENT']);
  3. if(stripos($smartphone,'android') !== false) { $inConf->template = 'm';}
  4. if(stripos($smartphone,'iPod') !== false) { $inConf->template = 'm';}
  5. if(stripos($smartphone,'iPhone') !== false) { $inConf->template = 'm';}
  6. if(stripos($smartphone,'iPad') !== false) { $inConf->template = 'm';}
  7. if(stripos($smartphone,'iOS') !== false) { $inConf->template = 'm';}
  8. if(stripos($smartphone,'BlackBerry') !== false) { $inConf->template = 'm';}
  9. if(stripos($smartphone,'Windows Mobile') !== false) { $inConf->template = 'm';}
  10. if(stripos($smartphone,'Opera Mini') !== false) { $inConf->template = 'desktop';}
  11. if(stripos($smartphone,'appz') !== false) { $inConf->template = 'appz';}
  12. if(stripos($smartphone,'appn') !== false) { $inConf->template = 'appn';}
здесь
m — название мобильного шаблона
appn — название шаблона для андроид приложения
desktop — название основного шаблона

Нил™

Интересное решение, надо будет потестить smile
#12 Мобильный сайт | Смена шаблона 19 января 2016 в 22:46


Добрый вечер! Вот появилась такая идея на счёт мобильной версии. Мне это очень как стало необходимо так как приходится сделать мобильную версию сайта очень отличающуюся от дескстопной, вот и появилась такая идея. А что если просто в файл шаблона template.php вставить две версии размещения блоков модулей и всего прочего именно в самом теле() просто отделить их проверкой устройства с которого заходят через условный оператор php если мобильное устройство, то показать размещение блоков мобильной версии, если нет, то шаблон компьютерной версии. Пожалуй это должно решить основную проблему, а всё остальное можно через css поправить. В общем идею подал, если кому-то интересно пишите в тему, я как раз завтра попытаюсь реализовать свою идею и отпишусь о результате если тема ещё актуальна для вас.

Михаил

Не выдержал и написал сразу, дабы проверить. Как я и предлагал, редактировал я template.php который непосредственно находится в папке каждого шаблона Instant CMS.
Чтобы с нуля не писать, php код немного позаимствовал у picaboo с темы "Мобильная версия" и вот что получилось:

  1.  
  2. </head>
  3. <?php
  4. function check_smartphone() {
  5.  
  6. $phone_array = array('iphone', 'android', 'pocket', 'palm', 'windows ce', 'windowsce', 'cellphone', 'opera mobi', 'operamobi', 'ipod', 'small', 'sharp', 'sonyericsson', 'symbian', 'symbos', 'opera mini', 'nokia', 'htc_', 'samsung', 'motorola', 'smartphone', 'blackberry', 'playstation portable', 'tablet browser', 'android');
  7. $agent = strtolower( $_SERVER['HTTP_USER_AGENT'] );
  8.  
  9. foreach ($phone_array as $value) {
  10.  
  11. if ( strpos($agent, $value) !== false ) return true;
  12.  
  13. }
  14.  
  15. return false;
  16.  
  17. }
  18. if (check_smartphone())
  19. {
  20. ?>
  21. <!-- Мобильная версия сайта-->
  22. <body <?php if ($_SERVER["REQUEST_URI"] == '/') { ?> id="homepage" <?php } else {?> id="innerpage"<?php } ?>>
  23. ....
  24. ....
  25. ....
  26. </body>
  27. <?php
  28. }
  29. else
  30. {
  31. ?>
  32. <!-- Дескстопная версия сайта-->
  33. <body <?php if ($_SERVER["REQUEST_URI"] == '/') { ?> id="homepage" <?php } else {?> id="innerpage"<?php } ?>>
  34. ....
  35. ....
  36. ....
  37. </body>
  38. <?php
  39. }
  40. ?>
  41. </html>
  42.  
Немного прокомментирую код: если на сайт входят с мобильного устройства, то показываем содержимое контейнера body мобильной версии сайта, иначе показываем компьютерную версию контейнера.
Можно конечно поэкспериментировать и скажем в условный оператор добавить не только body, но и весь шаблон html, но это уже на следующий раз.

Рад если кому-нибудь помог такой идеей.
#13 Мобильный сайт | Смена шаблона 19 января 2016 в 22:10


Есть основной шаблон и есть для смартфонов.
Как правильно организовать их смену? Либо через m поддомен, либо как-то скриптом переключать шаблон.
Помогите ссылками, чем сможете. Нужна наводка v

Norm Gold

Добрый вечер! Вот появилась такая идея на счёт мобильной версии. Мне это очень как стало необходимо так как приходится сделать мобильную версию сайта очень отличающуюся от дескстопной, вот и появилась такая идея. А что если просто в файл шаблона template.php вставить две версии размещения блоков модулей и всего прочего именно в самом теле(<body>) просто отделить их проверкой устройства с которого заходят через условный оператор php если мобильное устройство, то показать размещение блоков мобильной версии, если нет, то шаблон компьютерной версии. Пожалуй это должно решить основную проблему, а всё остальное можно через css поправить. В общем идею подал, если кому-то интересно пишите в тему, я как раз завтра попытаюсь реализовать свою идею и отпишусь о результате если тема ещё актуальна для вас.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.