Ошибка после заполнения форм

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Ошибка после заполнения форм

Сообщение dorofej85 »

Что за ошибка
htmlspecialchars() expects parameter 1 to be string, object given
C:\xampp\htdocs\yii2\vendor\yiisoft\yii2\helpers\BaseHtml.ph p

PHP

Код: Выделить всё

 public static function encode($content, $doubleEncode = true)
    {
А здесь на эту        return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, Yii::$app ? Yii::$app->charset : 'UTF-8', $doubleEncode);
}
Вывод форм

PHP

Код: Выделить всё

 <?= $form->field( $searchModel, 'ID') ?>
 
    <?= $form->field( $searchModel, 'name') ?>
 
    <?= $form->field( $searchModel, 'email') ?>
 
   
 Вот на эту строчку ругается <?= $form->field( $searchModel, 'typeofroom')->Dropdownlist(\frontend\models\Countbrondata::find()->all()) ?>
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение ElisDN »

В dropdownList нужно передавать массив идентификаторов и названий, а не массив ActiveRecord-объектов.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение unknownby »

dorofej85 post[code писал(а):[/code]_id=273035 time=1625478418 user_id=5787]

Код: Выделить всё

 Вот на эту строчку ругается <?= $form->field( $searchModel, 'typeofroom')->Dropdownlist(\frontend\models\Countbrondata::find()->all()) ?>
Пример использования

Код: Выделить всё

<?=  $form->field($model, 'typeofroom')->dropDownList(ArrayHelper::map(\frontend\models\Countbrondata::find()->all(), 'id', 'name')) ?>
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Да сам догадался по видео уроку - а так каким образом оформить теги вывода результата поиска
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Например параметра не 'typeofroom' а 'totalcount' -- как эти теги будут выглядить во вьюхе
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение unknownby »

dorofej85 писал(а): 2021.07.05, 13:48 Например параметра не 'typeofroom' а 'totalcount' -- как эти теги будут выглядить во вьюхе
Не совсем понятные фразы :D
Если totalcount - это поле в БД, то любое оформление будет таким, каким его отрисуете через вёрстку.
Если totalcount в GridView, то он сам напишет правильно и в нужном месте.

P.S. подразумеваю, что totalcount- это магическое число свободных комнат по типу комнаты, то внутри вашего вывода списка укажите имя метода, например, 'nameFull', сделайте в модели метод getnameFull и выводите нужную информацию, например, "Тип комнаты (цифра)".
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Код: Выделить всё

 <?php $form = ActiveForm::begin([
        'action' => ['index'],
        'method' => 'get',
    ]); ?>

    <?= $form->field( $searchModel, 'ID') ?>

    <?= $form->field( $searchModel, 'name') ?>

    <?= $form->field( $searchModel, 'email') ?>

   

    <?= $form->field( $searchModel, 'typeofroom')->Dropdownlist(ArrayHelper::map(\frontend\models\Countbrondata::find()->all(),'id','typeofroom')) ?>

    

    <div class="form-group">
        <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
        <?= Html::resetButton('Reset', ['class' => 'btn btn-outline-secondary']) ?>
    </div>

    <?php ActiveForm::end(); ?>
например вот здесь как вывести результаты поиска параметрами - ключ 'typeofroom' а значение 'totalcount ' прям напишите место и пример кода
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение rak »

dorofej85 писал(а): 2021.07.05, 14:23 прям напишите место и пример кода
:?
прочитайте уже, наконец, документацию, и уже потом задавайте вопросы.
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Там не написано как результат поиска выводить - напишите пожайлуста.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение rak »

dorofej85 писал(а): 2021.07.05, 16:00 Там не написано как результат поиска выводить - напишите пожайлуста.
написано
https://www.yiiframework.com/doc/guide/ ... -providers
https://www.yiiframework.com/doc/guide/ ... ta-widgets
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Прям покажите в какой части там отображение идет? По какой из двух ссылок. Ничего не нашел - только рендеринг формы.
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Прям покажите место где идет описание вывода отображения форм?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение rak »

вам в раздел "Предлагаю работу" нужно писать
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Ответе на простой вопрос - каком тегом выводится результаты поиска в форме
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
]); ?>

<?= $form->field( $searchModel, 'ID') ?>

<?= $form->field( $searchModel, 'name') ?>

<?= $form->field( $searchModel, 'email') ?>



<?= $form->field( $searchModel, 'typeofroom')->Dropdownlist(ArrayHelper::map(\frontend\models\Countbrondata::find()->all(),'id','typeofroom')) ?>



<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton('Reset', ['class' => 'btn btn-outline-secondary']) ?>
</div>

<?php ActiveForm::end(); ?>
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение unknownby »

dorofej85 писал(а): 2021.07.05, 18:13 Прям покажите место где идет описание вывода отображения форм?
Логика работы MVC.

Первый идёт контроллер. Он вызывает действие (экшн), которое в свою очередь отрисовывает представление. Контроллер служит взаимосвязью между моделями и представлениями.

Во-1 для того чтобы сделать в форме, в выпадающем списке как у вас в примере: Тип комнаты (цифра оставшихся номеров), нужно написать метод, который будет возвращать то, что нужно. По итогу выбор все равно будет как сейчас есть на форме. Будет выбран id и какое-то поле, в котором будет написано "Люкс (2)".
Во-2 важно понимать где этот метод написать. В вашем случае в Countbrondata, чтобы вывести идентификатор типа и наименование типа, плюс цифра оставшихся номеров.

Формулируйте правильно вопросы и будут правильные ответы. Для того чтобы научиться люди подсказывают методологию, код могут подправить, никто код писать вместо вас не будет. Иначе не научитесь так ничему. ;)
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Хорошо задаю вопрос конкретно
Вот пример
моего экшн индекс
PHP

public function actionIndex()
{
$searchModel = new Bronroomdatasearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [
//'model' => $model,
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
Если здесь метод search - если здесь метод search то он вот здесь описан
PHP

public function search($params)
{
$query = Bronroomdata::find();

// add conditions that should always apply here

$dataProvider = new ActiveDataProvider([
'query' => $query,
]);

$this->load($params);

if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}

// grid filtering conditions
$query->andFilterWhere([
// 'ID' => $this->ID,
'typeofroom' => $this->typeofroom,
//'totalcount' => $this->totalcount,
// 'incomedate' => $this->incomedate,
// 'outcomedate' => $this->outcomedate,
]);

$query
//->andFilterWhere(['like', 'name', $this->name])
//->andFilterWhere(['like', 'email', $this->email])
//->andFilterWhere(['like', 'busy', $this->busy])
->andFilterWhere(['like', 'typeofroom', $this->typeofroom]);
//->andFilterWhere(['like', 'totalcount', $this->totalcount]);
//->andFilterWhere(['like', 'Add information', $this->Add information])
// ->andFilterWhere(['like', 'image', $this->image]);

return $dataProvider;
}
и все это распространяется на форму
PHP

<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
]); ?>

<!-- <div> <?= $form->field( $searchModel, 'ID') ?>

<?= $form->field( $searchModel, 'name') ?>

<?= $form->field( $searchModel, 'email') ?></div>-->



<?= $form->field( $searchModel, 'typeofroom')->Dropdownlist(ArrayHelper::map(\frontend\models\Countbrondata::find()->all(),'id','typeofroom')) ?>



<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton('Reset', ['class' => 'btn btn-outline-secondary']) ?>
</div>

<?php ActiveForm::end(); ?>
<?php echo GridView::widget([
'dataProvider' => $dataProvider
]); ?>
конец которой можно переделать в
PHP

$userProvider->pagination->pageParam = 'user-page';
$userProvider->sort->sortParam = 'user-sort';

$postProvider->pagination->pageParam = 'post-page';
$postProvider->sort->sortParam = 'post-sort';

echo '<h1>Users</h1>';
echo GridView::widget([
'dataProvider' => $userProvider,
]);

echo '<h1>Posts</h1>';
echo GridView::widget([
'dataProvider' => $postProvider,
]);
вот надо как то настроить данные
PHP

$userProvider->pagination->pageParam = 'user-page';
$userProvider->sort->sortParam = 'user-sort';

$postProvider->pagination->pageParam = 'post-page';
$postProvider->sort->sortParam = 'post-sort';
а вернее задать данные вывода количества и качества выбранной категории воткак эти параметры настроить сейчас в результатах поиска ничего не выводится (средствами простого ПХП
проще выводить) а здесь именно надо средствами ЮИИ2 параметры настроит вот как это сделать?

Добавлено через 42 минуты
Вот данные yii/data там справа колонка
https://www.yiiframework.com/doc/api/2. ... taprovider
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение unknownby »

dorofej85 писал(а): 2021.07.06, 15:32 конец которой можно переделать в

Код: Выделить всё


$userProvider->pagination->pageParam = 'user-page';
$userProvider->sort->sortParam = 'user-sort';
 
$postProvider->pagination->pageParam = 'post-page';
$postProvider->sort->sortParam = 'post-sort';
 
echo '<h1>Users</h1>';
echo GridView::widget([
    'dataProvider' => $userProvider,
]);
 
echo '<h1>Posts</h1>';
echo GridView::widget([
    'dataProvider' => $postProvider,
]);
вот надо как то настроить данные

Код: Выделить всё

$userProvider->pagination->pageParam = 'user-page';
$userProvider->sort->sortParam = 'user-sort';
 
$postProvider->pagination->pageParam = 'post-page';
$postProvider->sort->sortParam = 'post-sort';
а вернее задать данные вывода количества и качества выбранной категории воткак эти параметры настроить сейчас в результатах поиска ничего не выводится (средствами простого ПХП
проще выводить) а здесь именно надо средствами ЮИИ2 параметры настроит вот как это сделать?
Где ваши $userProvider и $postProvider, которые собрались настраивать?
Они не приходят у вас через контроллер.
Через контроллер в представление приходят только $searchModel, $dataProvider

У вас на текущий момент есть:
1. Контроллер, который выводит всю информацию.
2. Форма, при помощи которой хотите искать информацию в таблице (можно было включить фильтрацию и поиск отпал бы)
3. Таблица, в которой выводится информация

Вы хотите вывести информацию в двух таблицах, но данные через контроллер не приходят в представление.
И не копируйте с другого форума информацию, а то тег кода не прописывается нормально и выходит каша, а не сообщение ;)
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

Вот как их верно настроить во все х частях и контроллерах и моделях $userProvider - кол-во единиц и $postProvider -сами единицы плюс сами картинки вывести плюс верно параметры $userProvider->pagination->pageParam = 'user-page';
$userProvider->sort->sortParam = 'user-sort';

$postProvider->pagination->pageParam = 'post-page';
$postProvider->sort->sortParam = 'post-sort';
Сообщите плиз?
dorofej85
Сообщения: 48
Зарегистрирован: 2013.08.23, 15:13

Re: Ошибка после заполнения форм

Сообщение dorofej85 »

или как вы включите филтр по особым параметрам особой таблицы?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Ошибка после заполнения форм

Сообщение unknownby »

dorofej85 писал(а): 2021.07.07, 12:05 или как вы включите филтр по особым параметрам особой таблицы?
Пример использования виджета из документации картика

Код: Выделить всё

    use kartik\grid\GridView;
     
    // Generate a bootstrap responsive striped table with row highlighted on hover
    echo GridView::widget([
        'dataProvider'=> $dataProvider, //Тут данные, которые взяты через запрос в контроллере
        'filterModel' => $searchModel, //Тут модель, в которой будет происходить поиск по данным из фильтра
        'columns' => $gridColumns, //тут отображение колонок, при этом фильтрация в них же прописывается по типу данных
    ]);
Примеры колонок:
Дата

Код: Выделить всё

[
        'attribute' => 'date', //поле из базы данных
        'format' => 'date',
        'filterType' => '\kartik\widgets\DatePicker',
        'filterWidgetOptions' => [
            'pluginOptions' => ['autoclose' => true, 'todayHighlight' => true],
        ],
],
Обычное текстовое поле указывается просто

Код: Выделить всё

'text',
Если нужен в фильтре выбор из списка

Код: Выделить всё

    [
        'attribute' => 'type_id', //поле в БД
        'value' => function ($model) {
            return $model->type->type_name; //отображение наименования поля переходя по связи из основной модели
        },
        'format' => 'raw',
        'filterType' => GridView::FILTER_SELECT2, //тип фильтра "выпадающий список"
        'filter' => ArrayHelper::map(Type::find()->all(), 'type_id', 'type_name'), //содержимое выпадающего списка
        'filterWidgetOptions' => [
            'pluginOptions' => ['allowClear' => true],
        ],
        'filterInputOptions' => ['placeholder' => \Yii::t('main', 'Any')],
    ],
Не совсем понятно, что значит "особый фильтр" и "особый параметр".
Только ради примера, покажу вам свой демо-магазин, он конечно не закончен ещё, но принцип фильтрации посмотрите.
Ссылка на тестовую категорию в которой есть фильтры, как вы делаете.
Т.е. отдельное представление с фильтрами, которое подключается к Таблице (в моем случае ListView, вместо GridView).

А как работают фильтры в GridView покажу скриншотами. Пример с личного сайта "Заявки по обратной связи".
Вот так выглядит страница index http://prntscr.com/198kko3
Вот так выглядит страница после поиска по Email http://prntscr.com/198kubq
Если обратите внимание, то количество записей само регулируется вверху справа. Было 7, стало 4.
Поиск самый простой

Код: Выделить всё

public function search($params)
    {
        $query = UserOrder::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [ 'defaultOrder' => ['users_orders_date' => SORT_DESC], ],
            'pagination' => [
                'pageSize' => self::ROWNUM,
            ],
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

//Тут фильтрация по текстовым полям, которые ищутся по SQL как LIKE '%поисковая информация%'
        $query->andFilterWhere(['like', 'users_orders_fio', $this->users_orders_fio])
            ->andFilterWhere(['like', 'users_orders_email', $this->users_orders_email])
            ->andFilterWhere(['like', 'users_orders_phone', $this->users_orders_phone])
            ->andFilterWhere(['like', 'users_orders_note', $this->users_orders_note]);

//Поиск по дате
        if('' != $this->users_orders_date){
            $query->andFilterWhere(['like', 'users_orders_date', date("Y-m-d", strtotime($this->users_orders_date))]);
        }

        return $dataProvider;
    }
Поиск по дате http://prntscr.com/198lvbi

Как я и показывал ранее, контроллер самый простой для данной страницы

Код: Выделить всё

public function actionIndex()
    {
        $searchModel = new UsersOrdersSearch;
        $dataProvider = $searchModel->search(\Yii::$app->getRequest()->get());

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
Ну и раз уже почти всё есть, то держите и представление index :D

Код: Выделить всё

<?php

use yii\helpers\Url;
use app\components\ActionColumn;
use yii\widgets\Pjax;
use app\components\widgets\grid\GridWidget;

$this->title = Yii::t('main', 'UserOrders');
?>
<div class="userorders-index">

    <?= $this->render('_menu', [
        'viewFileName' => 'index',
    ]) ?>

    <?php  Pjax::begin(['id' => 'userorders', 'timeout' => 0]); ?>

    <?= GridWidget::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            [
                'class' => 'kartik\grid\SerialColumn'
            ],
            'users_orders_fio',
            'users_orders_email',
            'users_orders_phone',
            'users_orders_note',
            [
                'attribute' => 'users_orders_date',
                'format' => 'date',
                'filterType' => '\kartik\widgets\DatePicker',
                'filterWidgetOptions' => [
                    'pluginOptions' => ['autoclose' => true],
                ],
            ],
            [
                'class'      => ActionColumn::className(),
                'urlCreator' => function ($action, $model, $key, $index) {
                    return Url::toRoute([$action, 'id' => $model->users_orders_id]);
                },
                'template' => '{view} {delete}',
            ],
        ],
        'toolbar' => false,
    ]); ?>

    <?php  Pjax::end(); ?>

</div>
Если нужно два вывода информации (две таблицы), то нужно в контроллере и прописывать две модели поиска, два поиска информации и передавать в представление два провайдера и два сёрча
Ответить