Sam Dark писал(а):А можно сюда запостить ошибку вместе с трейсом?
Конечно. Вот лог:
Код: Выделить всё
2014/03/09 22:30:50 [127.0.0.1] [error] [yii\base\InvalidConfigException] exception 'yii\base\InvalidConfigException' with message 'The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.' in D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\data\ActiveDataProvider.php:101
Stack trace:
#0 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\data\BaseDataProvider.php(79): yii\data\ActiveDataProvider->prepareModels()
#1 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\widgets\BaseListView.php(92): yii\data\BaseDataProvider->prepare()
#2 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Object.php(49): yii\widgets\BaseListView->init()
#3 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\BaseYii.php(383): yii\base\Object->__construct(Array)
#4 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Widget.php(89): yii\BaseYii::createObject(Array)
#5 D:\OpenServer\domains\kilo.dev\advanced\frontend\views\ad\_index_loop.php(18): yii\base\Widget::widget(Array)
#6 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(292): require('D:\OpenServer\d...')
#7 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(232): yii\base\View->renderPhpFile('D:\OpenServer\d...', Array)
#8 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(135): yii\base\View->renderFile('D:\OpenServer\d...', Array, NULL)
#9 D:\OpenServer\domains\kilo.dev\advanced\frontend\views\ad\list3.php(27): yii\base\View->render('_index_loop', Array)
#10 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(292): require('D:\OpenServer\d...')
#11 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(232): yii\base\View->renderPhpFile('D:\OpenServer\d...', Array)
#12 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(135): yii\base\View->renderFile('D:\OpenServer\d...', Array, Object(frontend\controllers\AdController))
#13 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Controller.php(307): yii\base\View->render('list3', Array, Object(frontend\controllers\AdController))
#14 D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(132): yii\base\Controller->render('list3', Array)
#15 [internal function]: frontend\controllers\AdController->actionList3()
#16 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\InlineAction.php(53): call_user_func_array(Array, Array)
#17 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Controller.php(130): yii\base\InlineAction->runWithParams(Array)
#18 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Module.php(585): yii\base\Controller->runAction('list3', Array)
#19 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\web\Application.php(77): yii\base\Module->runAction('ad/list3', Array)
#20 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Application.php(289): yii\web\Application->handleRequest(Object(yii\web\Request))
#21 D:\OpenServer\domains\kilo.dev\advanced\frontend\web\index.php(14): yii\base\Application->run()
#22 {main}2014/03/09 22:30:49 [127.0.0.1] [info] [application] $_COOKIE = array (
'_csrf' => '58a0d28fd2fdce197c71152b6708fc2d38d9db39aabfec058605599f019e2ba4s:40:"a7a75857157bc2a97e3caacd33e78b116f669398";',
'PHPSESSID' => '9027sda9jmnemp9kb76q9l8ck1',
)
$_SERVER = array (
'REDIRECT_STATUS' => '200',
'HTTP_HOST' => 'kilo.dev',
'HTTP_CONNECTION' => 'keep-alive',
'HTTP_CACHE_CONTROL' => 'max-age=0',
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36',
'HTTP_ACCEPT_ENCODING' => 'gzip,deflate,sdch',
'HTTP_ACCEPT_LANGUAGE' => 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
'HTTP_COOKIE' => '_csrf=58a0d28fd2fdce197c71152b6708fc2d38d9db39aabfec058605599f019e2ba4s%3A40%3A%22a7a75857157bc2a97e3caacd33e78b116f669398%22%3B; PHPSESSID=9027sda9jmnemp9kb76q9l8ck1',
'PATH' => 'D:\\OpenServer\\modules\\php\\PHP-5.4.20\\ext;D:\\OpenServer\\modules\\imagemagick;D:\\OpenServer\\modules\\php\\PHP-5.4.20;D:\\OpenServer\\modules\\database\\MySQL-5.5.34\\bin;D:\\OpenServer\\modules\\http\\Apache-2.2.25\\bin;D:\\OpenServer\\modules\\http\\Apache-2.2.25;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\system32\\Wbem;C:\\WINDOWS\\SysWOW64',
'SystemRoot' => 'C:\\WINDOWS',
'COMSPEC' => 'C:\\WINDOWS\\system32\\cmd.exe',
'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
'WINDIR' => 'C:\\WINDOWS',
'SERVER_SIGNATURE' => '',
'SERVER_SOFTWARE' => 'Apache',
'SERVER_NAME' => 'kilo.dev',
'SERVER_ADDR' => '127.0.0.1',
'SERVER_PORT' => '80',
'REMOTE_ADDR' => '127.0.0.1',
'DOCUMENT_ROOT' => 'D:/OpenServer/domains/kilo.dev/advanced/frontend/web',
'SERVER_ADMIN' => '[no address given]',
'SCRIPT_FILENAME' => 'D:/OpenServer/domains/kilo.dev/advanced/frontend/web/index.php',
'REMOTE_PORT' => '53472',
'REDIRECT_URL' => '/ad/list3',
'GATEWAY_INTERFACE' => 'CGI/1.1',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'REQUEST_METHOD' => 'GET',
'QUERY_STRING' => '',
'REQUEST_URI' => '/ad/list3',
'SCRIPT_NAME' => '/index.php',
'PHP_SELF' => '/index.php',
'REQUEST_TIME_FLOAT' => 1394389849.203,
'REQUEST_TIME' => 1394389849,
'argv' =>
array (
),
'argc' => 0,
)
Из дебагера:
Код: Выделить всё
Time Level Category Message
22:30:49.222 trace yii\base\Module::getModule
Loading module: debug
22:30:49.231 trace yii\web\UrlManager::parseRequest
No matching URL rules. Using default URL parsing logic.
22:30:49.231 trace yii\web\Application::handleRequest
Route requested: 'ad/list3'
22:30:49.234 trace yii\base\Controller::runAction
Route to run: ad/list3
22:30:49.237 trace yii\base\InlineAction::runWithParams
Running action: frontend\controllers\AdController::actionList3()
22:30:49.247 trace yii\db\Connection::open
Opening DB connection: mysql:host=localhost;dbname=kilo_yii2
D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(122)
22:30:50.275 info yii\db\Command::queryInternal
SELECT * FROM `tbl_ad` ORDER BY `time_stamp` ASC, `paid` ASC LIMIT 5
D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(122)
22:30:50.277 info yii\db\Command::queryInternal
SHOW FULL COLUMNS FROM `tbl_ad`
D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(122)
22:30:50.301 info yii\db\Command::queryInternal
SHOW CREATE TABLE `tbl_ad`
D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(122)
22:30:50.306 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\frontend\views\ad\list3.php
D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(132)
22:30:50.306 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\frontend\views\ad\_index_loop.php
D:\OpenServer\domains\kilo.dev\advanced\frontend\views\ad\list3.php(27)
D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(132)
22:30:50.310 error yii\base\InvalidConfigException
exception 'yii\base\InvalidConfigException' with message 'The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.' in D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\data\ActiveDataProvider.php:101
Stack trace:
#0 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\data\BaseDataProvider.php(79): yii\data\ActiveDataProvider->prepareModels()
#1 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\widgets\BaseListView.php(92): yii\data\BaseDataProvider->prepare()
#2 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Object.php(49): yii\widgets\BaseListView->init()
#3 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\BaseYii.php(383): yii\base\Object->__construct(Array)
#4 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Widget.php(89): yii\BaseYii::createObject(Array)
#5 D:\OpenServer\domains\kilo.dev\advanced\frontend\views\ad\_index_loop.php(18): yii\base\Widget::widget(Array)
#6 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(292): require('D:\OpenServer\d...')
#7 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(232): yii\base\View->renderPhpFile('D:\OpenServer\d...', Array)
#8 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(135): yii\base\View->renderFile('D:\OpenServer\d...', Array, NULL)
#9 D:\OpenServer\domains\kilo.dev\advanced\frontend\views\ad\list3.php(27): yii\base\View->render('_index_loop', Array)
#10 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(292): require('D:\OpenServer\d...')
#11 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(232): yii\base\View->renderPhpFile('D:\OpenServer\d...', Array)
#12 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\View.php(135): yii\base\View->renderFile('D:\OpenServer\d...', Array, Object(frontend\controllers\AdController))
#13 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Controller.php(307): yii\base\View->render('list3', Array, Object(frontend\controllers\AdController))
#14 D:\OpenServer\domains\kilo.dev\advanced\frontend\controllers\AdController.php(132): yii\base\Controller->render('list3', Array)
#15 [internal function]: frontend\controllers\AdController->actionList3()
#16 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\InlineAction.php(53): call_user_func_array(Array, Array)
#17 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Controller.php(130): yii\base\InlineAction->runWithParams(Array)
#18 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Module.php(585): yii\base\Controller->runAction('list3', Array)
#19 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\web\Application.php(77): yii\base\Module->runAction('ad/list3', Array)
#20 D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii\base\Application.php(289): yii\web\Application->handleRequest(Object(yii\web\Request))
#21 D:\OpenServer\domains\kilo.dev\advanced\frontend\web\index.php(14): yii\base\Application->run()
#22 {main}
22:30:50.314 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/exception.php
22:30:50.315 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.316 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.317 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.318 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.319 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.320 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.321 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.322 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.323 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.324 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.325 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.326 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.327 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.328 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.329 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.330 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.331 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.332 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.333 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.334 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.335 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.336 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
22:30:50.337 trace yii\base\View::renderFile
Rendering view file: D:\OpenServer\domains\kilo.dev\advanced\vendor\yiisoft\yii2\yii/views/errorHandler/callStackItem.php
Не знаю видно или нет, но запрос SQL сам отработал, а ошибк выбивает на ActiveDataProvider. Все создавалось через gii изначально.
Контроллер:
Код: Выделить всё
<?php
namespace frontend\controllers;
use Yii;
use frontend\models\Ad;
use frontend\models\AdSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\web\VerbFilter;
use yii\db\ActiveRecord;
use yii\data\ActiveDataProvider;
...
public function actionList3()
{
//$model = new Ad;
$searchModel = new AdSearch;
#$dataProvider = $searchModel->search($_GET);
$sql = 'SELECT * FROM `tbl_ad` ORDER BY `time_stamp` ASC, `paid` ASC LIMIT 5';
$query = Ad::findBySql($sql)->all();
/* $query = Ad::find()
->orderBy('paid ASC, time_stamp DESC');*/
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
return $this->render('list3', [
'dataProvider' => $dataProvider,
'searchModel' => $searchModel,
]);
}
/**
P.S. Я специально создал отдельно экшн и вьюшку чтобы воспроизвести ошибку.
вьюшка:
Код: Выделить всё
<?php
use yii\helpers\Html;
use yii\widgets\ListView;
/**
* @var yii\web\View $this
* @var yii\data\ActiveDataProvider $dataProvider
* @var app\models\AdSearch $searchModel
*/
?>
<style>
.bg-info {
padding: 15px;
}
</style>
<!-- <div class="bs-example bs-example-bg-classes">
<p class="bg-primary">Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
<p class="bg-success">Duis mollis, est non commodo luctus, nisi erat porttitor ligula.</p>
<p class="bg-info">Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
<p class="bg-warning">Etiam porta sem malesuada magna mollis euismod.</p>
<p class="bg-danger">Donec ullamcorper nulla non metus auctor fringilla.</p>
</div> -->
<div class="row">
<?= $this->render('_index_loop', [
'dataProvider' => $dataProvider
]); ?>
</div>
Модели:
Код: Выделить всё
<?php
#namespace app\models;
namespace frontend\models;
use Yii;
use yii\base\Model;
/**
* This is the model class for table "tbl_ad".
*
* @property integer $id
* @property integer $user_id
* @property string $content
* @property boolean $paid
* @property string $time_stamp
*/
class ad extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'tbl_ad';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['user_id', 'content'], 'required'],
[['user_id', 'content'], 'string'],
[['paid'], 'boolean'],
[['time_stamp'], 'safe']
];
}
/*public function scenarios()
{
return [
'signup' => ['username', 'email', 'password'],
'resetPassword' => ['password'],
'requestPasswordResetToken' => ['email'],
];
}*/
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'user_id' => 'User ID',
'content' => 'Content',
'paid' => 'Paid',
'time_stamp' => 'Time Stamp',
];
}
}
Код: Выделить всё
<?php
namespace frontend\models;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use frontend\models\Ad;
//use yii\db\ActiveRecord;
/**
* AdSearch represents the model behind the search form about Ad.
*/
class AdSearch extends Model
{
public $id;
public $user_id;
public $content;
public $paid;
public $time_stamp;
public function rules()
{
return [
[['id', 'user_id'], 'integer'],
[['content', 'time_stamp'], 'safe'],
[['paid'], 'boolean'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'user_id' => 'User ID',
'content' => 'Content',
'paid' => 'Paid',
'time_stamp' => 'Time Stamp',
];
}
public function search($params)
{
/*$sql = 'SELECT * FROM `tbl_ad` ORDER BY `time_stamp` ASC, `paid` ASC LIMIT 5';
$query = Ad::findBySql($sql)->all();*/
$query = Ad::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$this->addCondition($query, 'content');
$this->addCondition($query, 'content', true);
return $dataProvider;
}
protected function addCondition($query, $attribute, $partialMatch = false)
{
$value = $this->$attribute;
if (trim($value) === '') {
return;
}
if ($partialMatch) {
$value = '%' . strtr($value, ['%'=>'\%', '_'=>'\_', '\\'=>'\\\\']) . '%';
$query->andWhere(['like', $attribute, $value]);
} else {
$query->andWhere([$attribute => $value]);
}
}
}