2013-02-06 32 views
9

Tôi đang cố gắng tạo một thành phần (giao diện người dùng) sử dụng nhiều bảng. Tôi tìm thấy 1 hoặc 2 bài trả lời một phần cho câu hỏi nhưng không ai thực sự làm. Điểm có vẻ luôn đơn giản và hiển nhiên đối với người biết làm thế nào để làm điều đó nhưng nó không bao giờ thực sự được giải thích (hoặc tôi đã bỏ lỡ bài đúng).Ghi vào nhiều bảng trong thành phần joomla?

Trong thành phần của tôi, người dùng nhập dữ liệu trong một quan điểm cho rằng cần phải được lưu trữ trong hai bảng: tiêu chuẩn Joomla bảng danh nghĩa # __users một bảng bổ sung để lưu trữ dữ liệu không được bao gồm trong Joomla tứC# __users_complements

Tôi là người mới bắt đầu, vì vậy có lẽ tôi sai, nhưng tôi hiểu rằng các chức năng chuẩn của Joomla chỉ có thể lưu kết quả của một biểu mẫu trong một bảng. Trong trường hợp của tôi, tôi đoán rằng tôi phải ghi đè các hàm chuẩn trong mô hình của mình: com_component/model/my_model.php.

1) Tôi bối rối vì tôi không thực sự hiểu chức năng nào phải được ghi đè: save()? cửa hàng()? khác?

2) Giả sử tôi ghi đè hàm save(), tôi nên viết lại tất cả mã để lưu dữ liệu (phát nổ mảng dữ liệu và tạo tất cả truy vấn cập nhật) hoặc tôi nên tạo 2 đối tượng bảng chuẩn.

Trong trường hợp này, (2 đối tượng) có vẻ lạ khi gửi mỗi lần toàn bộ mảng dữ liệu đến hàm mẹ như tôi biết rằng một phần dành cho bảng 1 và phần kia cho bảng 2. Tôi sẽ có thể chia tay trước khi tôi không?

3) Tôi có nên tạo 2 mô hình và quản lý các mô hình đó từ bộ điều khiển của mình khi tôi lấy lại dữ liệu từ biểu mẫu và gọi chức năng lưu của mô hình không?

Bạn có thể giúp tôi làm rõ cách thực hiện việc lưu này trong nhiều bảng không? Một ví dụ với mã sẽ được đánh giá rất nhiều. Cảm ơn bạn

Trả lời

18

Cuối cùng tôi đã làm được. Như tôi đã dành nhiều giờ về điều này và thấy rằng rất nhiều người tìm kiếm câu trả lời, đây là cách tôi đã làm.

Tôi cho rằng bạn biết làm thế nào để tạo ra một thành phần, sử dụng cấu trúc MVC tiêu chuẩn:

  1. phần nhập điểm
  2. Component khiển
  3. Cuối cùng phần Router
  4. Component xem
  5. Component mô hình
  6. Bộ điều khiển thành phần

Trong mô hình thành phần \ my_component \ mô hình \ my_model.php tạo chức năng riêng tiết kiệm của bạn

public function save($data) 
{ 
    // Initialise variables. 
    $userId = (!empty($data['id'])) ? $data['id'] : (int)$this->getState('user.id'); 
    $user = JFactory::getUser(); 

    $table_one = $this->getTable('TableOne', 'MyComponentTable', array()); 
    $table_two = $this->getTable('TableTwo', 'MyComponentTable', array()); 

    // Bind the data. 
    if (!$table_one->bind($data)) 
    { 
     $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError())); 
     return false; 
    } 

    if (!$table_two->bind($data)) 
    { 
     $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError())); 
     return false; 
    } 

    // Store the data. 
    if (!$table_one->save($data)) 
    { 
     $this->setError($user->getError()); 
     return false; 
    } 

    if (!$table_two->save($data)) 
    { 
     $this->setError($user->getError()); 
     return false; 
    } 

    return $user->id; 
} 

Tất nhiên, bạn cần chức năng getTable gọi trong tiết kiệm năng

public function getTable($type = 'TableOne', $prefix = 'MyComponentTable', $config = array()) 
{ 
    // call the administrator\components\com_mycomponent\tables\__tablename__.php 
    $this->addTablePath(JPATH_COMPONENT_ADMINISTRATOR . '/tables'); 
    return JTable::getInstance($type, $prefix, $config); 
} 

Và nó hoạt động! Quá dễ! Tất nhiên, như tôi đã nói trong câu hỏi của tôi, toàn bộ dữ liệu $ được gửi đến hàm save() của cha mẹ với dữ liệu không cần thiết cho table_one hoặc table_two. Nó hoạt động theo cách này với cấu trúc joomla chuẩn (không có hack hoặc truy vấn trực tiếp trong mã).

Hy vọng điều đó sẽ hữu ích.

+0

Đẹp. Điều này có lợi ích của việc kiểm tra xem bạn có thể liên kết với cả hai bảng trước khi lưu bất kỳ thứ gì không. –

+1

Trong Joomla 3 JTable lưu phương thức sử dụng bind ($ data) bên trong, vì vậy không cần phải kết buộc dữ liệu trước khi sử dụng phương thức save. – 3ehrang

2

Có thể có những người không đồng ý với cách thức sau đây phá vỡ cấu trúc MVC chỉ một chút, nhưng tôi thấy nó đơn giản nhất đối với tôi.

Thông thường, bạn có mô hình phù hợp với một trong các bảng. Trong ví dụ của bạn với đẩy dữ liệu vào bảng users cũng như một trong thành phần của bạn, tôi sẽ thêm dòng sau vào mô hình cho bảng trong thành phần của bạn:

public function save($data) { 
    if (!parent::save($data)) { 
     return false; 
    } 

    // add necessary code to save to the users table, since there isn't a standard way to do this that I'm aware of 

    // sometimes I will grab another model even 
    require_once(JPATH_BASE . '/administrator/components/com_users/models/user.php'); 
    $other_model = $this->getInstance('user', 'UsersModel'); 
    $other_model->save($data); 

    return true; 
} 

Phần đầu của chức năng này nên lưu dữ liệu vào bảng thành phần giống như bình thường. Nhưng bạn có thể tack những gì bạn cần vào phần còn lại của thành phần để làm bất cứ điều gì bạn thích xảy ra. Tôi gần như đảm bảo rằng có một cách tốt hơn để chuỗi các mô hình (và tôi đã thấy một số thay đổi xảy ra trong lõi nền tảng Joomla sẽ dẫn đến những cách tốt hơn trong tương lai), nhưng điều này sẽ giúp bạn đi cho bây giờ.

Ngoài ra, đối với dấu nhắc 3, tôi sẽ xử lý trong bộ điều khiển nếu bạn cần đôi khi chỉ lưu một bảng và đôi khi lưu cả hai. Tôi đã thấy rằng các chức năng tiết kiệm là khá an toàn để chạy ngay cả khi các bộ phận không được tải, vì vậy tôi thường chỉ để cho nó chạy.

+0

Cảm ơn David, tôi đã ưa thích một phương pháp khác (xem câu trả lời của riêng tôi). –

Các vấn đề liên quan