Hướng dẫn Hướng dẫn thêm trường bổ sung cho bất kỳ nội dung sử dụng bảng riêng biệt

PVS

Cộng Sự Đặc Biệt
Thành viên BQT
Tham gia
28/02/2015
Bài viết
14,786
Được Like
11,079
Hướng dẫn thêm trường bổ sung cho bất kỳ nội dung sử dụng bảng riêng biệt

Hãy xem xét addon wiki. Article và comment là bài viết mở rộng trong một số tiền tố xác định node. Vì vậy, có một vấn đề sau đây: chúng ta cần phải tạo ra phiên bản chuẩn bị các bài viết với bảng bổ sung nội dung và autolinking vì chỉ xử lý nó sẽ giết hiệu suất..

Chúng ta cần thêm trường message_prepared cho điều đó.
Có 2 cách để thêm nó:
  1. Alter bảng xf_post
  2. Tham gia một bảng khác social_wiki_post
Cách đầu tiên đương nhiên là đơn giản. Nhưng chúng ta cần chuẩn bị tin nhắn chỉ trong một node cố định. Node khác có thể là cửa hàng có rất nhiều lĩnh vực (giá, chứng khoán, kích thước, vv ..), khác sẽ có blog. Nếu chúng ta làm theo cách này có bảng gốc xf_postbecome hiện lên.

Vì vậy, chúng ta sẽ làm theo cách thứ hai. Hãy tạo bảng social_wiki_post và mở rộng Model và DataWriter:

Model_Post:
Mã:
class Social_Model_Post extends XFCP_Social_Model_Post{

public function preparePostJoinOptions(array $fetchOptions)
{$postJoinOptions = parent::preparePostJoinOptions($fetchOptions);
// Always left join wiki table$postJoinOptions['selectFields'] .= ',
wiki_post.message_prepared';$postJoinOptions['joinTables'] .= '
LEFT JOIN social_wiki_post AS wiki_post ON
(post.post_id = wiki_post.post_id)';

return $postJoinOptions;
}

Model_Thread:
Mã:
class Social_Model_Thread extends XFCP_Social_Model_Thread{
public function prepareThreadFetchOptions(array $fetchOptions)
{$threadFetchOptions = parent::prepareThreadFetchOptions($fetchOptions);
// Left join wiki table when first post is joinedif(!empty($fetchOptions['join']) && ($fetchOptions['join'] & self::FETCH_FIRSTPOST))
{$threadFetchOptions['selectFields'] .= ',
wiki_post.message_prepared';$threadFetchOptions['joinTables'] .= '
LEFT JOIN social_wiki_post AS wiki_post ON
(thread.first_post_id = wiki_post.post_id)';
}
}
return $threadFetchOptions;
}

Và phần quan trọng nhất: DataWriter phải chèn một dòng của bảng được thêm nếu bài viết là một bài viết wiki, nếu không nó phải xóa các dòng.

DataWriter_DiscussionMessage_Post:
Mã:
class Social_DataWriter_DiscussionMessage_Post extends XFCP_Social_DataWriter_DiscussionMessage_Post{

protected function _getFields()
{$fields = parent::_getFields();
// add extra fields for handling$fields['social_wiki_post']['post_id'] = array('type' => self::TYPE_UINT, 'default' => array('xf_post', 'post_id'), 'required' => true);$fields['social_wiki_post']['message_prepared'] = array('type' => self::TYPE_STRING, 'default' => '');

return $fields;
}
// rewrite this since post become multi-table content (compare to User DataWriter)protected function _getExistingData($data)
{
if (!$postId = $this->_getExistingPrimaryKey($data))
{
return false;
}

if (!$post = $this->_getPostModel()->getPostById($postId))
{
return false;
}

return $this->getTablesDataFromArray($post);
}
// determine if we need a wiki tableprotected function _needWikiTable()
{
return !$this->get('position') && Social_Helper_Thread::typeView('wiki',$this->getMergedData(), false);
}
// main part of the codeprotected function _insert()
{$ignoredTables = array();

if(!$this->_needWikiTable()){// forget about wiki table during insert$ignoredTables['social_wiki_post'] = $this->_fields['social_wiki_post'];
unset($this->_fields['social_wiki_post']);
}
parent::_insert();
// now remember wiki table$this->_fields += $ignoredTables;
}

protected function _update()
{
if(!$this->_needWikiTable() && sizeof($this->_existingData['social_wiki_post'])>1){// no need wiki table, delete it$condition = $this->_getUpdateCondition('social_wiki_post');$this->_db->delete('social_wiki_post', $condition);
}
if($this->get('post_id') && $this->_needWikiTable() && sizeof($this->_existingData['social_wiki_post'])==1){// need to create wiki table$this->_resolveDefaultsAndRequiredFieldsForInsert(false);$this->_db->insert('social_wiki_post', array_merge($this->_newData['social_wiki_post'], array('post_id'=>$this->get('post_id'))));
}parent::_update();
}

Bây giờ DataWriter tạo bảng wiki nếu nó cần thiết và xóa nó khi không cần thiết.
Tất nhiên bạn có thể sử dụng phương pháp này trong bất kỳ loại nội dung và thay thế tình trạng node bởi tình trạng tùy chỉnh của bạn.

Chúc các bạn thành công.


Nguồn: xenforo.rocks​
 

Hướng dẫn sử dụng

XenForo 1 XenForo 2
Translate by PVS


Nhà Tài Trợ

Mút Xốp Không Gian
pallet Thịnh Phát
Điện Lạnh Thịnh Phát
Top Bottom