我试图在yii中为需要与所述项目关联的标签的项目构建创建表单。为了这个问题,我设置了三个表来处理这个问题。表:项目,标签(都有唯一的ID和名称)和item_tag_relation(包含2个ID)已经创建,以及必要的模型,控制器和视图。
到目前为止,所有这一切都正常运作。如果需要,我可以转到item / create,tag / create和itemTagRelation / create并单独创建每个部分。但是,我希望这三个人都属于一个页面。在此页面上,我希望能够将可变数量的标签输入到由空格分隔的文本字段中,并使表单在保存项目的同时保存标签及其关系。就像stackoverflow问题创建页面一样,现在我看一下。为此,我已经让这个javascript框MagicSuggest半工作了。
问题在于我无法从数据库加载或保存标记。我知道我可以使用ItemController将多个模型传递给视图,但是如何加载和保存变量?是否有某种yii标准方法可以同时构建和保存一堆模型?
答案 0 :(得分:0)
为你的场景加油,你需要利用扩展Yii模型的能力。
您没有发布任何代码。但是,我假设你有一个模型被用作控制器的主要模型。假设标签链接到一本书。您可以扩展书籍模型以创建一个在数据库中没有表示但在表单中使用的字段。
class Book extends CActiveRecord
{
/* Used in the form only */
public $fldBookTags;
public function rules()
{
array('title', 'required'), // title is a db field
array('fldBookTags', 'length', 'max'=>255),, // Not a db field
}
}
然后,您可以使用字段属性' fldBookTags'在你的形式像一个普通的变量。
现在,这本书被保存了。您想要保存标签。这应该只在书籍成功保存后才能完成。您可以通过覆盖属于Books模型类的afterSave()方法来完成此操作。
class Book extends CActiveRecord
{
/* Used in the form only */
public $fldBookTags;
public function rules() { ... }
public function afterSave() { ... }
}
afterSave()方法将包含存储标记所需的所有函数。请注意,$ this将包含图书属性,包括您刚刚保存的图书的主键。
public function afterSave() {
// Split the tags into its individual values
$allTags = split(" ", $this->fldBookTags);
foreach ($allTags as $itemTag) {
$tagModel = new Tag;
$tagModel->tag_name = $itemTag;
$tagModel->book_id = $this->book_id;
}
}