Созданные поля записываются в базу только после редактирования

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО

в объявлениях

#1 20 августа 2013 в 12:12
Не могу понять почему при добавлении объявлений, поля sroklic, skidka, pricelic не записываются в базу. НО записываются при редактировании. Что не правильно?
скидываю кусок кода фронтенд функции NEW BOARD ITEM
  1. if ($do=='additem'){
  2.  
  3. // Получаем категории, в которые может загружать пользователь
  4. $catslist = $model->getPublicCats($model->category_id);
  5. if(!$catslist) {
  6. cmsCore::addSessionMessage($_LANG['YOU_CANT_ADD_ADV_ANY'], 'error');
  7. $inCore->redirect('/board');
  8. }
  9.  
  10. $cat['is_photos'] = 1;
  11. $formsdata = array();
  12. if ($model->category_id && $model->category_id != $model->root_cat['id']) {
  13. $cat = $model->getCategory($model->category_id);
  14. $formsdata = cmsForm::getFieldsHtml($cat['form_id']);
  15. }
  16.  
  17. $inPage->addPathway($_LANG['ADD_ADV']);
  18.  
  19. if ( !$inCore->inRequest('submit') ) {
  20.  
  21. if (IS_BILLING) { cmsBilling::checkBalance('board', 'add_item'); }
  22. $inPage->setTitle($_LANG['ADD_ADV']);
  23.  
  24. $item = cmsUser::sessionGet('item');
  25. if ($item) { cmsUser::sessionDel('item'); }
  26.  
  27. $item['city'] = $item['city'] ? $item['city'] : $inDB->get_field('cms_user_profiles', 'id='.$inUser->id, 'city');
  28.  
  29. $smarty = $inCore->initSmarty('components', 'com_board_edit.tpl');
  30. $smarty->assign('action', "/board/add.html");
  31. $smarty->assign('form_do', 'add');
  32. $smarty->assign('cfg', $model->config);
  33. $smarty->assign('cat', $cat);
  34. $smarty->assign('item', $item);
  35. $smarty->assign('pagetitle', $_LANG['ADD_ADV']);
  36. $smarty->assign('cities', $model->getBoardCities($item['city']));
  37. $smarty->assign('formsdata', $formsdata);
  38. $smarty->assign('is_admin', $inUser->is_admin);
  39. $smarty->assign('is_user', $inUser->id);
  40. $smarty->assign('catslist', $catslist);
  41. $smarty->assign('is_billing', IS_BILLING);
  42. if (IS_BILLING){ $smarty->assign('balance', $inUser->balance); }
  43. $smarty->display('com_board_edit.tpl');
  44.  
  45. cmsUser::sessionClearAll();
  46. return;
  47.  
  48. }
  49.  
  50. if ( $inCore->inRequest('submit') ) {
  51.  
  52. // проверяем на заполненость скрытое поле
  53. $title_fake = cmsCore::request('title_fake', 'str', '');
  54. // если оно заполнено, считаем что это бот, 404
  55. if ($title_fake) { cmsCore::error404(); }
  56.  
  57. $errors = false;
  58.  
  59. // проверяем наличие категории
  60. if (!$cat['id']) { cmsCore::addSessionMessage($_LANG['NEED_CAT_ADV'], 'error'); $errors = true; }
  61.  
  62. // Проверяем количество добавленных за сутки
  63. if (!$model->checkLoadedByUser24h($cat)){
  64. cmsCore::addSessionMessage($_LANG['MAX_VALUE_OF_ADD_ADV'], 'error'); $errors = true;
  65. }
  66. // Можем ли добавлять в эту рубрику
  67. if (!$model->checkAdd($cat)){
  68. cmsCore::addSessionMessage($_LANG['YOU_CANT_ADD_ADV'], 'error'); $errors = true;
  69. }
  70.  
  71. // входные данные
  72. $obtype = icms_ucfirst(cmsCore::request('obtype', 'str', ''));
  73. $title = cmsCore::request('title', 'str', '');
  74. $title = str_ireplace($obtype, '', $title);
  75. $title = trim($title);
  76. $content = cmsCore::request('content', 'str', '');
  77. $city_ed = cmsCore::request('city_ed', 'str', '');
  78. $city = cmsCore::request('city', 'str', '');
  79.  
  80. $city = icms_ucfirst(($city && $city!='all') ? ($city_ed ? $city_ed : $city) : $city_ed);
  81.  
  82. $form_input = cmsForm::getFieldsInputValues($cat['form_id']);
  83. $formsdata = $inDB->escape_string(cmsCore::arrayToYaml($form_input['values']));
  84.  
  85. $vipdays = cmsCore::request('vipdays', 'int', 0);
  86.  
  87.  
  88. $sroklic = cmsCore::request('sroklic', 'str', '');
  89. $pricelic = cmsCore::request('pricelic', 'str', '');
  90. $pricelic2 = cmsCore::request('pricelic2', 'str', '');
  91. $skidka = cmsCore::request('skidka', 'str','');
  92. $skidka2 = cmsCore::request('skidka2', 'str','');
  93.  
  94. $published = $model->checkPublished($cat);
  95.  
  96. if ($model->config['srok']){ $pubdays = (cmsCore::request('pubdays', 'int') <= 50) ? cmsCore::request('pubdays', 'int') : 50; }
  97. if (!$model->config['srok']){ $pubdays = isset($model->config['pubdays']) ? $model->config['pubdays'] : 14; }
  98.  
  99. // Проверяем значения
  100. if (!$title) { cmsCore::addSessionMessage($_LANG['NEED_TITLE'], 'error'); $errors = true; }
  101. if (!$content) { cmsCore::addSessionMessage($_LANG['NEED_TEXT_ADV'], 'error'); $errors = true; }
  102. if (!$city) { cmsCore::addSessionMessage($_LANG['NEED_CITY'], 'error'); $errors = true; }
  103. //if (!$sroklic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_SROK'], 'error'); $errors = true; }
  104. //if (!$pricelic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_PRICE'], 'error'); $errors = true; }
  105. if (!$inUser->id && !$inCore->checkCaptchaCode(cmsCore::request('code', 'str'))) { cmsCore::addSessionMessage($_LANG['ERR_CAPTCHA'], 'error'); $errors = true; }
  106. // Проверяем значения формы
  107. foreach ($form_input['errors'] as $field_error) {
  108. if($field_error){ cmsCore::addSessionMessage($field_error, 'error'); $errors = true; }
  109. }
  110.  
  111. if ($errors){
  112. $item['content'] = htmlspecialchars(stripslashes($_REQUEST['content']));
  113. $item['city'] = stripslashes($city);
  114. $item['title'] = stripslashes($title);
  115. $item['obtype'] = $obtype;
  116. $item['sroklic'] = $sroklic;
  117. $item['pricelic'] = $pricelic;
  118. $item['pricelic2'] = $pricelic2;
  119. $item['skidka'] = $skidka;
  120. $item['skidka2'] = $skidka2;
  121. cmsUser:
#2 20 августа 2013 в 14:14
  1. public function addRecord($item){
  2.  
  3. $inUser = cmsUser::getInstance();
  4. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  5.  
  6. $sql = "INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, published, file, hits, ip)
  7. VALUES ({$item['category_id']}, {$item['user_id']}, '{$item['obtype']}', '{$item['title']}', '{$item['content']}', '{$item['formsdata']}',
  8. '{$item['city']}', NOW(), {$item['pubdays']}, {$item['published']}, '{$item['file']}', 0, INET_ATON('{$inUser->ip}'))";
  9.  
  10. $this->inDB->query($sql);
  11.  
  12. $item_id = $this->inDB->get_last_id('cms_board_items');
  13.  
  14. return $item_id ? $item_id : false;
  15. }
  16.  
  17. /* ==================================================================================================== */
  18. /* ==================================================================================================== */
  19.  
  20. public function updateRecord($id, $item){
  21.  
  22. $item = cmsCore::callEvent('UPDATE_BOARD_RECORD', $item);
  23.  
  24. $this->inDB->update('cms_board_items', $item, $id);
  25.  
  26. return true;
  27.  
  28. }
#3 20 августа 2013 в 14:52
trOid, не выкладывайте такие портянки, прячьте за спойлер.
lokanaft уже намекнул куда думать, дополню:
addRecord привести к виду
  1. public function addRecord($item){
  2.  
  3. $item['ip'] = ip2long(cmsUser::getInstance()->ip);
  4.  
  5. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  6.  
  7. return $this->inDB->insert('cms_board_items', $item);
  8.  
  9. }
выполнить запросы к бд
  1. ALTER TABLE `cms_board_items` CHANGE `hits` `hits` INT( 11 ) UNSIGNED NOT NULL DEFAULT '0'
  1. ALTER TABLE `cms_board_items` CHANGE `pubdate` `pubdate` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
Соответственно поля в таблице должны быть названы так же как у вас в коде pricelic, sroklic и т.д
#4 21 августа 2013 в 04:52
что то вы меня еще больше запутали!
в оригинале 1.10.2 функция addRecord такая
  1. $item_id = $model->addRecord(array(
  2. 'category_id'=>$model->category_id,
  3. 'user_id'=>$inUser->id,
  4. 'obtype'=>$obtype,
  5. 'title'=>$title,
  6. 'content'=>$content,
  7. 'formsdata'=>$formsdata,
  8. 'city'=>$city,
  9. 'pubdays'=>$pubdays,
  10. 'published'=>$published,
  11. 'file'=>$file['filename']
  12. ));
мне ее менять на это?
  1. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  2.  
  3.  
  4.  
  5. $sql = "INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, published, file, hits, ip)
  6.  
  7. VALUES ({$item['category_id']}, {$item['user_id']}, '{$item['obtype']}', '{$item['title']}', '{$item['content']}', '{$item['formsdata']}',
  8.  
  9. '{$item['city']}', NOW(), {$item['pubdays']}, {$item['published']}, '{$item['file']}', 0, INET_ATON('{$inUser->ip}'))";
#5 21 августа 2013 в 08:04

в оригинале 1.10.2 функция addRecord такая

trOid
Ты сам запутался уже. Функция addRecord находится в /components/board/model.php
  1. public function addRecord($item){
  2.  
  3. $inUser = cmsUser::getInstance();
  4. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  5.  
  6. $sql = "INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, published, file, hits, ip)
  7. VALUES ({$item['category_id']}, {$item['user_id']}, '{$item['obtype']}', '{$item['title']}', '{$item['content']}', '{$item['formsdata']}',
  8. '{$item['city']}', NOW(), {$item['pubdays']}, {$item['published']}, '{$item['file']}', 0, INET_ATON('{$inUser->ip}'))";
  9.  
  10. $this->inDB->query($sql);
  11.  
  12. $item_id = $this->inDB->get_last_id('cms_board_items');
  13.  
  14. return $item_id ? $item_id : false;
  15. }
А сдесь формируется массив передаваемый функции addRecord
  1. $item_id = $model->addRecord(array(
  2.  
  3. 'category_id'=>$model->category_id,
  4.  
  5. 'user_id'=>$inUser->id,
  6.  
  7. 'obtype'=>$obtype,
  8.  
  9. 'title'=>$title,
  10.  
  11. 'content'=>$content,
  12.  
  13. 'formsdata'=>$formsdata,
  14.  
  15. 'city'=>$city,
  16.  
  17. 'pubdays'=>$pubdays,
  18.  
  19. 'published'=>$published,
  20.  
  21. 'file'=>$file['filename']
  22.  
  23. ));
Допиши в функции addRecord свои созданные поля
INSERT INTO cms_board_items (category_id, user_id, obtype, title, content, formsdata, city, pubdate, pubdays, sroklic,pricelic,pricelic2,skidka,skidka2, published, file, hits, ip)
Соответственно и укажи значения VALUES {$item['sroklic']}, $item['pricelic']} и тд.
Установи строки отладчика
  1. ini_set ('xdebug.collect_return', 1);
  2. ini_set ('xdebug.collect_params', 4);
  3. ini_set ('xdebug.collect_assignments', 1);
  4. xdebug_start_trace('C:\usr\***\**\links');//путь к файлу лога links.txt
  5.  
  6. Исследуемый код
  7.  
  8. xdebug_stop_trace();
Открой файл лога links.txt в нотепаде, при каждой перезагрузке страницы увидиш все входящие переменные и вся обработка функций будет ясна как день.
#6 21 августа 2013 в 08:30
спасибо всем за развернутый ответ! попробую :)
#7 21 августа 2013 в 11:31
Спасибо, все работает если заполнены все поля! НО!
у меня две категории объявлений, "заявки" и "лицензии"
соответственно поля для ввода разные, точнее sroklic,pricelic,pricelic2,skidka,skidka2 — не заполняются в заявках.

А так же в лицензиях если поле не заполнено, то вылазит страница 404 /board/read.html, некоторые поля не обязательны для запонения… как сделать проверку?
  1.  
  2. if (!$sroklic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_SROK'], 'error'); $errors = true; }
  3. if (!$pricelic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_PRICE'], 'error'); $errors = true; }
такая конструкция правильная?
Как быть с необязательными полями?
#8 21 августа 2013 в 18:54
ВСЕМ СПАСИБО! но проблема все еще не решена, т.е. если будут пустые значения необязательных полей — 404 ошибка :(
#9 21 августа 2013 в 19:03
В подкатах есть additem, есть edititem? Это был первый вопрос. Теперь тема read, на основе каких божественных провидений предполагать что там присходит в вашем варианте?
#10 21 августа 2013 в 19:29
В моделе public function getRecord($item_id)
******
a.public as public,
a.sroklic as sroklic,
a.pricelic as pricelic, и далее по аналогии.
Пустые значения полей не приводят к 404.
frontend
  1.  
  2. //находим
  3. if($do=='read'){
  4.  
  5. //вставляем "Начать отладку"
  6. // используем отладчик версия php 5.3 (OpenServer||Denver)
  7. ini_set ('xdebug.collect_return', 1);
  8. ini_set ('xdebug.collect_params', 4);
  9. ini_set ('xdebug.collect_assignments', 1);
  10. xdebug_start_trace('C:\usr\***\**\links');//путь к файлу лога links.txt
  11.  
  12. //Исследуем отладчиком код /board/frontend.php приводящий к ошибке 404
  13. $item = $model->getRecord($model->item_id);
  14. if (!$item){ cmsCore::error404(); }
  15.  
  16. // неопубликованные показываем админам, модераторам и автору
  17. if (!$item['published'] && !$item['moderator']) { cmsCore::error404(); }
  18.  
  19.  
  20. //вставляем "Закончить отладку"
  21. xdebug_stop_trace();
  22.  
Открываем нотепадом файл лога отладчика links.txt. И внимательно разбираем.
#11 22 августа 2013 в 04:40
добавил в function getRecord($item_id)
  1.  
  2. a.sroklic as sroklic,
  3. a.pricelic as pricelic,
  4. a.pricelic2 as pricelic2,
  5. a.skidka as skidka,
  6. a.skidka2 as skidka2,
теперь при добавлении, если все поля заполнены — 404 ошибка board/read118.html, хотя на /board/ объявление показывается норм.
если не все поля — та же байда 404. /board/read.html
а так же перестают удаляться объявления в админке

насчет оттладчика, я не понял как его применять на хостинге, т.е. путь к файлу не могу указать правильный. получается белый экран при добавлении объявления
#12 22 августа 2013 в 04:50
в edititem добавлено
  1.  
  2. $sroklic = $inCore->request('sroklic', 'str', '');
  3. $pricelic = $inCore->request('pricelic', 'str', '');
  4. $pricelic2 = $inCore->request('pricelic2', 'str', '');
  5. $skidka = $inCore->request('skidka', 'str', '');
  6. $skidka2 = $inCore->request('skidka2', 'str','');
ниже
  1.  
  2. if (!$sroklic && $cat == 11 ) { cmsCore::addSessionMessage($_LANG['NEED_SROK'], 'error'); $errors = true; }
  3. if (!$pricelic && $cat == 11 ) { cmsCore::addSessionMessage($_LANG['NEED_PRICE'], 'error'); $errors = true; }
и еще ниже в updateRecord
  1.  
  2. 'sroklic'=>$sroklic,
  3. 'pricelic'=>$pricelic,
  4. 'pricelic2'=>$pricelic2,
  5. 'skidka'=>$skidka,
  6. 'skidka2'=>$skidka2,
в additem
  1.  
  2. $sroklic = cmsCore::request('sroklic', 'str', '');
  3. $pricelic = cmsCore::request('pricelic', 'str', '');
  4. $pricelic2 = cmsCore::request('pricelic2', 'str', '');
  5. $skidka = cmsCore::request('skidka', 'str','');
  6. $skidka2 = cmsCore::request('skidka2', 'str','');
ниже
  1.  
  2. if (!$sroklic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_SROK'], 'error'); $errors = true; }
  3. if (!$pricelic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_PRICE'], 'error'); $errors = true; }
далее $errors
  1. $item['sroklic'] = $sroklic;
  2. $item['pricelic'] = $pricelic;
  3. $item['pricelic2'] = $pricelic2;
  4. $item['sdidka'] = $skidka;
  5. $item['sdidka2'] = $skidka2;
и в addRecord
  1.  
  2. 'sroklic'=>$sroklic,
  3. 'pricelic'=>$pricelic,
  4. 'pricelic2'=>$pricelic2,
  5. 'skidka'=>$skidka,
  6. 'skidka2'=>$skidka2,
#13 26 августа 2013 в 07:33
все еще ищу решение проблемы незаполненных полей…
#14 26 августа 2013 в 10:10
Проверку заполненности полей можно выполнить так
  1.  
  2. <input name="troid" id="troidinput" class="text-input" type="text" style="width:300px" value="{$item.troid|escape:'html'}" onchange="checktroid()" autocomplete="off"/>
  3. <span class="regstar">*</span>
  4. <div id="troidcheck"></div>
В шаблоне подключи js {add_js file='components/board/js/checktroid.js'}
Js файл checktroid.js
  1. function checktroid(){
  2. var usertroid = $("#troidinput").attr('value');
  3. var reg= /^[a-zA-Z0-9_]{2,15}$/ ;
  4. if (reg.test(usertroid))
  5. {
  6. $("#troidcheck").load("/core/ajax/troid_board_check.php", {opt: "checktroid", data:usertroid});
  7.  
  8. }else
  9. {
  10. if (usertroid.length < 2){
  11. $("#troidcheck").html('<span style="color:red">Минимальная длина = 2</span>');
  12. } else {
  13. if (usertroid.length > 15){
  14. $("#troidcheck").html('<span style="color:red">Максимальная длина = 15</span>');
  15. } else {
  16. $("#troidcheck").html('<span style="color:red">Только латинские буквы и цифры</span>');
  17. }
  18. }
  19. }
  20. }
Файл /core/ajax/troid_board_check.php зделай аналогично /core/ajax/registration.php изменив if ($opt=='checktroid'){запрос на свой}

xdebug делай на локальном сервере в OpenServer или Denwer.
#15 26 августа 2013 в 10:26
oll, объясни пожалуйста что это скрипт делает, и какую возможность он дает?
как я понял он проверяет значение вводимого поля на макс и мин значение, и без русских букв.
Как это может быть связано с игнорируемостью пустых, незаполненных полей?
С сожалению нет возможности пользоваться денвером на раб. машине…
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.