n1c Posted December 25, 2019 Report Share Posted December 25, 2019 (edited) Привет, Друзья!Столкнулся с проблемой. При заполнении формы на сайте, нужна возможность редактирования ее в админке. NewView.php <?PHP require_once('View.php'); class NewView extends View { function fetch() { $new = new stdClass; if($this->request->method('post') && $this->request->post('new')) { $new = new stdClass(); $new->phone = $this->request->post('phone'); $new->name = $this->request->post('name'); $new->form_1 = $this->request->post('form_1'); $new->form_2 = $this->request->post('form_2'); $new->form_3 = $this->request->post('form_3'); $this->design->assign('name', $new->name); //$new_id = $this->news->add_new($new); if($new_id = $this->news->update_new($new_id, array('name'=>$new->name, 'email'=>$new->email))) { $this->new = $this->users->get_new(intval($new_id)); $this->design->assign('name', $new->name); $this->design->assign('email', $new->email); } else $this->design->assign('error', 'unknown error'); // Отправляем email $this->news->email_new_admin($new_id); } if($this->page) { $this->design->assign('meta_title', $this->page->meta_title); $this->design->assign('meta_keywords', $this->page->meta_keywords); $this->design->assign('meta_description', $this->page->meta_description); } $body = $this->design->fetch('new.tpl'); return $body; } } api/New.php <?php require_once('Simpla.php'); class News extends Simpla { public function get_new($id) { $query = $this->db->placehold("SELECT c.id, c.name, c.ip, c.form_1, c.form_2, c.form_3, c.processed FROM __news c WHERE id=? LIMIT 1 ", intval($id)); if($this->db->query($query)) { return $this->db->result(); } else { return false; } } public function get_news($filter = array(), $new_on_top = false) { // По умолчанию $limit = 1000; $page = 1; $processed = ''; if(isset($filter['limit'])) { $limit = max(1, intval($filter['limit'])); } if(isset($filter['page'])) { $page = max(1, intval($filter['page'])); } if(isset($filter['processed'])) { $processed = $this->db->placehold('AND processed=?',$filter['processed']); } $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit); if($new_on_top) { $sort='DESC'; } else { $sort='ASC'; } $query = $this->db->placehold("SELECT c.id, c.name, c.ip, c.form_1, c.form_2, c.form_3, c.processed FROM __news c WHERE 1 $processed ORDER BY c.id $sort $sql_limit "); $this->db->query($query); return $this->db->results(); } public function add_new($new) { $query = $this->db->placehold('INSERT INTO __news SET ?%, date = NOW()', $new); if(!$this->db->query($query)) { return false; } $id = $this->db->insert_id(); return $id; } public function update_new($id, $new) { $query = $this->db->placehold("UPDATE __news SET ?% $date_query WHERE id in(?@) LIMIT 1", $new, (array)$id); $this->db->query($query); return $id; } public function delete_new($id) { if(!empty($id)) { $query = $this->db->placehold("DELETE FROM __news WHERE id=? LIMIT 1", intval($id)); $this->db->query($query); } } } simpla/NewAdmin.php <?php require_once('api/Simpla.php'); class NewsAdmin extends Simpla { public function fetch() { $new = new stdClass; if(!empty($_POST['new_info'])) { $new->id = $this->request->post('id', 'integer'); $new->enabled = $this->request->post('enabled'); $new->name = $this->request->post('name'); $new->email = $this->request->post('email'); ## Не допустить одинаковые email пользователей. if(empty($new->name)) { $this->design->assign('message_error', 'empty_name'); } elseif(empty($new->email)) { $this->design->assign('message_error', 'empty_email'); } elseif(($u = $this->news->get_new($new->email)) && $u->id!=$new->id) { $this->design->assign('message_error', 'login_existed'); } else { $new->id = $this->news->update_new($new_id, $new); $this->design->assign('message_success', 'updated'); $new = $this->news->get_new(intval($new_id)); } } elseif($this->request->method('post')) { // Действия с выбранными $ids = $this->request->post('check'); if(!empty($ids)) { switch($this->request->post('action')) { case 'delete': { foreach($ids as $id) { $this->news->delete_new($id); } break; } case 'processed': { foreach ($ids as $id) { $this->news->update_new($id, array('processed'=>1)); } break; } } } } // Отображение $filter = array(); $filter['page'] = max(1, $this->request->get('page', 'integer')); $filter['limit'] = 200; //$news_count = $this->news->count_news($filter); // Показать все страницы сразу if($this->request->get('page') == 'all') { $filter['limit'] = $news_count; } $news = $this->news->get_news($filter, true); $this->design->assign('pages_count', ceil($news_count/$filter['limit'])); $this->design->assign('current_page', $filter['page']); $this->design->assign('news', $news); $this->design->assign('news_count', $news_count); return $this->design->fetch('news.tpl'); } } ?> в базу передает, все работает, но в админке не могу отредактировать, чтобы сохранило в базу новое значение <input name="name" class="simpla_inp " type="text" value="{$new->name|escape}" /> Edited December 25, 2019 by n1c Quote Link to post Share on other sites
shooroop Posted December 25, 2019 Report Share Posted December 25, 2019 в simpla/NewAdmin.php заменить if(!empty($_POST['new_info'])) на if($this->request->method('post')) далее по коду убрать непонятно что elseif($this->request->method('post')) {// Действия с выбранными и закрывашку } Quote Link to post Share on other sites
n1c Posted December 26, 2019 Author Report Share Posted December 26, 2019 в simpla/NewAdmin.php заменить if(!empty($_POST['new_info'])) на if($this->request->method('post')) далее по коду убрать непонятно что elseif($this->request->method('post')) {// Действия с выбранными и закрывашку } не помогло((( вот сейчас мой код в /simpla/NewsAdmin.php <?php require_once('api/Simpla.php'); class NewsAdmin extends Simpla { public function fetch() { //$new = new stdClass; if($this->request->method('post')) { $new->id = $this->request->post('id', 'integer'); $new->enabled = $this->request->post('enabled'); $new->name = $this->request->post('name'); $new->email = $this->request->post('email'); ## Не допустить одинаковые email пользователей. if(empty($new->name)) { $this->design->assign('message_error', 'empty_name'); } elseif(empty($new->email)) { $this->design->assign('message_error', 'empty_email'); } elseif(($u = $this->news->get_new($new->email)) && $u->id!=$new->id) { $this->design->assign('message_error', 'login_existed'); } else { $new->id = $this->news->update_new($new_id, $new); $this->design->assign('message_success', 'updated'); $new = $this->news->get_new(intval($new_id)); } } // Отображение $filter = array(); $filter['page'] = max(1, $this->request->get('page', 'integer')); $filter['limit'] = 200; //$news_count = $this->news->count_news($filter); // Показать все страницы сразу if($this->request->get('page') == 'all') { $filter['limit'] = $news_count; } $news = $this->news->get_news($filter, true); $this->design->assign('pages_count', ceil($news_count/$filter['limit'])); $this->design->assign('current_page', $filter['page']); $this->design->assign('news', $news); $this->design->assign('news_count', $news_count); return $this->design->fetch('news.tpl'); } } ?> Quote Link to post Share on other sites
phukortsin Posted December 26, 2019 Report Share Posted December 26, 2019 Похоже, у Вас все сильно напутано. Что касается последнего фрагмента кода, то в нем первая частьif($this->request->method('post')){...}должна быть в /simpla/NewAdmin.php, а вторая - в /simpla/NewsAdmin.php. Смотрите, как сделано стандартно в Simpla (например, при редактировании брендов) и действуйте по образцу... Quote Link to post Share on other sites
n1c Posted December 26, 2019 Author Report Share Posted December 26, 2019 Похоже, у Вас все сильно напутано. Что касается последнего фрагмента кода, то в нем первая частьif($this->request->method('post')){...}должна быть в /simpla/NewAdmin.php, а вторая - в /simpla/NewsAdmin.php. Смотрите, как сделано стандартно в Simpla (например, при редактировании брендов) и действуйте по образцу... у меня только один файл NewsAdmin.php (я выше забыл добавить s в News) Quote Link to post Share on other sites
phukortsin Posted December 26, 2019 Report Share Posted December 26, 2019 А если у Вас так нестандартно, то надо бы и шаблон показывать... Quote Link to post Share on other sites
n1c Posted December 26, 2019 Author Report Share Posted December 26, 2019 А если у Вас так нестандартно, то надо бы и шаблон показывать... в simpla/design/news.tpl {* Вкладки *} {capture name=tabs} {if in_array('comments', $manager->permissions)}<li><a href="index.php?module=CommentsAdmin">Комментарии</a></li>{/if} <li class="active"><a href="index.php?module=NewsAdmin">Анкета</a></li> {/capture} {* Title *} {$meta_title='Анкета' scope=parent} <div id="header"> {if $news_count} <h1>{$news_count} {$news_count|plural:'заявка':'заявки':'заявок'}</h1> {else} {/if} </div> <div id="main_list"> <form method="post" action="{url module=ExportnewsAdmin}" target="_blank"> <input type="hidden" name="session_id" value="{$smarty.session.id}"> <input type="image" src="./design/images/export_excel.png" name="export" title="Экспортировать"> </form><br><br> {include file='pagination.tpl'} {if $news} <form id="list_form" method="post"> <input type="hidden" name="session_id" value="{$smarty.session.id}"/> <div id="list" class="sortable"> {foreach $news as $new} <div class="{if !$new->processed}unapproved{/if} row"> <div class="checkbox cell"> <input type="checkbox" id="{$new->id}" name="check[]" value="{$new->id}"/> <label for="{$new->id}"></label> </div> <div class="name cell"> <div class='comment_name'> {$new->name|escape} <a class="approve" href="#">Обработать</a> </div> <style> {literal} table, td, th { border: 1px solid #ddd; text-align: left; } table { border-collapse: collapse; width: 100%; } th, td { padding: 15px; } {/literal}c </style> <table> <tr> <th>Вопрос</th> <th>Ответ</th> </tr> <tr> <td>{$settings->forms_news_1|escape}</td> <td><input name="name" class="simpla_inp " type="text" value="{$new->name|escape}" /></td> </tr> <tr> <td>{$settings->forms_news_2|escape}</td> <td> <input name="form_1" class="" type="text" value="{$new->form_1|escape|nl2br}" />. <input name="form_2" class="" type="text" value="{$new->form_2|escape|nl2br}" />. <input name="form_3" class="" type="text" value="{$new->form_3|escape|nl2br}" /> </td> </tr> <tr> <td>Заявка отправлена</td> <td>{$new->date|date} в {$new->date|time}</td> </tr> </table> </div> <div class="icons cell"> <a href='#' title='Удалить' class="delete"></a> </div> <div class="clear"></div> </div> {/foreach} </div> <div id="action"> <label id='check_all' class='dash_link'>Выбрать все</label> <span id=select> <select name="action"> <option value="processed">Отметить как обработанные</option> <option value="delete">Удалить</option> </select> </span> <input id='apply_action' class="button_green" type=submit value="Применить"> </div> </form> {else} Пусто {/if} {include file='pagination.tpl'} </div> {literal} <script> $(function() { // Раскраска строк function colorize() { $("#list div.row:even").addClass('even'); $("#list div.row:odd").removeClass('even'); } // Раскрасить строки сразу colorize(); // Выделить все $("#check_all").click(function() { $('#list input[type="checkbox"][name*="check"]').attr('checked', $('#list input[type="checkbox"][name*="check"]:not(:checked)').length>0); }); // Удалить $("a.delete").click(function() { $('#list input[type="checkbox"][name*="check"]').attr('checked', false); $(this).closest(".row").find('input[type="checkbox"][name*="check"]').attr('checked', true); $(this).closest("form").find('select[name="action"] option[value=delete]').attr('selected', true); $(this).closest("form").submit(); }); // Обработать $("a.approve").click(function() { var line = $(this).closest(".row"); var id = line.find('input[type="checkbox"][name*="check"]').val(); line.addClass('loading_icon'); $.ajax({ type: 'POST', url: 'ajax/update_object.php', data: {'object': 'new', 'id': id, 'values': {'processed': 1}, 'session_id': '{/literal}{$smarty.session.id}{literal}'}, success: function(data){ line.removeClass('loading_icon'); line.removeClass('unapproved'); }, dataType: 'json' }); return false; }); // Подтверждение удаления $("form#list_form").submit(function() { if($('select[name="action"]').val()=='delete' && !confirm('Подтвердите удаление')) return false; }); }); </script> {/literal} Quote Link to post Share on other sites
phukortsin Posted December 26, 2019 Report Share Posted December 26, 2019 Так у Вас явно поля редактирования<input name="form_1" class="" type="text" value="{$new->form_1|escape|nl2br}" />неверно оформлены. Смотрите в качестве примера, как стандартно на стр списка товаров в админке редактируются цены и кол-во товаров. Quote Link to post Share on other sites
n1c Posted December 26, 2019 Author Report Share Posted December 26, 2019 Так у Вас явно поля редактирования<input name="form_1" class="" type="text" value="{$new->form_1|escape|nl2br}" />неверно оформлены. Смотрите в качестве примера, как стандартно на стр списка товаров в админке редактируются цены и кол-во товаров. Вот поле для имени - <input name="name" class="simpla_inp " type="text" value="{$new->name|escape}" />верно же оформлено, а все равно не работает( Quote Link to post Share on other sites
phukortsin Posted December 26, 2019 Report Share Posted December 26, 2019 Это тоже неверно... Quote Link to post Share on other sites
n1c Posted December 26, 2019 Author Report Share Posted December 26, 2019 Это тоже неверно... <input name="new[name][]" type="text" value="{$new->name|escape}" /> ?тоже не работает Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.