私はFeatures
を使用してfoo
という機能を作成し、コンテンツタイプとビューを追跡して、コードで記述し、リポジトリにコミットして、最終的にステージングサーバーと運用サーバーにプッシュできるようにします。
一部のモジュール(例 http://drupal.org/project/nodequeue 、 http://drupal.org/project/views_bulk_operations 、 http:// drupal.org/project/admin_views )機能の一部としていくつかのビューを作成します。問題は、これらのビューをfoo
機能に含めることができないことです。そのため、これらの特定のビューでは、ステージングサーバーと運用サーバーに対してローカルで行ったカスタマイズを(手動で)繰り返す必要があります。
何か案は?
私が試したこと:
1)foo_features.info
ファイルに手動でビュー名を追加してみました:
features[views_view][] = admin_content_node
しかし、drush fu foo_features -y
を実行すると、その行が削除され、.info
ファイルとビュー定義がfoo_features.views_default.inc
ファイルに含まれなくなります。
2)私はデータベースを調べました:
mysql> select vid, id, display_title, display_plugin, position from views_display;
+-----+----------+---------------+----------------+----------+
| vid | id | display_title | display_plugin | position |
+-----+----------+---------------+----------------+----------+
| 3 | default | Master | default | 1 |
| 3 | page | Page | page | 2 |
| 30 | block | Block | block | 2 |
...
| 46 | default | Defaults | default | 1 |
| 46 | system_1 | System | system | 2 |
+-----+----------+---------------+----------------+----------+
その最後の行(vid:46、display_plugin:system)は疑わしいと思われたので、(SQLを介して)system
をpage
に変更しました。次に、drush cc all
を実行し、ビューを機能に含めたが運が悪かったため、[1]でプロセスを再試行しました。 「システムビューの表示」(それが何であれ)を機能に含めることはできないと思ったので、これを試しました。
これは、モジュールが提供する4つのビューから必要なビューを複製し、元のビューを無効にし、100%追跡可能なクローンですべての作業を行うことで回避できます。
Magtakが示唆しているように、これはビューを複製することで回避できます。これを機能させるには、別の名前で保存する必要があります。ビューのエクスポートとインポート(Varshithによる提案)は、ビューのマシン名を変更しているときにのみ実行できます。複製はエクスポート/インポートと同じ結果になりますが、マシン名の変更が強制され、アクションが少なくなります。
これを行う必要があるのは、これらのモジュールがビューをデータベースに入力するのではなく、ビューを追加するためです。フィーチャーにビューを追加した場合と同様に、コードを介してビューを追加します。機能は、ビューがコードに既に存在するかどうかをチェックし、存在する場合は、機能に追加することを提案しません。 (ちなみに、インターフェイスを介してコードで定義されているビューを変更すると、ビューはビューのコピーを取得してデータベースに入力します。そこに変更が保存されます。これが、ビューが定義されている理由です。いずれにしても、データベース内のモジュールによって変更されます。これは、それらに変更を加えた瞬間に発生します。これは、ビュー自体またはフィーチャーからオーバーライドされたビューを元に戻すときにも発生します。データベース内のコピーは破棄され、ビューはデフォルトでデフォルトに戻りますコード)。
クローンアプローチの欠点の1つは、その瞬間から、モジュールによって最初に追加されたビューを自分で維持することです。クローンは元のクローンから完全に独立しているため、気の利いた新機能を追加するモジュールの更新がある場合は、おそらくわかりません。そうした場合は、それらの変更を手動でクローンに追加する必要があります。別の方法は、hook_views_default_views_alter()を使用してコードに追加を追加することです。ただし、これは機能で完全にサポートされていません(機能にcanこのコードを機能に追加します。機能の.moduleファイルで追加すると、機能を再生成するときに機能がそのままになります)。コードでビューを手動で定義して何をしているのかを知る必要があります。カスタマイズされたビューのエクスポートをモジュールの元のコード(module.views_default.incにあります)と比較することで長い道のりをたどることができますが、それでもまだ気の弱い人には向いていません(そしてクローンを実行するよりも保守性が低下します)。
余談ですが、Nodequeueの場合、デフォルトで追加するビューを使用できますが、nodequeueビューを作成してクローンを作成する価値はほとんどありません。それはノードのビューであり、ノードキューの必須の関係がノードキューの重みでソートされています。デフォルトのビューのクローンを作成して変更を加えるため、ゼロから始めるのとほぼ同じです。
私も同様の問題を抱えています。私が現在行っているのは、必要なビューを1つずつエクスポートしてインポートし直してから、フィーチャーを作成してそれらも含めることができるようにすることです。
私はパーティーに少し遅れましたが、参考までに、Nodequeue設定ページの/ admin/structure/nodequeue/settingsで[キューごとに1つのビューを自動的に作成する]チェックボックスをオフにして、機能に戻ると、機能でうまくいく可能性があります。もう一度再作成してみてください。
また、機能のチェックボックスをオフにしたことを追跡します。製品版でチェックを外すのを忘れると、正しく機能しません。