Intereting Posts

Плагин Symfony sfDoctrineActAsTaggablePlugin не работает

Я хочу привязать некоторые теги к некоторым объектам моей модели доктрины.

Я нашел sfDoctrineActAsTaggablePlugin, который, кажется, именно то, что мне нужно.

Проблема в том, что когда я хочу сохранить объект Taggable, я получаю эту ошибку:

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

Mishidea – это имя класса / таблицы, в котором я хочу быть Taggable.

Вот связанная часть моего файла 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 с тем же результатом.

Ваша помощь будет высоко оценена.

благодаря

FuzzyTern


EDIT1 – Что касается сказанного johnwards: Может ли кто-нибудь подтвердить, что поведение Taggable добавлено в файле schema.yml через «actAs:», а не «шаблоны:»? Вот что я читаю здесь и там (см. Мой комментарий к сообщению johnwards), но поскольку ни один из обоих решений не работает для меня, я не уверен. При использовании ключевого слова «шаблоны» я получаю:

 Unknown method Mishidea::addTag 

и конкретные классы модели не генерируются.


EDIT2. После дальнейшего расследования я обнаружил, что трассировка стека Symfony вызывает беспокойство. Действительно, когда я это делаю:

 $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.), просто спросите. Любое предложение приветствуется.

Приветствую! Я решил эту проблему, наконец!

Ну … Проблема в том, что плагин sfDoctrineActAsTaggablePlugin работает только для объектов taggable, которые имеют свойство id, называемое точно «id». Мне нравится указывать имя объекта во имя моих свойств, поэтому я назвал идею моего объекта taggable «idea_id».

Как только я заменил «idea_id» на «id», все работало как прелесть (у вас может быть несколько изменений в schema.yml и, возможно, даже в файле routing.yml позже).

Я не знаю, достаточно ли я достаточно, поэтому не стесняйтесь спрашивать меня о дальнейших объяснениях.

В любом случае, это немного позор для этого плагина, он не является достаточно общим (сообщит об этом разработчикам).

BTW, все синтаксисы для actAs, написанные в моем первом сообщении, эквивалентны, используйте то, что вы предпочитаете.

Спасибо всем за вашу помощь, каждый ответ был поощрением, без которого у меня не было бы сил найти ошибку;).

ура

Возможные проблемы:

Убедитесь, что плагин включен

В ProjectConfiguration::setup вы должны иметь

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

Правильно настройте схему

Он должен выглядеть так:

 ModelClass: actAs: Taggable: columns: //etc 

Вы должны использовать actAs не templates .

Я не считаю, что вам нужно установить явные отношения для тегов, но я мог ошибаться. Если вы сообщите мне, я отредактирую этот ответ.

Edit: Вы сделали сборку все перезагрузки?

Вам нужно добавить шаблоны: [Taggable] к вашей схеме не actAs.

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