Категории

[FAQ] Часто задаваемые вопросы и ответы

Проблемы и решения

Ошибки и исправления

Общие вопросы

Расширения

Установка и обновление

Модули

Шаблоны

Локализация интерфейса

Коммерческие предложения

Учимся бизнесу

Бизнес книги

Поисковая оптимизация (SEO)

Магазины на ShopOS

Хостинг для ShopOS

Предложения и пожелания

Курилка

Можно ли вынести некоторые функции из админки?

Евгений, вопрос лично к Вам. Кроме Вас думаю никто мне подсказать не сумеет.

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

Подскажите пожалуйста как лучше и БЕЗОПАСНЕЕ это сделать? Приходилось ли Вам "выносить" функции, которые изначально считались только админскими?

Заранее спасибо за ответ, на такой не тривиальный вопрос.


нет. лучше не давать доступ даже к некоторым страницам админки обычным пользователям

создаете отдельную страницу в магазине. и делаете отдельно все нужные функции.

или даже ничего не создавать, а добавить в account_edit.php

как загружать файл

отправляем формочку

<form enctype="multipart/form-data" action="file.php" method="POST">
<input type="file" name="csv"  style="width:250px"/>
<input type=submit value="OK">
</form>


а в file.php

принимаем его

) )
{

  $csv_upload = os_try_upload('csv', _IMPORT);

}


с таким кодом - файл уйдет в папку media/import/

и не забываем форматы файлов проверять. чтобы php файл не отправили или какой еще код


только копированием кода со страниц админки или реализацией с 0я.

так уж точно будет безопаснее)))


Я открывать админские страницы даже и не думал. Однако мне могут понадобитсья некоторые из админских функций.
К примеру, хотелось бы организовать запись аватара прямо в таблицу пользовательских данных.
Привлекает форма загрузки как на странице создания производителя. Вот код, как я понимаю:

$dir_manufacturers=dir_path('images')."/manufacturers";
    if ($manufacturers_image = &os_try_upload('manufacturers_image', $dir_manufacturers)) {
        os_db_query("update " . TABLE_MANUFACTURERS . " set
                                manufacturers_image ='manufacturers/".$manufacturers_image->filename . "'
                                where manufacturers_id = '" . os_db_input($manufacturers_id) . "'");
    }

Я бы тоже хотел создать папочку, типа users_avatars и грузить картинки туда. Но тут используется функция os_try_upload(), а в ней в свою очередь функция из файла upload.php в админской части.

Что посоветуете сделать? Создать копию файла upload.php на общедоступной части и тогда заиспользовать функции?

Как лучше, проще и безопаснее сделать?


Спасибо за Ваши ответы, Евгений. Мне они всегда помогают.

В принципе, я уже выбрал стратегию по данному вопросу и рад что Ваши ответы подтвердили мои мысли.



Я открывать админские страницы даже и не думал. Однако мне могут понадобитсья некоторые из админских функций.
К примеру, хотелось бы организовать запись аватара прямо в таблицу пользовательских данных.
Привлекает форма загрузки как на странице создания производителя. Вот код, как я понимаю:

$dir_manufacturers=dir_path('images')."/manufacturers";
    if ($manufacturers_image = &os_try_upload('manufacturers_image', $dir_manufacturers)) {
        os_db_query("update " . TABLE_MANUFACTURERS . " set
                                manufacturers_image ='manufacturers/".$manufacturers_image->filename . "'
                                where manufacturers_id = '" . os_db_input($manufacturers_id) . "'");
    }

Я бы тоже хотел создать папочку, типа users_avatars и грузить картинки туда. Но тут используется функция os_try_upload(), а в ней в свою очередь функция из файла upload.php в админской части.

Что посоветуете сделать? Создать копию файла upload.php на общедоступной части и тогда заиспользовать функции?

Как лучше, проще и безопаснее сделать?


так а подключить класс upload из админки нельзя?



Спасибо за Ваши ответы, Евгений. Мне они всегда помогают.

В принципе, я уже выбрал стратегию по данному вопросу и рад что Ваши ответы подтвердили мои мысли.


не. ну код ладно

но классы лучше стандартные использовать. не копируя их)


имeнно тaк и рeшил. Создaл новый фaйл в пaпкe include/functions/extensions.php и подключил eго. Тудa буду выносить или писaть новыe функции. А клaссы подключaть eсли нaдо. Тaк и aпгрeйд дeлaть будeт прощe.
Кстaти, подскaжитe плиз кaк сдeлaть провeрку нa тип фaйлa?гдe можeт функция eсть?


Возникла трабла. Вынес необходимые функции для загрузки картинки, которые используются в файле manufacturers.php
в админке, а так же подключил класс upload.php. Вставил в форму регистрации поле для выбора, оно появилось, кнопка для поиска файла в файловой системе тоже, выбрать файл можно. Однако в базу он не пишется.
В чем может быть затык?

Удалось выяснить, что вот это условие не выполняется:

if ($manufacturers_image = &os_try_upload('manufacturers_image', $dir_manufacturers))
А это в свою очередь означает, что конструктор класа upload завершился со значением false.

Может нельзя классы из админки подключать во внешку? Или какие-то прова нужны? В чем может быть трабла?

з.ы. из админки картинки производителей грузятся спокойно.

з.з.ы.
Может быть будет полезно, что я не стал выновить две функции из админки (os_draw_file_field() и os_draw_input_field()), а сделал все в одной. Может там ошибк? Вот код:

function os_draw_file_field($name, $required = false) {
    $value = '';
    $parameters = '';
    $type = 'file';
    $reinsert_value = true;

    $field = '<input type="' . $type . '" name="' . $name . '"';
    if (isset($GLOBALS) && ($GLOBALS) && ($reinsert_value) )
{
      $field .= ' value="' . htmlspecialchars(trim($GLOBALS)) . '"';
    }
elseif ($value != '')
{
      $field .= ' value="' . htmlspecialchars(trim($value)) . '"';
    }

    if ($parameters != '') {
      $field .= ' ' . $parameters;
    }
    $field .= '>';

    if ($required) $field .= TEXT_FIELD_REQUIRED;

    return $field;
  }

Хотя на внешний вид поле для выбора файла выглядит совершенно корректно.


NEED HELP!!! без вас не осилю на этот раз....


да что тут писать

Просто, как 5 копеек

<?php

include ('includes/top.php');

include( 'admin\includes\classes\upload.php');

$main_content = '';

function os_try_upload($file = '', $destination = '', $permissions = '777', $extensions = '')
{
$file_object = new upload($file, $destination, $permissions, $extensions);
if ($file_object->filename != '')
return $file_object;
else
return false;
}

if (is_uploaded_file($_FILES['filename']['tmp_name']) )
{

  if ($upload = &os_try_upload('filename', _TMP))
  {
      $main_content .= '<script> alert("ура, файл залит!");</script>';
 
  $main_content .= 'Файл: ' .$upload->file['name'].'<br>';
  $main_content .= 'Тип: ' .$upload->file['type'].'<br>';
  $main_content .= 'Размер: ' .$upload->file['size'].'<br>';
  $main_content .= 'Где лежит: ' .$upload->file['tmp_name'].'<br>';
  }
  else
  {
      $main_content .= '<script> alert("упс. не вышло:((");</script>';
  }
 
 

}

require (dir_path('includes').'header.php');

$form = '<form enctype="multipart/form-data" action="1.php" method="POST">
<input type="file" name="filename"  style="width:250px"/>
<input type=submit value="OK">
</form>';


$main_content .=$form;


$osTemplate->assign('language', $_SESSION['language']);
$osTemplate->assign('main_content', $main_content);
$osTemplate->caching = 0;

$osTemplate->load_filter('output', 'trimhitespace');
$template = CURRENT_TEMPLATE.'/index.html';
$osTemplate->display($template);

include ('includes/bottom.php');
?>


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



Я использую уже созданные функции. Которые, заливают картинки для производителей.


ну так функцию os_try_upload подключить вместе с файлом

admin\includes\functions\general.php

не получается

т.к. конфликт возникает

а какие тут еще специальные функции нужны?

проверяем. залился ли файл функцией is_uploaded_file в папку для временных файлов

а потом функцией os_try_upload заливаем куда нужно.

что тут еще нужно?

К тому же зачем создавать отдельный файл?


ну я показал пример, как залить файл в папку tmp

чтобы лишний код не мешал пониманию процесса заливки.


дык,я тaк и сдeлaл. В фaйлe extension.php сдeлaл копию os_try_upload(),a потом использовaл eё кaк для производитeлeй и зaписaл путь и имя фaйлa в бaзу. Зaтык в том, что онa нe зaливaeт фaйл. Единствeноe,что я нe использовaл is_uploaded_file(), потому что для производитeлeй онa нe используeтся. К тому жe я кaжeтся видeл тaкую провeрку внутри клaссa upload.


:) так в чем тогда проблема?


проблeму я описaл нeсколькими постaми вышe,a имeнно:
условиe if($user_avatar=&os_try_upload('user_avatar',$dir_avatars))
нe выполняeтся и $user_avatar->filename пустой.
Я пользую стaндaртную функцию, тaк отчeго тaкоe происходит.


АП!


я дал рабочий вариант загрузки файла. с тем же кодом

смотри как у меня сделано.


Не работает и все тут. ПОка не разобрался.

Последний вопрос - нет ли никаких ограничений на закачку файла вне админки ?



Не работает и все тут. ПОка не разобрался.

Последний вопрос - нет ли никаких ограничений на закачку файла вне админки ?


закачивайте туда, куда изначально при установке требует установить права доступа на запись

или в папку tmp

Не работает и все тут.


ну так пример возьмите тот, что написал выше. там работает

и доделайте уже все остальное, что нужно под себя


Подскажите есть ли смысл использовать функцию os_get_languages() вне админки или лучше использовать $_SESSION['languages_id'] ?


?


без разницы


Ок. Подскажите ещё плиз в каких случаях это условие может не выполняться
if (os_not_null($_POST))

p/s создал форму с двумя полями для ввода. После ввода текста и нажатии на "Продолжить", выполняется кейс где стоит вот эта проверка. Однако она не выполняется.

Почему такое может быть? Неправильные поля для ввода? Неверно передал метки?


НИкак не вкурю!


Так и не получилось загружать картинки вне админки. Проблемма в том, что условие
if (is_uploaded_file($_FILES['filename']['tmp_name']) ) - не выполняется, а если его убрать то не выполняется
if ($upload = &os_try_upload('filename', _TMP))

В общем куда не глянь везде,  alert("упс. не вышло:((");

Был бы признателен за разъяснение почему такое происходит.


) ) - не выполняется


Условие НУЖНО, так как это  проверка загрузку файла.
Если оно не выполняется, значит, загрузки нет. И дальше говорить не о чем.

А вообще, скорее всего, проблема у Вас в том, что хотите  получить СЛОЖНЫЙ функционал простыми методами, только копированием кода. А надо бы понимать и контролировать все действия кода. И исправлять именно там, где не идет. А наугад убирать-добавлять строки - это  к успеху приводит обычно только в простых ситуациях.


Не хорошего вы обо мне мнения... :D И хотя я только начал изучать html, php и smarty, но мои знания в 3-х других языках, мне помогают. Ничего тут сложного нет.

Хорошо когда код хотябы чуточку объектно-ориентирован. И когда я вижу класс, под названием upload, который берет свои корни аж с osCommerce, внутри которого уже реализована проверка на подгрузку файла в темпоральный фолдер с помощью вызова данной функции, мне кажется что делать данную проверку изначально вовсе не обязательно, хотя, конечно, вы правы она не помешает.  Хотябы для того чтобы даже не создавать объект класса upload.

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

Или может с правами проблемы? Как вы думаете? Вы же вроде хорошо шарите в html - php.




СЛОЖНЫЙ функционал


улыбнуло.. :)



Не хорошего вы обо мне мнения...


Вы ж просили разъяснение...

А вообще,  если что-то не идет как надо, то проверять работу полезно с самого начала.
В Вашем случае надо для начала  проверить, каково значение переменной  $_FILES['filename']['tmp_name'].
Если оно, например, пустое, то все дальнейшее смысл теряет.
По порядку надо идти.  А Вы опять придумываете разные 'может быть'...


Согласен. А почему значение данной переменной может быть пустым?

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



Согласен. А почему значение данной переменной может быть пустым?

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




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

НЕ слышал про такой.


Жалко. Наверное таких нет. Ладно тогда значит дедовские методы - трейсинг что-ли? Вообще что посоветуете для мониторинга значения переменных?


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


Я этим вопросом в общей сложности занимался может пару-тройку часов. А вообще уже кучу всего повыносил из админки, то что мне было нужно. Однако я таки не понимаю почему код который отлично работает из админки для загрузки картинок производителей, не работает в create_acount.php.

Там делов то, нарисовали поле для выбора файла: os_draw_file_field('manufacturers_image');
Потом засабмитили форму:
os_draw_form('manufacturers', FILENAME_MANUFACTURERS, 'action=insert', 'post', 'enctype="multipart/form-data"');

И по кейсу для экшина insert подгрузили файл и записали путь к нему в БД:

$dir_manufacturers=dir_path('images')."/manufacturers";

if ($manufacturers_image = &os_try_upload('manufacturers_image', $dir_manufacturers)) {
        os_db_query("update " . TABLE_MANUFACTURERS . " set
                                manufacturers_image ='manufacturers/".$manufacturers_image->filename . "'
                                where manufacturers_id = '" . os_db_input($manufacturers_id) . "'");
    }

Ума не приложу что тут может не работать.


Следить за переменными можно функциями ECHO, PRINT_R.  Лучше особо ничего не придумано.

Причин масса разных может быть.

Чтоб не тратить время на пустые гадания, запишите на сервер.
Если дадите FTP, попробую найти ошибку.




Источник



Copyright ShopOS