Other Thêm lĩnh vực bổ sung cho bất kỳ nội dung sử dụng bảng riêng biệt

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,829
Được Like
12,688
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ó:
  • Thay đổi bảng xf_post
  • Tham gia bảng social_wiki_post khác
Cách đầu tiên tất 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 với 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 bản địa này thì bảng xf_post trở nên thổi 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 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​
 
  • Like
Reactions: THB

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

XenForo 1 XenForo 2
Translate by PVS

Dịch vụ XenForo của VNXF

Mobile/Zalo: 0906081284

Telegram: anhanhxf

Chỉ nhận web nội dung lành mạnh

Nhà Tài Trợ

Mút Xốp Không Gian
Mút Sofa Không Gian
Top Bottom