0

私は、concrete5をフレームワークとして使用して、CopperProjectやPHPCollabに似たWebベースのプロジェクト管理/コラボレーションアプリの計画段階にあります。

統合したい機能がいくつかありますが、ブロックを使用してDBテーブルがどのように生成されるかを見ると、これを実現する方法が完全にはわかりません。

私が念頭に置いている機能は次のとおりです。1)アカウントマネージャーまたはプロジェクトマネージャーが新しいクライアントを作成する場合、クライアントに3文字のプレフィックスを割り当てる必要があります。例:(運が良ければ)Dieselをクライアントとして追加する場合、プレフィックスDSLを割り当てたいと思います。

2)アカウントマネージャーまたはプロジェクトマネージャーが新しいプロジェクトを作成する場合、プロジェクトIDは、すべてのクライアントのプロジェクトの総数ではなく、クライアントに直接関連付けられている必要があります。言い換えれば、私とのディーゼルの最初のプロジェクトのプロジェクトIDは、DSL016ではなくDSL001である必要があります。これは、このプロジェクトの前に他のクライアント用のプロジェクトが15個あったためです(グローバルプロジェクトIDロジックに従うCopperとPHP Collabの両方を参照)。クライアントごとのプロジェクトIDロジックとは対照的です)。このプロジェクトIDは、AM / PMによって作成されたフロントエンドプロジェクトページに表示され、コスト見積もりや請求書などの参照IDとしても使用されます。

そこで、ワークフロー計画の観点から問題が発生します。MySQLについての私の理解では、自分のプロジェクトIDロジックに従う場合は、クライアントごとに新しいテーブルを作成して、プロジェクトに関するすべてのデータを含め、DBが正しく出力できるようにする必要があります。一意のID番号。

ただし、C5についての私の理解では、たとえば、このアプリを作成する過程で、フロントエンドテンプレートに挿入するブロックとしてプロジェクトフォームを作成することにした場合、db.xmlファイルは汎用を作成しますクライアントごとに1つではなく、すべてのクライアントのDB内のプロジェクトデータテーブル。

C5のフレームワークのコンテキストで私がやろうとしていることをどのように達成できるかについての提案はありますか?

不明な点がある場合は、プロジェクトページがどのように表示されるかのモックアップをいくつか表示できます。

ありがとう!

4

1 に答える 1

1

これは一般的なデータベース スキーマの問題であり、Concrete5 とは特に関係ありません。MySQLが一意のID番号を生成できるように、クライアントごとに個別のテーブルが必要であるというあなたの考えは、か​​なり外れています。

データベース スキーマには、レコードの「ID」番号は、内部的に (アプリケーションおよびデータベース コード内で)レコードを一意に識別するためにのみ使用する必要があるという一般原則があります。論理"。あなたの場合、文字と数字の両方を含むプロジェクト ID があるため、これに MySQL で生成された ID を使用したかったとしても、できませんでした (これらの ID は文字ではなく整数のみであるため)。

また、同じ種類のデータに対して別のテーブルを作成することは、データベースの動作とは正反対です。代わりに、クライアント用に 1 つのテーブルを、プロジェクト用に別のテーブルを用意します。クライアントテーブルには、「id」フィールド(自動インクリメント番号)とクライアントプレフィックスフィールド(この例では「DSL」)があります。次に、projects テーブルには独自の「id」フィールド (これも自動インクリメント番号) と、そのプロジェクトを client テーブルのレコードに関連付ける「client id」があります。次に、プロジェクト テーブルに「プロジェクト番号」用の別のフィールドを作成します。このプロジェクト番号フィールドは、ユーザーに表示するものです (クライアントの 3 文字のプレフィックスと組み合わせます。実際には、データベースに 2 つの個別の値を格納していることになります。

この「プロジェクト番号」フィールドは、自動インクリメント番号であってはなりませ。なぜなら、MySQL にはテーブルごとに 1 つの番号付けシーケンスしかないことがわかったからです。代わりに、アプリケーションのどこかに、新しいプロジェクトがあるときにこの番号を生成するコードがいくつかあります。そのコードは次のようになります。

function save_new_project($client_id, $project_data) {
    $db = Loader::db();

    //Determine the highest existing project number for this client
    $sql = "SELECT MAX(project_number) FROM projects WHERE client_id = ?";
    $vals = array($client_id);
    $max_project_number = $db->GetOne($sql, $vals);
    if (empty($max_project_number)) {
        $max_project_number = 0; //first project for this client
    }

    //Insert new project with next-highest number
    $new_project_number = $max_project_number + 1;
    $sql = "INSERT INTO projects (client_id, project_number, some_field, another_field) VALUES (?, ?, ?, ?)";
    $vals = array($client_id, $new_project_number, $project_data['some_field'], $project_data['another_field']);
    $db->Execute($sql, $vals);
}

ところで、Concrete5 はおそらく、この種のプロジェクトに使用するのに適したフレームワークではありません。CodeIgniter、Symfony、CakePHP、Kohana などの Web アプリケーションに適した、より一般的なフレームワークを検討することをお勧めします。

于 2013-03-18T01:00:36.460 に答える