Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Хочу добавить добавление картинки к форму обратной связи на страницу site.ru/contact:

1. В таблицу добавил поле image.

2. В шаблоне: добавил поле input и атрибут enctype к самой форме.

3. Изменил запрос в файле: api/feedbacks.php в функции get_feedback в запрос добавил f.image.

4. Файл view/feedbackView.php.

<?PHP

/**
 * Simpla CMS
 *
 * @copyright 	2011 Denis Pikusov
 * @link 		http://simp.la
 * @author 		Denis Pikusov
 *
 * Отображение статей на сайте
 * Этот класс использует шаблоны articles.tpl и article.tpl
 *
 */
 
require_once('View.php');

class FeedbackView extends View
{
	function fetch()
	{
		$feedback = new stdClass;
		if($this->request->method('post') && $this->request->post('feedback'))
		{
			$feedback->name         = $this->request->post('name');
			$feedback->email        = $this->request->post('email');
			$feedback->message      = $this->request->post('message');
			$feedback->image = $this->request->files('image');
			$captcha_code           = $this->request->post('captcha_code');
			$image = $this->request->files('image');
			
			$this->design->assign('name',  $feedback->name);
			$this->design->assign('email', $feedback->email);
			$this->design->assign('message', $feedback->message);
			$this->design->assign('image', $feedback->image);
			if(!empty($image['name'])) {
			move_uploaded_file($image['tmp_name'], $this->root_dir.$this->config->feedback_images_dir.$image['name']);
			}
			if(empty($feedback->name))
				$this->design->assign('error', 'empty_name');
			elseif(empty($feedback->email))
				$this->design->assign('error', 'empty_email');
			elseif(empty($feedback->message))
				$this->design->assign('error', 'empty_text');
			elseif(empty($_SESSION['captcha_code']) || $_SESSION['captcha_code'] != $captcha_code || empty($captcha_code))
			{
				$this->design->assign('error', 'captcha');
			}
			else
			{
				$this->design->assign('message_sent', true);
				
				$feedback->ip = $_SERVER['REMOTE_ADDR'];
				$feedback_id = $this->feedbacks->add_feedback($feedback);
				
				// Отправляем email
				$this->notify->email_feedback_admin($feedback_id);				
				
				// Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую
				unset($_SESSION['captcha_code']);
								
			}
		}

		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('feedback.tpl');
		
		return $body;
	}
}

Добавил в файл:

\simpla\design\html\feedbacks.tpl

<div class='image'>
						{$feedback->image}
						</div>

В итоге файл загружается на сервер в указанную папку, но не могу разобраться с тем как картинку добавить в админку в раздел обратной связи.

 

 

Ссылка на сообщение
Поделиться на другие сайты

Я правильно понимаю, что функция get_feedback получает  id записи, производит выборку в базе и возвращает эту запись.

в запрос в 2-х функциях добавил: f.image.

Ссылка на сообщение
Поделиться на другие сайты

Из класса Feedbacks:

	public function get_feedback($id)
	{
		$query = $this->db->placehold("SELECT f.id, f.image, f.name, f.email, f.ip, f.message, f.date FROM __feedbacks f WHERE id=? LIMIT 1", intval($id));

		if($this->db->query($query))
			return $this->db->result();
		else
			return false; 
	}
	
	public function get_feedbacks($filter = array(), $new_on_top = false)
	{	
		// По умолчанию
		$limit = 0;
		$page = 1;
		$keyword_filter = '';

		if(isset($filter['limit']))
			$limit = max(1, intval($filter['limit']));

		if(isset($filter['page']))
			$page = max(1, intval($filter['page']));

		$sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);

		if(!empty($filter['keyword']))
		{
			$keywords = explode(' ', $filter['keyword']);
			foreach($keywords as $keyword)
				$keyword_filter .= $this->db->placehold('AND f.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR f.message LIKE "%'.$this->db->escape(trim($keyword)).'%" OR f.email LIKE "%'.$this->db->escape(trim($keyword)).'%" ');
		}
			
		if($new_on_top)
			$sort='DESC';
		else
			$sort='ASC';

		$query = $this->db->placehold("SELECT f.id, f.name, f.email, f.ip, f.message, f.date, f.image
										FROM __feedbacks f WHERE 1 $keyword_filter ORDER BY f.id $sort $sql_limit");
	
		$this->db->query($query);
		return $this->db->results();
	}

функция function get_feedbacks насколько я понимаю возвращает все записи и потом по этим данным происходит фильтрация.

Добавляю в шаблон вывода feedbacks.tpl 

<div class='image'>
						{$feedback->image}
						</div>

но почему-то данные не попадают в {foreach $feedbacks as $feedback} в массив $feedbacks что я забываю?

Ссылка на сообщение
Поделиться на другие сайты

Поле называется image. Вот файл feedbacks.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=FeedbacksAdmin">Обратная связь</a></li>
{/capture}

{* Title *}
{$meta_title='Обратная связь' scope=parent}


{* Поиск *}
{if $feedbacks || $keyword}
<form method="get">
<div id="search">
	<input type="hidden" name="module" value='FeedbacksAdmin'>
	<input class="search" type="text" name="keyword" value="{$keyword|escape}" />
	<input class="search_button" type="submit" value=""/>
</div>
</form>
{/if}

{* Заголовок *}
<div id="header">
	{if $feedbacks_count}
	<h1>{$feedbacks_count} {$feedbacks_count|plural:'сообщение':'сообщений':'сообщения'}</h1> 
	{else}
	<h1>Нет сообщений</h1> 
	{/if}
</div>	

<div id="main_list">
	
	<!-- Листалка страниц -->
	{include file='pagination.tpl'}	
	<!-- Листалка страниц (The End) -->
		
	{if $feedbacks}
		<form id="list_form" method="post">
		<input type="hidden" name="session_id" value="{$smarty.session.id}">
		
			<div id="list" style="width:100%;">
				
				{foreach $feedbacks as $feedback}
				<div class="row">
			 		<div class="checkbox cell">
						<input type="checkbox" name="check[]" value="{$feedback->id}" />				
					</div>
					<div class="name cell">
						<div class='comment_name'>
						<a href="mailto:{$feedback->name|escape}<{$feedback->email|escape}>?subject=Вопрос от пользователя {$feedback->name|escape}">{$feedback->name|escape}</a>
						</div>
						<div class='comment_text'>
						{$feedback->message|escape|nl2br}
						</div>
						<div class='image'>
						{$feedback->image}
						</div>
						<div class='comment_info'>
						Сообщение отправлено {$feedback->date|date} в {$feedback->date|time}
						</div>
					</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="delete">Удалить</option>
			</select>
			</span>
		
			<input id='apply_action' class="button_green" type=submit value="Применить">
		
			
		</div>
		</form>
		
	{else}
	Нет сообщений
	{/if}
		
	<!-- Листалка страниц -->
	{include file='pagination.tpl'}	
	<!-- Листалка страниц (The End) -->
			
</div>

<!-- Меню -->
<div id="right_menu">
	
</div>
<!-- Меню  (The End) -->

{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.enable").click(function() {
		var icon        = $(this);
		var line        = icon.closest(".row");
		var id          = line.find('input[type="checkbox"][name*="check"]').val();
		var state       = line.hasClass('invisible')?1:0;
		icon.addClass('loading_icon');
		$.ajax({
			type: 'POST',
			url: 'ajax/update_object.php',
			data: {'object': 'blog', 'id': id, 'values': {'visible': state}, 'session_id': '{/literal}{$smarty.session.id}{literal}'},
			success: function(data){
				icon.removeClass('loading_icon');
				if(state)
					line.removeClass('invisible');
				else
					line.addClass('invisible');				
			},
			dataType: 'json'
		});	
		return false;	
	});
	
	// Подтверждение удаления
	$("form#list_form").submit(function() {
		if($('select[name="action"]').val()=='delete' && !confirm('Подтвердите удаление'))
			return false;	
	});

});

</script>
{/literal}

Ссылка на сообщение
Поделиться на другие сайты

Насколько я понимаю в базе данных хранится путь до картинки. Я хочу добавить само изображение в админку в раздел обратной связи.. {$feedback->image} - не выводит ничего при добавлениии сообщения в форму обратной связи. Однако на сервере  картинка есть.

Ссылка на сообщение
Поделиться на другие сайты

В базе хранится только имя картинки.

Надо типа такого

$image = $this->request->files('image');

$feedback->image = $image['name'];

Ссылка на сообщение
Поделиться на другие сайты

файл:feedbackView.php исправил:

<?PHP

/**
 * Simpla CMS
 *
 * @copyright 	2011 Denis Pikusov
 * @link 		http://simp.la
 * @author 		Denis Pikusov
 *
 * Отображение статей на сайте
 * Этот класс использует шаблоны articles.tpl и article.tpl
 *
 */
 
require_once('View.php');

class FeedbackView extends View
{
	function fetch()
	{
		$feedback = new stdClass;
		if($this->request->method('post') && $this->request->post('feedback'))
		{
			$feedback->name         = $this->request->post('name');
			$feedback->email        = $this->request->post('email');
			$feedback->message      = $this->request->post('message');
			$captcha_code           = $this->request->post('captcha_code');
			$image = $this->request->files('image');
			$feedback->image = $image['name'];
			
			$this->design->assign('name',  $feedback->name);
			$this->design->assign('email', $feedback->email);
			$this->design->assign('message', $feedback->message);
			$this->design->assign('image', $feedback->image);
			if(!empty($image['name'])) {
			move_uploaded_file($image['tmp_name'], $this->root_dir.$this->config->feedback_images_dir.$image['name']);
			}
			if(empty($feedback->name))
				$this->design->assign('error', 'empty_name');
			elseif(empty($feedback->email))
				$this->design->assign('error', 'empty_email');
			elseif(empty($feedback->message))
				$this->design->assign('error', 'empty_text');
			elseif(empty($_SESSION['captcha_code']) || $_SESSION['captcha_code'] != $captcha_code || empty($captcha_code))
			{
				$this->design->assign('error', 'captcha');
			}
			else
			{
				$this->design->assign('message_sent', true);
				
				$feedback->ip = $_SERVER['REMOTE_ADDR'];
				$feedback_id = $this->feedbacks->add_feedback($feedback);
				
				// Отправляем email
				$this->notify->email_feedback_admin($feedback_id);				
				
				// Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую
				unset($_SESSION['captcha_code']);
								
			}
		}

		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('feedback.tpl');
		
		return $body;
	}
}

Теперь в админке приходит имя картинки: 1.jpg , что изменить чтобы сама картинка изображение приходило. Заранее благодарен за ответ.

Ссылка на сообщение
Поделиться на другие сайты

сейчас возвращается files/feedbacks/7.png как прописать от корня, какая конструкция. Но даже если я конкатенирую и делаю от корня все равно получаю ссылку на изображение, а не само изображение.

Ссылка на сообщение
Поделиться на другие сайты
  • 9 месяцев спустя...
/**
 * Simpla CMS
 *
 * @copyright 	2011 Denis Pikusov
 * @link 		http://simp.la
 * @author 		Denis Pikusov
 *
 * Отображение статей на сайте
 * Этот класс использует шаблоны articles.tpl и article.tpl
 *
 */
 
require_once('View.php');

class FeedbackView extends View
{
	function fetch()
	{
		$feedback = new stdClass;
		if($this->request->method('post') && $this->request->post('feedback'))
		{

что то тут не так)))) "отображение статей".... платная CMS, и такие, хоть на работопригодность и не сказывающиеся, но все же косяки... это ведь не первая версия движка...

Ссылка на сообщение
Поделиться на другие сайты

Не понимаю, в чем проблема?

Вы заплатили за КМС? Если да, то чем вы недовольны?

Если нет - то вопросов нет.

Ссылка на сообщение
Поделиться на другие сайты

что то тут не так)))) "отображение статей"....

Ошибка самая пустяковая - в комментарии.

хоть на работопригодность и не сказывающиеся

Бывают же такие капризные...
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...