drodata

drodata

这家伙有点懒,还没写个性签名!

  • 财富值1760
  • 威望值310
  • 总积分5350

个人信息

  • 官方 issues 里有一个相关的讨论:https://github.com/yiisoft/yii2/issues/8061 但该特性还未实现。

    如果表格结构复杂,通过自定义 fields() 来获取关联表的数据算不算一种办法呢?

    // 班级模型
    public function fields()
    {
        return [
            'id',
            'name',
            // 获取所有学生
            'students' => function ($model) {
                return $model->students;
            },  
            // 获取所属学校
            'school' => function ($model) {
                return $model->school;
            },  
        ];
    }
    
  • 把 console 测试代码放在事务内再测试一下。

  • 回答了问题 视图继承

    在控制器内将 $layout 声明为 false 即可,表示不使用 layout, 仅显示视图:

    class XxxController
    {
        public $layout = false;
        
        public function actionXxx()
        {
            ...
        } 
        
        ...
    }
    
  • 我想你使用 Gii 的方法存在问题。如果你要自定义 Gii, 不要在 vendor/yiisoft/yii2-gii 内直接修改,而是参照官方的建议去做,具体参考一下 YiiChina 上这个贴子:大家在实际开发中经常用Gii生产代码吗?如果用了一些后台模板,那生产的代码样式怎么处理?

    从你描述看,你是想针对某些特定的动作使用特定的 layout, 这个需求还没到使用 Gii 的地步。手动在对应的动作方法内声明一下即可:

    public function actionIndex()
    {
        $this->layout = 'xxx';
    
        // ...
    }
    

    如果你想让控制器下所有动作都使用该自定义 layout, 设置如下:

    class OrderController extends Controller
    {
        public $layout = 'xxx';
    }
    
  • 关注了
  • 你先看一下 Creating your own templates

    刚开始你可以把模板放在项目内,根据自己的需要做些改动体会一下。

  • 赞了回答

    首先 先从yii文档入手 如果觉得文档的80% 你都懂 都知道怎么用 并有一定的自己的想法 那就不妨带着自己的想法 从你觉得可以有想法的那个方法 类 还是什么开始 去解读它 那么恭喜你 就在分析他的源码了

  • “新建表单模型”的思路没问题。假设:

    • 表单模型为 PostForm, 内容大致如下:

      class PostForm extends \yii\base\Model
      {
          // 存储 Post 模型中的字段
          public $title; 
          // 存储 PostExtra 模型中的字段
          public $content;
          // 存储 PostAttachment 模型中的字段
          public $imgUrl;
        
          public function rules()
          {
              // ...
          }
      }
      
    • 一个 Post 对应一个 PostExtra;

    • 一个 Post 对应一个 PostAttachment;

    帖子修改操作的控制器代码大致如下:

    class PostController extends \yii\web\Controller
    {
        public function actionUpdate($id)
        {
            $post = Post::findOne($id);
            $extra = $post->extra;
            $attachment = $post->attachment;
    
            $postForm = new PostForm();
            $postForm->title = $post->title;
            $postForm->content = $extra->content;
            $postForm->imgUrl = $attachment->imgUrl;
    
            if ($postForm->load(Yii::$app->request->post()) && $postForm->validate()) {
                // 写入修改后的数据
            }
    
            return $this->render('update', ['postForm' => $postForm]);
        }
    }
    

    “多模型同时输入”也可以。你觉得“别扭”的三个 &&:

    • load() && load()
    • validate() && validate()
    • save() && save()

    前两个是必须的,最后一个可以放在一个事务内。过程大致如下:

    class PostController extends \yii\web\Controller
    {
        public function actionUpdate($id)
        {
            $post = Post::findOne($id);
            $extra = $post->extra;
            $attachment = $post->attachment;
    
            if (
                $post->load(Yii::$app->request->post()) 
                && $post->validate()
                && $extra->load(Yii::$app->request->post()) 
                && $extra->validate()
                && $attachment->load(Yii::$app->request->post()) 
                && $attachment->validate()
            ) {
                $transaction = Yii::$app->db->beginTransaction();
                try {
                    if (!$post->save(false)) {
                        throw new \yii\db\Exception('Failed to insert xxx.');
                    }
                    if (!$extra->save(false)) {
                        throw new \yii\db\Exception('Failed to insert xxx.');
                    }
                    if (!$attachment->save(false)) {
                        throw new \yii\db\Exception('Failed to insert xxx.');
                    }
            
                    $transaction->commit();
    
                    return $this->redirect('index');
    
                } catch(\Exception $e) {
                    $transaction->rollBack();
                    throw $e;
                }
            }
    
            return $this->render('update', [
                'post' => $post,
                'extra' => $extra,
                'attachment' => $attachment,
            ]);
        }
    }
    
副总裁 等级规则
5350/10000
资料完整度
50/100
用户活跃度
0/100

Ta的关注

6

Ta的粉丝

15

Ta的访客

63