0 Пользователей и 1 Гость просматривают эту тему.
  • 14 Ответов
  • 2875 Просмотров
*

sanitar

  • Новичок
  • 8
  • 0 / 0
JFactory::getApplication()->input пустой
« : 28.11.2017, 18:46:43 »
добрый день.
компонент мой собственный.всё работает,данные в бд пишет.пытаюсь добавить к форме поле для загрузки файла.прочёл что после отправки надо обрабатывать файл в методе prepareTable
добавил в файл модели такой код:
Код
	protected function prepareTable(&$table){

$jinput = JFactory::getApplication()->input;
$files = $jinput->post->get('jform');
$file   = $files;
$filename = "/log.txt";
$string = $file;
$f = fopen($filename,"a+");
fwrite($f,$string);
fclose($f);
}

$files оказывается пустой.даже не массив.что я сделал не так?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: JFactory::getApplication()->input пустой
« Ответ #1 : 28.11.2017, 23:00:15 »
Неудивительно, что Joomla теряет позицию :(.
Вам еще рано писать компонент.
1. Какие $_FILES могут быть в $_POST?
2. Зачем делать $file   = $files;, чтобы потом делать $string = $file;?
3. Скажите спасибо, что
$files даже не массив
, а то PHP с ума сошел бы от fwrite($f,$string);.

Не будь паразитом, сделай что-нибудь самостоятельно!
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Re: JFactory::getApplication()->input пустой
« Ответ #2 : 28.11.2017, 23:02:09 »
прочёл что после отправки надо обрабатывать файл в методе prepareTable
где такое пишут?

В контроллере
$files = $this->input->files->get('jform', array(), 'array');
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: JFactory::getApplication()->input пустой
« Ответ #3 : 29.11.2017, 00:04:27 »
В контроллере
Я в моделе обычно делаю если мы о компоненте говорим. Там удобнее. Да и логичнее.

Тс воспользуйтесь поиском на форуме не раз обсуждали. Там и примеры реализаций есть и другие премудрости.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Re: JFactory::getApplication()->input пустой
« Ответ #4 : 29.11.2017, 00:32:42 »
Да и логичнее.
А в чем логика данные формы моделью ловить?
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: JFactory::getApplication()->input пустой
« Ответ #5 : 29.11.2017, 01:02:29 »
А в чем логика данные формы моделью ловить?
А где по твоему все данные формы обрабатываются=) + не придется функцию контролера переписывать.  *DRINK* Можно в функции validation все проверить и уже вернуть валидную дату полную уже с файлами.

Иначе получиться предеться функцию контролера полностью переписывать, функцию валидации в модели и функцию save. Куча лишнего кода и доп трудозатраты=>не логично
« Последнее редактирование: 29.11.2017, 01:16:26 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

sanitar

  • Новичок
  • 8
  • 0 / 0
Re: JFactory::getApplication()->input пустой
« Ответ #6 : 29.11.2017, 02:50:53 »
Неудивительно, что Joomla теряет позицию :(.
Вам еще рано писать компонент.
1. Какие $_FILES могут быть в $_POST?
2. Зачем делать $file   = $files;, чтобы потом делать $string = $file;?
3. Скажите спасибо, что, а то PHP с ума сошел бы от fwrite($f,$string);.

1)а где вы увидели обращение к суперглобальному массиву $_FILES ?
2)это уже атавизм,от многочисленных попыток в разном виде получить данные массива jform.не заметил,когда лишнее затирал.
3)не скажу.это жест отчаяния.если б он был с данными-он записал по крайней мере в файл строку "Array".хоть что-то,чтоб было понятно что данные какие-то разбирает.у меня-же тишина,массив jform как будто не существует.


Цитировать
где такое пишут?
нашёл тут https://stackoverflow.com/questions/16731057/file-upload-using-jform
и тут https://stackoverflow.com/questions/18442079/joomla-2-5-mvc-model-preparetable-function

пробовал и из ссылок $files  = $jinput->files->get('jform');
эффект тот-же
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: JFactory::getApplication()->input пустой
« Ответ #7 : 29.11.2017, 06:57:19 »
1)а где вы увидели обращение к суперглобальному массиву $_FILES ?
$jinput->post - это и есть $_POST. А где вы собираетесь найти файлы, если не в $_FILES?
3. Это значит, что элемент jform вообще нигде не существует.
нашёл тут
И где написано, что
надо обрабатывать файл в методе prepareTable
?
« Последнее редактирование: 29.11.2017, 07:02:42 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: JFactory::getApplication()->input пустой
« Ответ #8 : 29.11.2017, 10:06:37 »
А где по твоему все данные формы обрабатываются
@Septdir IMHO, данные должны обрабатываться в контроллере, а модель ничего не должна об этом знать.
Например, в одном моем компоненте требуется сохранять файлы и доп.данные в другие таблицы, но только после успешного сохранения основных данных в основную таблицу. Как все это делать в validate()?
И странно было бы видеть, как validate(), кроме проверки валидности, должна еще получать всякие $_FILES и $_REQUEST, их обрабатывать, сохранять...Я бы никогда не догадался такое в ней искать :).
Конечно, MVC - условное разделение и у каждого свой вкус, но лучше придерживаться некоторых общих правил, код-то по-любому нужно писать.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: JFactory::getApplication()->input пустой
« Ответ #9 : 29.11.2017, 11:35:36 »
@Septdir IMHO, данные должны обрабатываться в контроллере, а модель ничего не должна об этом знать.
Например, в одном моем компоненте требуется сохранять файлы и доп.данные в другие таблицы, но только после успешного сохранения основных данных в основную таблицу. Как все это делать в validate()?
И странно было бы видеть, как validate(), кроме проверки валидности, должна еще получать всякие $_FILES и $_REQUEST, их обрабатывать, сохранять...Я бы никогда не догадался такое в ней искать :).
Конечно, MVC - условное разделение и у каждого свой вкус, но лучше придерживаться некоторых общих правил, код-то по-любому нужно писать.
 
По сути функция validate проверяет значения и возвращает $validateData в контролер последующий для передачи в функцию save.
Для этого кроме преданной в нее $data из контролера, она еще много чего получает. В случае с файлами ничего плохо в том что там будет их получение
не будет. Там же их и проверить. Тип файлов, если поле обязательное, то и заполненость ну и т.д и вернуть уже в нужном виде добавив к массиву $validateData['files']

Сама заливка уже будет в функции модели save после сохранения.

По сути все что делает контролер. Это получает данные через jinput передает их функциям модели сначала в validate потом в save и делает редирект.
Обработка, проверка данных к примеру сжать json, поменять alias и т.д делается в model или table(кстати с table мне не особо нравиться, когда все данные формируются в table а проверку ailas делают в model). и передаются в table.
Так сделано в Joomla.


Если по хорошему, можно сделать так
Контролер: получили все данные ->
Модель: проверили ->
Контролер: сформировали в нужный вид, если надо обрщаемся в моедль ->
Модель: залили в базу итем вернули id ->
Контролер: получили файлы ->
Модель: залили файлы(отдельная функция)->
Контролер: редирект или вьюху

Но опять таки момент спорный
« Последнее редактирование: 29.11.2017, 11:54:16 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

sanitar

  • Новичок
  • 8
  • 0 / 0
Re: JFactory::getApplication()->input пустой
« Ответ #10 : 29.11.2017, 12:12:09 »
И где написано, что?

As far as I know, you need to process the field manually in your models prepareTable function.

собственно опираясь на эту строку я стал копать именно в эту сторону.
*

sanitar

  • Новичок
  • 8
  • 0 / 0
Re: JFactory::getApplication()->input пустой
« Ответ #11 : 04.12.2017, 05:26:29 »
всё,кажись понял.для последующих "поколений" напишу решение(ну и на всякий случай,может меня поправят в случае если это не самое хорошее решение)
в контроллере:

public function save( $key = null, $urlVar = null )
{
 $app = JFactory::getApplication()->input;
 $data = $app->files->get('jform');
 return parent::save( $key, $urlVar );
}

тут в $data получите массив

Код
[fff] => Array
        (
            [name] => 092.gif
            [type] => image/gif
            [tmp_name] => Z:\tmp\php56C2.tmp
            [error] => 0
            [size] => 260864
        )

где в моём случае fff это поле для файла на форме.
*

sanitar

  • Новичок
  • 8
  • 0 / 0
Re: JFactory::getApplication()->input пустой
« Ответ #12 : 05.12.2017, 17:03:14 »
господа знатоки,всё-равно нужна ваша помощь.
$app->post->get( 'jform', array(), 'array' ) это

Код
(
    [inputs:protected] => Array
        (
        )

    [options:protected] => Array
        (
        )

    [filter:protected] => Joomla\Filter\InputFilter Object
        (
            [tagsArray] => Array
                (
                )

            [attrArray] => Array
                (
                )

            [tagsMethod] => 0
            [attrMethod] => 0
            [xssAuto] => 1
            [tagBlacklist] => Array
                (
                    [0] => applet
                    [1] => body
                    [2] => bgsound
                    [3] => base
                    [4] => basefont
                    [5] => embed
                    [6] => frame
                    [7] => frameset
                    [8] => head
                    [9] => HTML
                    [10] => id
                    [11] => iframe
                    [12] => ilayer
                    [13] => layer
                    [14] => link
                    [15] => meta
                    [16] => name
                    [17] => object
                    [18] => script
                    [19] => style
                    [20] => title
                    [21] => XML
                )

            [attrBlacklist] => Array
                (
                    [0] => action
                    [1] => background
                    [2] => codebase
                    [3] => dynsrc
                    [4] => formaction
                    [5] => lowsrc
                )

            [blacklistedChars:Joomla\Filter\InputFilter:private] => Array
                (
                    [0] => &tab;
                    [1] => &space;
                    [2] => :
                    [3] => &column;
                )

        )

    [data:protected] => Array
        (
            [jform] => Array
                (
                    [id] => 1
                    [name] => fgh
                    [price] => 10
                )

            [87767693192c158eee14851269add72b] => 1
            [task] => item.apply
        )

)

нужно добавить в массив jform элемент.пробую хотя-бы изменить существующие уже-не получается.
на такую конструкцию вообще ругается $app->set(['data:protected']['jform']['price'], $a['item'] );
если что-$app = JFactory::getApplication()->input;
даже при попытке прямого обращения к $app->set('price', '' ); ничего не происходит,данные не изменяются.
подкиньте мысль,как правильно доковыряться до этих переменных?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: JFactory::getApplication()->input пустой
« Ответ #13 : 05.12.2017, 22:38:48 »
Код
$input = JFactory::getApplication()->input;
$post = $input->post->get('jform', array(), 'array');
$post['price'] = $a['item'];
$input->post->set('jform', $post);
Не будь паразитом, сделай что-нибудь самостоятельно!
*

sanitar

  • Новичок
  • 8
  • 0 / 0
Re: JFactory::getApplication()->input пустой
« Ответ #14 : 06.12.2017, 03:01:03 »
всё гениальное-простынь ^-^

ощущаю себя идиотом.
спасибо за помощь.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Поиск выдает пустой результат

Автор illimited

Ответов: 5
Просмотров: 1437
Последний ответ 17.08.2022, 21:46:40
от illimited