2010-06-28 104 views
0

我想将一些标签赋予我的教义模型的一些对象。Symfony插件sfDoctrineActAsTaggablePlugin不能正常工作

我发现sfDoctrineActAsTaggablePlugin这似乎正是我所需要的。

的问题是,当我要救一个加标签的对象,我得到这个错误:

Unknown record property/related component "saved_tags" on "Mishidea" 

Mishidea是类/表,我想加标签的名称。

这里是我的schema.yml文件的相关部分:

Mishidea: 
    connection: doctrine 
    actAs: {Timestampable: ~ , Taggable: ~ }  
    tableName: mishidea 
    columns: 
    idea_id: 
     type: integer(4) 
     primary: true 
     autoincrement: true 
    idea_title: 
     type: string() 
     notnull: true 
     primary: false 
    idea_summary: 
     type: string() 
     notnull: true 
     primary: false 
    idea_description: 
     type: string() 
     notnull: true 
     primary: false 
    idea_up: 
     type: integer(8) 
     notnull: true 
     default: 0 
     primary: false 
    idea_down: 
     type: integer(8) 
     notnull: true 
     default: 0 
     primary: false 
    idea_confirmation: 
     type: boolean(1) 
     default: false 
     primary: false 
    group_id: 
     type: integer(4) 
     notnull: false 
     primary: false 
    relations: 
    Mishgroup: 
     local: group_id 
     foreign: group_id 
     type: one 
    Ideacomment: 
     local: idea_id 
     foreign: idea_id 
     type: many 
    Mishdocument: 
     local: idea_id 
     foreign: idea_id 
     type: many 
    RelIdeafollower: 
     local: idea_id 
     foreign: idea_id 
     type: many 

我也尝试过其它类型的语法为类的属性ACTAS如:

actAs: 
    Timestampable: ~ 
    Taggable: ~ 

和:

actAs:[Timestampable,Taggable] 

但这不是问题,因为我得到:

$timestampable0 = new Doctrine_Template_Timestampable(); 
$taggable0 = new Taggable(); 
$this->actAs($timestampable0); 
$this->actAs($taggable0); 

在我的模型的BaseMishidea.php类中。

我不明白为什么Mishidea类没有得到Taggable类应该添加的属性,因为模型似乎通过$ this-> actAs()语句添加了行为。

如何让这个插件工作?

如果这有帮助,我使用Symfony 1.4与MySQL/InnoDB和我曾经与PostgreSQL的DBMS尝试,具有相同的结果。

您的帮助将不胜感激。

感谢

FuzzyTern


EDIT1 - 关于什么说johnwards:任何人都可以确认的是,加标签的行为是在schema.yml中的文件通过添加 “ACTAS:”,而不是 “模板” ?这就是我在这里和那里阅读的内容(请参阅我对johnwards的文章的评论),但既然这两种解决方案都不适合我,我不确定。当使用“模板”关键字时,我得到:

Unknown method Mishidea::addTag 

并且不生成模型的特定类。


编辑2 - 经过进一步调查,我发现Symfony堆栈跟踪是interresting。 事实上,当我这样做:

$idea = new Mishidea(); 
$idea->save(); 

的TaggableListener被称为(8点在下面的堆栈跟踪),这表明关系的工作。但是,我不明白发生了什么,导致了例外。

堆栈跟踪:

1. at() 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record/Filter/Standard.php line 55 ... 

    public function filterGet(Doctrine_Record $record, $name) 

    { 

     throw new Doctrine_Record_UnknownPropertyException(sprintf('Unknown record property/related component "%s" on "%s"', $name, get_class($record))); 

    } 

} 

2. at Doctrine_Record_Filter_Standard->filterGet(object('Mishidea'), 'saved_tags') 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1374 ... 
3. at Doctrine_Record->_get('saved_tags', 1) 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1333 ... 
4. at Doctrine_Record->get('saved_tags') 
in n/a line n/a ... 
5. at call_user_func_array(array(object('Mishidea'), 'get'), array('saved_tags')) 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/record/sfDoctrineRecord.class.php line 212 ... 
6. at sfDoctrineRecord->__call('getSavedTags', array()) 
in n/a line n/a ... 
7. at Mishidea->getSavedTags() 
in SF_ROOT_DIR/plugins/sfDoctrineActAsTaggablePlugin/lib/TaggableTemplate.class.php line 93 ... 
8. at TaggableListener->postSave(object('Doctrine_Event')) 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record/Listener/Chain.php line 237 ... 
9. at Doctrine_Record_Listener_Chain->postSave(object('Doctrine_Event')) 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 355 ... 
10. at Doctrine_Record->invokeSaveHooks('post', 'save', object('Doctrine_Event')) 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php line 112 ... 
11. at Doctrine_Connection_UnitOfWork->saveGraph(object('Mishidea')) 
in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php line 1691 ... 
12. at Doctrine_Record->save() 
in SF_ROOT_DIR/apps/frontend/modules/idea/actions/actions.class.php line 24 ... 

如果有人想看到代码的堆栈跟踪的任何一点(只有1次在这里展开),只问。 欢迎任何建议。

回答

2

呐喊! 我终于解决了这个问题!

嗯...问题是,sfDoctrineActAsTaggablePlugin插件只能用于具有被称为“id”的id属性的可标记对象。我喜欢将实体的名称放在我的属性名称中,这就是为什么我称之为我的可标记实体“idea_id”的想法。

只要将“idea_id”替换为“id”,所有工作都像魅力一样(可能会在schema.yml中进行一些更改,甚至可能在稍后的routing.yml文件中进行更改)。

我不知道我是否足够清楚,所以不要犹豫,问我进一步的解释。

无论如何,这个插件有点令人羞愧,它不够通用(将报告给开发者)。

顺便说一句,在我的第一篇文章中写的actA的所有语法都是相同的,请根据您的喜好使用。

谢谢大家的帮助,每个回复都是一种鼓励,没有它我就没有力气去找到这个bug;)。

干杯

-1

编辑:你有没有做一个建立所有重新加载?

您需要添加模板:[Taggable]到你的模式不是actAs。

Mishidea: 
    connection: doctrine 
    actAs: [Timestampable]  
    templates: [Taggable] 
    tableName: mishidea 
    columns: 
    idea_id: 
     type: integer(4) 
     primary: true 
     autoincrement: true 
+0

谢谢johnward,但你确定吗? 确实是在官方文档上写的(见我的第一篇文章中的链接),但有些消息来源说文档是错误的,我们应该使用“actAs”,而不是“模板”。 (http://n8v.enteuxis.org/2010/05/adding-wordpress-like-tags-to-a-symfony-1-4-admin-generator-form/,http://www.mail-archive。 COM/symfony的用户@ Google网上论坛。COM/msg26173.html) 如果我按照你的建议,原则:建立 - 所有工作正常(像以前一样),但是当我使用加标签的功能之一,我得到: 未知方法Mishidea :: addTag 任何想法? – 2010-06-29 09:45:32

+0

我只是基于文档的答案。你是否搜索过你的save_tags代码来查看调用的地方? – johnwards 2010-06-29 11:47:10

+0

saved_tags只出现在插件的一部分TaggableTemplate.class.php中。我刚刚编辑我原来的帖子,以添加我得到的堆栈跟踪的一部分。它证明了这种关系是有效的,但最终我不明白什么是错的。如果这个堆栈跟踪启发你,请随时分享你的灵感:-) – 2010-06-29 14:30:53

0

可能出现的问题:

确保你有插件启用

ProjectConfiguration::setup,你应该有

$this->enablePlugins(array(
    'sfDoctrineActAsCommentablePlugin', //plus other plugins, like Doctrine 
)); 

设置你的架构正确

它应该是这样的:

ModelClass: 
    actAs: 
    Taggable: 
    columns: //etc 

您应该使用actAstemplates

我不认为你需要为标签设置明确的关系,但我可能是错的。如果你让我知道,我会编辑这个答案。