- Tham gia
- 28/02/2015
- Bài viết
- 17,149
- Được Like
- 12,745
Thêm lĩnh vực bổ sung cho bất kỳ nội dung sử dụng bảng riêng biệt
Tôi muốn chia sẻ kinh nghiệm của tôi về việc thêm lĩnh vực bổ sung cho xây dựng bất kỳ trong nội dung. Hãy xem xét các addon wiki. Bài báo và ý kiến của nó là bài mở rộng trong một số tiền 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 với bảng bổ sung nội dung và autolinking kể từ khi xử lý sẽ giết hiệu suất.
Chúng ta cần lĩnh vực bổ sung message_prepared để chuẩn bị cho điều đó.
Có 2 cách để thêm 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:
Model_Thread:
Và phần quan trọng nhất: DataWriter phải chèn một dòng của bảng bổ sung nếu bài viết là một wiki-article, nếu không nó phải xóa các dòng.
DataWriter_DiscussionMessage_Post:
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.
Tôi muốn chia sẻ kinh nghiệm của tôi về việc thêm lĩnh vực bổ sung cho xây dựng bất kỳ trong nội dung. Hãy xem xét các addon wiki. Bài báo và ý kiến của nó là bài mở rộng trong một số tiền 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 với bảng bổ sung nội dung và autolinking kể từ khi xử lý sẽ giết hiệu suất.
Chúng ta cần lĩnh vực bổ sung message_prepared để chuẩn bị cho điều đó.
Có 2 cách để thêm nó:
- Thay đổi bảng xf_post
- Tham gia bảng social_wiki_post khác
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 joined
if(!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 bổ sung nếu bài viết là một wiki-article, 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 table
protected function _needWikiTable()
{
return !$this->get('position') && Social_Helper_Thread::typeView('wiki',$this->getMergedData(), false);
}
// main part of the code
protected 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.com
Bài viết liên quan
Bài viết mới
Bị lỗi data
bởi bloghocpiano,