Tạo một gói lập trình?


6

Tôi đã cố gắng tìm ra vấn đề này khi cho phép người dùng tự động tạo các biểu mẫu yêu cầu dự án (thêm các trường của riêng mình bao gồm thả xuống, đa lựa chọn, v.v ...). Người dùng cần một cách để tạo nhiều loại yêu cầu dự án (gói, có lẽ?), Cho các đơn vị kinh doanh khác nhau. Tôi hình dung mối quan hệ thực thể / bó sẽ hoàn hảo cho việc này. Vì vậy, đây là ý tưởng của tôi:

Sử dụng API Schema để xác định "dự án" bảng cơ sở của tôi. Sử dụng API thực thể hook_entity_info () để nói với Drupal về thực thể mới của tôi, chỉ nó vào bảng "dự án". Bây giờ trong cái móc này tôi có thể định nghĩa các gói - thật tuyệt. Nhưng tôi cần cho người dùng để có thể tạo ra một gói. Cuộc gọi entity_create_bundle ($ entity_type, $ bundle) nằm ở đâu?

Thí dụ:

TYPE Thực thể: Dự án (với các trường phổ biến được xác định trong DB và có thể thực hiện được)

Gói: Dự án CNTT, Dự án nhân sự - chia sẻ các lĩnh vực chung từ Dự án

Một bảng project_type sẽ lưu trữ nhóm cần bổ sung mà tôi cần (yêu cầu dự án cho các đơn vị kinh doanh).

Bây giờ tôi đã đọc Phát triển Mô-đun Drupal 7 rất tuyệt, và trong chương 6, họ đã định nghĩa một "tác phẩm nghệ thuật" thực thể có một vài bó, "điêu khắc" và "vẽ". Cách họ mô tả các bước, như thể họ đang xây dựng giao diện quản trị để tạo thêm các loại tác phẩm nghệ thuật, nhưng điều này không đúng (từ những gì tôi có thể nói). Sau khi kết thúc chương, tôi chỉ có thể tạo các thực thể loại "vẽ" hoặc "điêu khắc".

Làm cách nào tôi có thể cho phép người dùng tạo các gói của loại thực thể "dự án"?

Tôi có thiếu thứ gì không hoặc chức năng chưa có [chưa]?


Bạn đã xem xét mô-đun webform? Tôi không thoải mái với ý tưởng tạo ra thực thể (bó) ... nhưng nếu bạn chắc chắn về cái này, hãy xem drupal.org/project/entityform !
nhảy

Lúc đầu tôi nghĩ điều này không liên quan gì đến những gì tôi muốn, nhưng về cơ bản họ đã làm những gì tôi cần. Trong mã, có vẻ như họ sử dụng hook_entity_info_alter () để sửa đổi "entityform_type's". Khi nào hook_entity_info_alter () được gọi chính xác? Chỉ một lần khi cài đặt, hoặc bất cứ khi nào?
Jack

1
Tôi không có nghĩa là mô-đun này sẽ thực hiện chính xác những gì tôi cần, nhưng họ tạo ra cùng loại bảng tôi làm (entityform và entityform_type), để cho phép các "gói" hoặc loại bổ sung được tạo. Tôi chỉ tự hỏi làm thế nào hook_entity_info_alter () được gọi.
Jack

hook_entity_info () và thay đổi của nó sẽ được gọi trên bộ nhớ cache. Vì vậy, nếu bạn thêm một thay đổi trong một mô-đun, tất cả những gì bạn cần làm để nó có hiệu lực là xóa bộ đệm.
Letharion

Câu trả lời:


14

Kiểm tra các gói Node mặc định

Mô-đun Node không tự tạo gói "Bài viết" và "Trang cơ bản". Sau khi đào, tôi tìm thấy các định nghĩa cho các gói này trong tệp cài đặt của hồ sơ cài đặt tiêu chuẩn.

/profiles/st Chuẩn / st Chuẩn.install

  // Insert default pre-defined node types into the database. For a complete
  // list of available node type attributes, refer to the node type API
  // documentation at: http://api.drupal.org/api/HEAD/function/hook_node_info.
  $types = array(
    array(
      'type' => 'page',
      'name' => st('Basic page'),
      'base' => 'node_content',
      'description' => st("Use <em>basic pages</em> for your static content, such as an 'About us' page."),
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
    ),
    array(
      'type' => 'article',
      'name' => st('Article'),
      'base' => 'node_content',
      'description' => st('Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.'),
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
    ),
  );

  foreach ($types as $type) {
    $type = node_type_set_defaults($type);
    node_type_save($type);
    node_add_body_field($type);
  }

  // clear the site cache

Một vài lưu ý về mã này

  1. Nó không sử dụng API thực thể
  2. st() chức năng chỉ nên được sử dụng trong quá trình cài đặt Drupal
  3. Nút chứa nhiều trường API không phải trường mà nó xử lý trong node_type_save
  4. Các cuộc gọi nút field_attach_create_bundleđể báo cho các mô-đun Trường về gói mới

Tạo một gói với API thực thể

Tôi không chắc bạn đã xác định thực thể của mình như thế nào, nhưng nếu bạn đã sử dụng API thực thể thì mã tạo gói của bạn có thể trông giống như thế này:

$bundle = new stdClass();
$bundle->type = 'project_hr';
$bundle->label = t('HR Project');
$bundle->is_new = true;
$bundle->description = t("A super cool project");

$controller = new ProjectTypeController('project_type'); //assuming you defined this extension of EntityAPIController
$controller->save($bundle);

Một lưu ý về các thực thể

  • Một kiểu thực thể là một lớp cơ sở trừu tượng
  • Gói là một lớp loại thực thể mở rộng
  • Một trường là một thành viên lớp, thuộc tính, biến hoặc trường thể hiện
  • Một thực thể là một đối tượng hoặc thể hiện của một lớp cơ sở hoặc lớp mở rộng

Tìm hiểu thêm về các thực thể


Heh - cảm ơn vì điều này ... đã gần một năm kể từ khi lớp Capstone Science Science của tôi là khi tôi cần điều này - NHƯNG cuối cùng tôi đã làm một cái gì đó tương tự như giải pháp của bạn :).
Jack

4
Tôi biết tôi đang ẩn giấu trong một câu hỏi cũ, nhưng tôi thấy nó tự hỏi Google cùng một câu hỏi. Tôi đã trả lời nó nhiều hơn vì lợi ích của riêng tôi (và những nhân viên Google có cùng chí hướng khác) so với bạn :)
tmsimont

3

Tôi đã dành khá nhiều thời gian để cố gắng để tìm ra điều này. Tôi đang làm việc trên một dự án dựa trên mô-đun Mô hình ( https://drupal.org/project/model ). Trong tập lệnh cài đặt của tôi, tôi muốn tạo các gói. Mẫu mã cho ví dụ API thực thể trong câu trả lời "Kiểm tra các gói nút mặc định" gần nhưng không hoàn toàn đúng (cũng không phải đối với tôi).

Đoạn mã sau sẽ hoạt động:

$bundles = field_info_bundles('project_type');

if (empty($bundles['project_hr'])) {
    $controller = new ProjectTypeController('project_type'); //assuming you defined this extension of EntityAPIController

    $params = array();
    $params['type'] = 'project_hr';
    $params['label'] = t('HR Project');
    $params['is_new'] = TRUE;
    $params['description'] = t('A super cool project.');

    $bundle = $controller->create($params);
    $controller->save($bundle);
}

Field_info_bundles kiểm tra xem gói có tồn tại không (vì vậy bạn không thử và tạo nó hai lần). Điều này nhận thông tin cho các gói được tạo cho thực thể project_type.

Nếu gói không tồn tại thì bạn có thể tiếp tục và tạo gói.

Trước tiên, bạn tạo một bộ điều khiển, sau đó bạn tạo một mảng tham số với các tùy chọn cho gói mà bạn muốn tạo. Sau đó, bạn sử dụng bộ điều khiển để tạo một đối tượng bó (điều này tạo ra một đối tượng PHP với tất cả các trường và phương thức thực thể "tiêu chuẩn", sau đó thêm các tham số của bạn vào đối tượng. Sau đó, bạn sử dụng bộ điều khiển để lưu gói. các gói trong cơ sở dữ liệu.

Tôi hi vọng cái này giúp được.


2

Tôi đang cố gắng làm một cái gì đó tương tự, và có vẻ như mô-đun Node đã chứa mã, vì khi bạn tạo một loại nội dung mới, nó sẽ tạo ra một gói mới cho thực thể nút và thêm trường "body" vào theo mặc định (sử dụng API trường). Tất cả các thao tác và biểu mẫu này (bảng các gói, CRUD của các gói và vv) được thực hiện bằng tay.

Nhờ các nhà phát triển Drupal, bạn có thể sao chép mã có trong mô-đun Node.

Tôi nghĩ sau này tôi có thể xuất bản tác phẩm của mình dưới dạng mô-đun drupal để tạo trực quan các thực thể và đó là hệ thống phân cấp của các gói.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.