2010-06-28 101 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

我不認爲你需要爲標籤設置明確的關係,但我可能是錯的。如果你讓我知道,我會編輯這個答案。