Плагин Symfony sfDoctrineActAsTaggablePlugin не работает - PullRequest
0 голосов
/ 29 июня 2010

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

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

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

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, с тем же результатом.

Ваша помощь будет принята с благодарностью.

Спасибо

FuzzyTern


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

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

Ответы [ 3 ]

2 голосов
/ 01 июля 2010

Ух ты! Наконец-то я решил эту проблему!

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

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

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

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

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

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

Приветствия

0 голосов
/ 30 июня 2010

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

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

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

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

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

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

ModelClass:
  actAs:
    Taggable:
  columns: //etc

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

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

0 голосов
/ 29 июня 2010

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

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

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