Jump to content

Реализация загрузки файла в модуле, как сделать?


Recommended Posts

У меня есть модуль который создатет записи в базе под своими Id, с такими полями:

 

Id;id_lang;text

 

В настройках модуля обычная формачка с добавлением новой записи и текста к ней, мне нужно приделать загрузку изображения к каждой записи, выбранный файл не только должен помещаться в нужную папку но еще его имя должно помещаться в базу данных. Кто ни будь может помочь мне это сделать?

 

Как сделать отдельно от престы загрузку изображения и помещения его названия в БД это я знаю, а вот как на уровне модуля для престы..Например там в php файле идет условие, к примеру при submit выполнить проверку условий на корректность введеных данных, далее скопировать информацию из всех полей формы и поместить эту инфу в базу и в этом правиле при submit нету указания на переменные из формы и SQL запросов, в другом файле они отдельно указаны и соотносятся с полем name="" в инпутах, например name="text" это всеравно что $text, а $text это название столбца в MySQL базе..

 

И тут не могу допереть как реализовать подгрузку изображения к каждой записи -/

 

Link to comment
Share on other sites

Возьмите модуль стандартного слайдера. Это практически полное решение Вашей задачи. Останется только имена таблиц и полей переделать.

Link to comment
Share on other sites

Возьмите модуль стандартного слайдера. Это практически полное решение Вашей задачи. Останется только имена таблиц и полей переделать.

 

Как раз об этом подумал! Сейчас буду пробовать!

 

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

Link to comment
Share on other sites

Блин все равно как то уж слишком сложно, с других модулей не получается перетащить потому что там везде в чем то требуемый функционал другой ..

Link to comment
Share on other sites

У меня в пхп идет вот такой обработчик нажатия кнопки сохранить:

 

    elseif (Tools::getValue('submitAdd'.$this->table))
    {
	    $this->validateRules(); 
	    if (!sizeof($this->_errors)) {
		    $id = intval(Tools::getValue($this->identifier));
		    /* Object update */
		    if (isset($id) AND !empty($id)) {
			    $object = new $this->className($id);
			    if (Validate::isLoadedObject($object)) {
				    $this->copyFromPost($object, $this->table);
				    $result = $object->update();
				    if (!$result) {
					    $this->_errors[] = Tools::displayError('an error occurred while updating object').' <b>'.$this->table.'</b> ('.Db::getInstance()->getMsgError().')';
				    } elseif (!sizeof($this->_errors)) {
					    Tools::redirectAdmin($currentIndex . '&conf=4&token='.$token);
				    }
			    } else {
				    $this->_errors[] = Tools::displayError('an error occurred while updating object').' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)');
			    }
		    }
		    /* Object creation */
		    else {
			    $object = new $this->className();
			    $this->copyFromPost($object, $this->table);
			    if (!$object->add()) {
				    $this->_errors[] = Tools::displayError('an error occurred while creating object').' <b>'.$this->table.' ('.mysql_error().')</b>';
			    } elseif (($_POST[$this->identifier] = $object->id) AND !sizeof($this->_errors)) {
				    Tools::redirectAdmin($currentIndex.($parent_id ? '&'.$this->identifier.'='.$object->id : '').'&conf=3&token='.$token);
			    }
		    }
	    }
	    $this->_errors = array_unique($this->_errors);
	    $this->_displayForm();
	    return $this->_html;
    }

 

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

Link to comment
Share on other sites

В /* Object update */ после $result = $object->update(); вывел print_r($object), получил:

 

News Object
(
   [meta_title] => Array
    (
	    [6] => Текст
	    [9] => Текст
    )
   [meta_description] => Array
    (
	    [6] => Текст
	    [9] =>
    )
   [meta_keywords] => Array
    (
	    [6] =>
	    [9] =>
    )
   [img_name] => 252.jpg
   [description_short] => Array
    (
	    [6] => <p><span>Текст</p>
	    [9] =>
    )
   [content] => Array
    (
	    [6] => <div class="p_cont" style="padding: 15px;">Текст</div>
</div>
	    [9] =>
    )
   [link_rewrite] => Array
    (
	    [6] => durnushki-2
	    [9] => durnushki-2
    )
   [status] => 1
   [date_add] => 2013-06-18 15:12:44
   [date_upd] => 2013-06-19 09:37:22
   [id_employee] => 1
   [id_category_default] => 1
   [fieldsRequiredLang:protected] => Array
    (
	    [0] => meta_title
	    [1] => link_rewrite
    )
   [fieldsSizeLang:protected] => Array
    (
	    [meta_description] => 255
	    [meta_keywords] => 255
	    [meta_title] => 128
	    [link_rewrite] => 128
	    [img_name] => 65536
	    [description_short] => 65536
    )
   [fieldsValidate:protected] => Array
    (
	    [id_employee] => isInt
	    [status] => isBool
    )
   [fieldsValidateLang:protected] => Array
    (
	    [meta_description] => isGenericName
	    [meta_keywords] => isGenericName
	    [meta_title] => isGenericName
	    [link_rewrite] => isLinkRewrite
	    [description_short] => isString
	    [img_name] => isString
	    [content] => isString
    )
   [table:protected] => news
   [identifier:protected] => id_entry
   [id] => 1
   [id_lang:protected] =>
   [fieldsRequired:protected] => Array
    (
    )
   [fieldsSize:protected] => Array
    (
    )
   [tables:protected] => Array
    (
    )
   [webserviceParameters:protected] => Array
    (
    )
   [image_dir:protected] =>
   [image_format:protected] => jpg
)

 

Т.е. название картинки 256.jpg есть, но в mysql это название не попадает и куда там вставить код чтобы картинка загружалась не знаю -/

Link to comment
Share on other sites

Но, вот если вывести тоже самое внутри функции copyFromPost():

 

   protected function copyFromPost(&$object, $table)
   {
    /* Classical fields */
    foreach ($_POST AS $key => $value) {
	    if (key_exists($key, $object) AND $key != 'id_'.$table) {
		    $object->{$key} = $value;
		    print_r($object);exit;
	    }
    }
.......................

 

То получаю уже:

 

News Object
(
   [meta_title] => Array
    (
	    [6] => Текст
	    [9] => Текст
    )
   [meta_description] => Array
    (
	    [6] => Текст
	    [9] =>
    )
   [meta_keywords] => Array
    (
	    [6] =>
	    [9] =>
    )
   [img_name] => Array
    (
	    [6] => g
	    [9] =>
    )

 

Где img_name идет просто буква g...

Link to comment
Share on other sites

Настройкой объекта можно сделать автоматическое сохранение картинки в папку, правда с идентификатором записи, а не с исходным именем.

 

Ваш код и не должен сохранять имя картинки. Поле файла не содержит в своем значении название файла. Получайте название файла как обычно.

Link to comment
Share on other sites

Да я не знаю куда что подставлять!!

 

Добавил в шаблон поле: <input type="file" name="img" size="100" />

 

В:

 

elseif (Tools::getValue('submitAdd'.$this->table))
    {
.....
}

 

Пытаюсь в разных местах получить название картинки и воткнуть его в переменную и не получается(

 

Вот на это например: $img_name = $_FILES['img']['name']; ругается Notice: Undefined index: img in...

 

Есть вот такой кусок кода из другого модуля и хз куда его поместить чтобы все работало:

 

    /* upload the image */
	    if (isset($_FILES['img_name']) AND isset($_FILES['img_name']['tmp_name']) AND !empty($_FILES['img_name']['tmp_name']))
	    {
	    /* 102400 bytes = 100KB */
	    if ($error = checkImage($_FILES['img_name'], $this->maxImageSize))
	    {
		    $this->_html .= $this->displayError($error);
		    return false;
	    }	 
	    if (!move_uploaded_file($_FILES['img_name']['tmp_name'], dirname(__FILE__).'/img/'.$_FILES['img_name']['name']))
	    {
		    $this->_html .= $this->displayError($this->l('Error move uploaded file'));
		    return false;
	    }		
	    $namefile = $_FILES['img_name']['name'];
	    }[/size][/font][/color]
[color=#000000][font=Arial, Verdana, Helvetica, sans-serif][size=3]		    if (Tools::getValue('title') == '' OR empty($_FILES['img_name']['name']))
	    $errors[] = $this->l('You must complete the following fields: title and image.');[/size][/font][/color]
[color=#000000][font=Arial, Verdana, Helvetica, sans-serif][size=3]		    elseif (!preg_match('/.+\.(jpg|png|gif)$/',  strtolower($_FILES['img_name']['name'])))
	    $errors[] = $this->l('The format should be only of type:    jpg, png, gif');  [/size][/font][/color]
[color=#000000][font=Arial, Verdana, Helvetica, sans-serif][size=3]		    elseif (file_exists(_PS_MODULE_DIR_.$this->name.'/img/'.$_FILES['img_name']['name']))
	    $errors[] = $this->l('The image file in the directory already exists'); 
Link to comment
Share on other sites

Разобраться самому мазгов в общем не хватило -/ переделал на textarea с TinyMCE и через TinyMCE гружу картинки..

Переделывал модуль newscore для того чтобы в списке новостей выводить свою фотку к каждой новости.

 

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

Link to comment
Share on other sites

Я посмотрю, но пока не уверен что мне там что то поможет, я уделил этому вопросу достаточно времени и смотрел как реализована подргузка картинки настройках категории и загрузка файла к товару и загрузка картинки при создании cms страниц и в модуле вывода текста на главной странице и на сколько я понял код в админских табах отличается от кода в модулях и там много переделывать надо..у админских табов как я понял есть один файл обработчик AdminTab.php в который вынесены все главные функции. В общем покавырялся там в файлах изучил и понял что взять код с админских табов и внедрить в модуль не смогу своими силами, это находиться на грани моего понимания -/

Link to comment
Share on other sites

×
×
  • Create New...