Я хочу привязать некоторые теги к некоторым объектам моей модели доктрины.
Я нашел 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