You should start with models first, and create all models that you might need for you application. Then, based on model, you can create CRUD actions for each model(note that not all models need to have their own controller).
For admin, you can create new module and to keep all admin related controllers in this module. And yes, you can share same model between few controllers or modules.
I noticed in the Blog tutorial example here that when a post is created they have the tags created within the post model, like so:
$this->dbConnection->createCommand("INSERT INTO PostTag (postId, tagId) VALUES ({$this->id},{$tag->id})")->execute();
However, this means that only the post model can create tags. Wouldn’t it be smarter to implement all tag related operations in the tag model?
If I would have created this application without a framework, I’d have a class for tags that would insert a new tag. To do the same with Yii, would I have to create a new function in the tag model and call the function from the post model? Is that the “proper” way to do this?
$this->dbConnection->createCommand("INSERT INTO PostTag (postId, tagId) VALUES ({$this->id},{$tag->id})")->execute();
isn’t creating new tags, it’s actually inserting records into a cross reference or intersect table – PostTag – which resolves the Many to Many relationship between Post and Tag.