1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Integrate add-on with search

Discussion in 'XenForo Development Discussions' started by Onimua, Feb 16, 2011.

  1. Onimua

    Onimua Well-Known Member

    Is there a tutorial, if possible, to how how to integrate your add-on content with search?

    If I've got a lot of notes I'd like to be able to search them within XenForo and have them display along with possibly related posts/threads. I imagine it is possible but not sure of how to approach it.
  2. Shadab

    Shadab Well-Known Member

    I didn't try implementing search for an addon, until today. It was much easier than I thought. It's a 4 step process, where you need to implement the following interfaces/handlers:
    • A search handler class
    • Form template (for displaying the search form)
    • Search Results template (for displaying search result snippets)
    • And finally the code that manipulates search index at _postSave and _postDelete
    I'll outline the procedure for "Scratchpad" addon...

    1. Content-type & Content Field

    Insert a record in the xf_content_type table and xf_content_type_field table, adding your content-type name and the search handler's class name. For this addon, I used the following info:
    | content_type    | addon_id   |
    | scratchpad_note | scratchpad |
    | content_type    | field_name           | field_value                        |
    | scratchpad_note | search_handler_class | Scratchpad_Search_DataHandler_Note |

    2. Search Data Handler

    Now create the data handler class: Scratchpad_Search_DataHandler_Note. This class should extend the abstract data handler (XenForo_Search_DataHandler_Abstract), and implement about 10 required methods. It would help if your model has methods that return data in the format specified below; although it's not absolutely required.
    • Multiple content records, when supplied an array of IDs.
      For fetching multiple notes I've used: getNotesByIds(array)​

    • List of next X IDs, when supplied a start ID and the limit
      For fetching this list I've used: getNoteIdsInRange(int, int)​

    3. Form template:

    Created a form template "search_form_note", based on an existing form template "search_form_post". Form fields for displaying the list of nodes and other fields not relevant to the scratchpad, were removed.

    4. Results template:

    Created a search results template "search_result_note", based on an existing results template "search_result_post". Except for variable names, pretty much everything else was left unchanged.

    5. DataWriter hooks for _postSave and _postDelete

    The Notes datawriter now includes a _postSave method, which would be used for inserting the note "message" into the search index; and a _postDelete method, which would be used for removing the deleted "note" from the search index.


    Search Notes Form page:

    Notes Search Results page:

    Search Everything Results page:
    (showing forum posts + scratchpad notes as results)


    Demonstration Addon:

    Original thread:

    Attached Files:

    AlexT, Micheal, Wuebit and 1 other person like this.
  3. Onimua

    Onimua Well-Known Member

    Happy to hear it wasn't much of a twist to get it in. I'll definitely try this out now to see how I progress.

    Thanks for looking into this! :D
  4. Shadab

    Shadab Well-Known Member

    *Attached the addon in my previous post*

    To get to the type-specific search form (screenie #1), you'll have to manually visit:
    Onimua likes this.
  5. ragtek

    ragtek Guest

    Oh man, i wish this was posted yesterday, as i had to implement the search for my add-on:D
    Liam23 likes this.
  6. Jaxel

    Jaxel Well-Known Member

    Sweet... this is awesome... I have one question though... This is what I am using:
    	protected function _insertIntoIndex(XenForo_Search_Indexer $indexer, array $data, array $parentData = null)
    		$metaData = array();
    		if ($data['media_keywords']) { $metaData['media_keywords'] = $data['media_keywords']; }
    		if ($data['media_custom1']) { $metaData['media_custom1'] = $data['media_custom1']; }
    		if ($data['media_custom2']) { $metaData['media_custom2'] = $data['media_custom2']; }
    		if ($data['media_custom3']) { $metaData['media_custom3'] = $data['media_custom3']; }
    		if ($data['media_custom4']) { $metaData['media_custom4'] = $data['media_custom4']; }
    		if ($data['media_custom5']) { $metaData['media_custom5'] = $data['media_custom5']; }
    			'media', $data['media_id'], $data['media_title'], $data['media_description'],
    			$data['media_date'], $data['user_id'], 0, $metaData
    How do I get the search system to also search for text in media_keywords and media_custom#?

    As well as sorting by views, comments and likes?

Share This Page