$workCats = WorkCat::find()->with(['workNames' => function(ActiveQuery $q){
return $q->with(['workPrices']);
}])->all();
foreach ($workCats as $workCat){
echo '<h2>'.$workCat->name.'</h2>';
foreach ($workCat->workNames as $workName) {
foreach ($workName->workPrices as $workPrice) {
echo '<p>'.$workName->name.' ['.$workPrice->amount.']</p>';
}
}
}
echo form->field($model, '['.$workCat->id.']['.$workName->id.'][]')->textInput();
class AuthorController extends Controller {
public function actionIndex() {
$authors = Author::find()->select(['author.id', 'author.name', 'books' => 'count(*)'])
->leftJoin('book', 'author.id = book.author_id')
->groupBy('author.id')->asArray()->all();
return $this->render('index', ['authors' => $authors]);
}
}
foreach($authors as $author){
echo '<h2>'.$author['id'].') '.$author['name'].'</h2>'; // 1) Иван И.И.
echo '<p>Книг: '.$author['books'].'</p>'; // Книг: 17
}
class MyActiveController extends yii\rest\ActiveController {
public function actions(){
return ArrayHelper::merge(parent::actions(), [
'index' => [
'class' => 'common\components\IndexAction'
]
]);
}
}
class IndexAction extends yii\rest\IndexAction {
/**
* Prepares the data provider that should return the requested collection of the models.
* @return ActiveDataProvider
*/
protected function prepareDataProvider()
{
$requestParams = Yii::$app->getRequest()->getBodyParams();
if (empty($requestParams)) {
$requestParams = Yii::$app->getRequest()->getQueryParams();
}
$filter = null;
if ($this->dataFilter !== null) {
$this->dataFilter = Yii::createObject($this->dataFilter);
if ($this->dataFilter->load($requestParams)) {
$filter = $this->dataFilter->build();
if ($filter === false) {
return $this->dataFilter;
}
}
}
if ($this->prepareDataProvider !== null) {
return call_user_func($this->prepareDataProvider, $this, $filter);
}
/* @var $modelClass \yii\db\BaseActiveRecord */
$modelClass = $this->modelClass;
// чтобы переделать это
//$query = $modelClass::find();
$query = $modelClass::find()->where(['user_id' => Yii::$app->user->id]);
if (!empty($filter)) {
$query->andWhere($filter);
}
return Yii::createObject([
'class' => ActiveDataProvider::className(),
'query' => $query,
'pagination' => [
'params' => $requestParams,
],
'sort' => [
'params' => $requestParams,
],
]);
}
}
$token = Yii::$app->security->hashData(time().'|'.$id, 'secret-key');
$data = Yii::$app->security->validateData($token, 'secret-key');
try {
list($time, $id) = explode('|', $data);
$model = MyModel::findOne($id);
if (null === $model || time() > $time + 2 * 3600) {
throw new Exception();
}
}
catch (Exception $e) {
echo 'Token invalid';
}
$model->relatedRecords
, если "все возможные связи" - то, возможно, вам нужно рассмотреть возможность именования названия всех связей так:public function getRelatedClient(){}
public function getRelatedUser(){}
public function getRelatedBooks(){}
$model->relatedClient;
$model->relatedUser;
$model->relatedBooks;
getRelated
.class Social extends ActiveRecord {
public function getPivotSocialUser(){
return $this->hasMany(SocialUser::class, ['social_id' => 'id');
}
public function getUsers(){
return $this->hasMany(User::class, ['id' => 'user_id')->via('pivotSocialUser');
}
}
class User extends ActiveRecord {
public function getPivotSocialUser(){
return $this->hasMany(SocialUser::class, ['user_id' => 'id');
}
public function getSocials(){
return $this->hasMany(Social::class, ['id' => 'social_id')->via('pivotSocialUser');
}
}
$social = Social::findOne(['name' => 'facebook']);
var_dump($social->users); // все пользователи фейсбука
$user = User::findOne(['name' => 'admin']);
var_dump($user->socials); // все социальные сети админа
interface StatusListable
{
public function getStatusName(): string;
}
trait StatusReturner
{
public static function getStatusDescriptions()
{
return [
self::STATUS_NOT_PAID => 'Не оплачено',
self::STATUS_PAID => 'Оплачено',
self::STATUS_CANCEL => 'Отменена',
];
}
public function getStatusName($status): string
{
return ArrayHelper::getValue(self::getStatusDescriptions(), $status);
}
}
abstract CrudController extends Controller {
public $modelClass;
public $searchModelClass;
public function actionIndex(){
$searchModel = new $this->searchModel;
// ...
}
public function actionView($id){
$model = $this->findModel($id);
// ...
return $this->render('view', ['model' => $model]);
}
public function actionCreate(){
$model = new $this->modelClass;
// ...
}
public function actionUpdate($id){
$model = $this->findModel($id);
// ...
}
public function actionDelete($id){
$model = $this->findModel($id);
// ...
}
private function findModel($id){
$modelCLass = new $this->modelClass;
$model = $modelClass::findOne($id);
// ...
return $model;
}
}
class ProductController extends CrudController {
public $modelClass = '\app\common\models\Product';
public $searchModelClass = '\backend\modules\product\models\Product';
}
class ItemController extends CrudController {
public $modelClass = '\app\common\models\Item';
public $searchModelClass = '\backend\modules\product\models\Item';
}
abstract CrudController extends Controller {
public $permissions = [
'index' => null,
'view' => null,
'create' => null,
'update' => null,
'delete' => null,
];
// ...
public function actionView(){
if (isset($this->permissions['view']) && !Yii::$app->user->can($this->permissions['view']){
throw new ForbiddenException();
}
}
}
class ProductController extends CrudController {
public $permissions = [
'index' => 'indexProduct',
'view' => 'viewProduct',
//...
];
}
class ItemController extends CrudController {
public function beforeAction() {
$this->permissions = array_merge(parent::$permissions, [
'view' => 'viewItem',
]);
return parent::beforeAction();
}
}
abstract CrudController extends Controller {
public $scenarios = [
'index' => Model::SCENARIO_DEFAULT,
'view' => Model::SCENARIO_DEFAULT,
'create' => Model::SCENARIO_DEFAULT,
'update' => Model::SCENARIO_DEFAULT,
'delete' => Model::SCENARIO_DEFAULT,
];
public function actionView($id){
$model = $this->findModel($id);
$model->scenario = $this->scenario['view'];
}
// ...
}
class ProductController extends CrudController {
public function beforeAction() {
$this->scenarios['view'] = Product::SCENARIO_VIEW;
return parent::beforeAction();
}
}
http://site.com/composer.json
возвращает то что надо?class SiteController extends yii\web\Controller {
public function actionFiles($name){
if (null === $file = File::findOne(['name' = $name])){
throw new NotFoundHttpException('File not found');
}
return $file->path;
}
}
'patterns' => [
'GET,HEAD /files/<name>' => 'site/files',
],
class Order {
const SECRET_KEY = 'not-log-secret-key-2213123123';
}
$token = Yii::$app->security->hashData($order->id, Order::SECRET_KEY);
Для подтверждения пройдите по <a href="http://site.domain/order/confirm?token=<?= $token ?>">ссылке</a>
class OrderController extends Controller {
public function actionConfirm($token){
if ($id = \Yii::$app->security->validateData($token, Order::SECRET_KEY)){
if (($order = Order::findOne($id)) && $order->updateAttributes(['confirmed' => true])){
Yii::$app->session->addFlash('success', 'Талон подтвержден');
return $this->redirect('orders');
}
}
throw new NotFoundHttpException();
}
}