web-dev-qa-db-ja.com

特別な自動インクリメントフィールドを作成するにはどうすればよいですか?

不動産Webサイト用に作成された「プロパティ」コンテンツタイプがあります。プロパティコンテンツタイプには、「タイプ」と呼ばれる分類フィールドがあり、タイプは、家、オフィス、アパートなどになります...

「コード」フィールドを作成したいのですが、「H-1」のようにする必要があります。Hはホームを表し、1は増分番号でなければならないので、家にはそれぞれ異なるコードがあります。「H-1」、「H -2 "、" H-3 "..." H-188 "など。オフィス" O-1 "、" O-2 "..." O-479 "など。 Serial モジュールがあるようですが、そのモジュールは、コンテンツタイプの他のフィールドに基づいてではなく、コンテンツタイプごとに自動増分番号を作成するのに役立ちます。

auto_nodetitle + serial module + rules を使用してフィールドの文字+数値形式を作成することを計画していましたが、同じ問題が発生します:「H-1」を作成してからOfficeを作成すると、「O-2」コードが含まれ、「O-1」コードは含まれません。

私を助けることができるよりもモジュールはありますか?そうでない場合、どうすれば作成できますか?

4
Yaazkal

明白なオプションは、タイプごとにシリアルフィールドを持つことです。ビジネスルールに基づいてそれが可能かどうか(タイプがたくさんあるか、タイプが変わる可能性があるかなど)は、別の問題です。

これらのタイプの問題で非常に役立つ別のモジュールは、 計算フィールド モジュールです。

別のオプション(おそらく私が選択するもの)は、完全にカスタム化することです。 auto_nodetitle +シリアルモジュール+ルールの代わりに、データベースクエリを実行して次の値を決定するカスタムエンティティプロパティまたはなんらかのカスタムフィールド。
ただし、このようなことをするときは 競合状態 に注意してください。

2
rooby

大声で考えてください。

ルール(コンテンツの保存後)で、フィールドのデータ値を設定します。フィールド(直接入力)を設定するには、たとえば「ハウス」として「タイプ」を持つ特定のタイプのすべてのノードをカウントするPHPコードを使用し、H-(count + 1)をエコーし​​ます。

0
andrew

コメントは議論になっていたので、「最新」のノードを取得し、そのノードのコード($ code)を取得するコードを次に示します。

    <?
$terms = taxonomy_get_term_by_name($home);
$tid = $terms[0]->tid;
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'your_content_type')
  ->fieldCondition('term_fieldname', 'tid', $tid)
  ->propertyCondition('status', 1)
  ->propertyOrderBy('created', 'DESC');
$result = $query->execute();
$nid = array_keys($result['node']);
$picked_node = $nid['0'];
$node = node_load($picked_node);
$wrapper = entity_metadata_wrapper('node', $node); 
$current_code = $wrapper->field_code->value();
$new_code += $current_code;
$field_to_set = "H-$new_code";
?>

ここでは、整数フィールドを追加するという考えを使用していると想定しています。これはかなりラフでテストされていないので、php入力フォーマットの単純なページで試してみてください。変数をエコーし​​て、何が得られるかを確認します...

0
andrew