How many times has it happened to you? You put some Text/HTML module here, a Links module there, maybe a third-party module and you forget to change its title, mostly because you’re using a container that doesn’t utilize it, or for any other reason.
This can lead to ugly search results, since DNN’s indexer stores the module’s title in the SearchItem table and uses it as the title for each one of your search results.
On the other hand, you’ve got some module titles you’ve explicitly set and you need to preserve for your search results. So, you’ve only got to replace the DEFAULT titles with something – in my script, I chose to replace them with the corresponding tab’s title, but you could alter it and make it display anything – or even delete the record if you like.
So here’s a trigger that checks whether the row being written in the SearchItem table is for a module having the default title, and if so, changes the title to the corresponding tab’s title.
CREATE TRIGGER tr_FixSearchItemTitle
ON dbo.SearchItem
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--These three variables will come from the
--searchitem table.
declare @searchitemid int
declare @moduleid int
declare @title nvarchar(200)
--These two will come from the
--modules table.
declare @moduletitle nvarchar(200)
declare @moduledefid int
--This will come from the
--moduledefinitions table
declare @friendlyname nvarchar(200)
--This will come from the
--tabs table
declare @tabtitle nvarchar(200)
--Get inserted values
select
@searchitemid = searchitemid
, @title = title
, @moduleid = moduleid
from
inserted
--Find moduletitle and definition id of the
--module being inserted in searchitems table.
select
@moduletitle = moduletitle
, @moduledefid=moduledefid
from
modules
where
moduleid = @moduleid
--Find the friendly name from the
--moduledefinitions table
select
@friendlyname = friendlyname
from
moduledefinitions
where
moduledefid = @moduledefid
--If the title of the module in the searchitem table
--is equal to the module definition's friendly name
--then we can safely suppose that the module has
--the default title.
if @friendlyname = @title
begin
--Get the tab's title
select
@tabtitle = title
from
tabs
where tabid in
(
--If we have multiple instances
--of modules in several pages,
--just get the first page. I know,
--this might be ugly but I've not found
--any other way.
select
top 1 (tabid)
from
tabmodules
where
moduleid = @moduleid
)
--Replace the default title with the page's title.
update
searchitem
set
title = @tabtitle
where
searchitemid = @searchitemid
end
END
GO
This trigger checks each entry in the SearchItem table at the time it’s inserted or updated and determines whether the module title being inserted is a default title. It achieves that by comparing the module’s title with the FriendlyName field of the ModuleDefinitions table – all core modules and all third-party modules I know use this value as the default title. This means the trigger will probably work with any combination of modules you’ve installed in your site.
There’s a catch, though: If you have the same module instance (not the same module, the exact same instance – that means you’ve used the “add existing module” option) in more than one page, it’ll get only one title for it – that is, if you’ve “added an existing module” to several pages, each search result that corresponds to such a module may have the wrong title – no problem if you’re not using multiple instances of modules.
Another catch is that you have to have recursive triggers disabled for your database, or this will execute forever – it will run itself again and again since it alters a newly inserted or updated record.
In order to see how this trigger handle things, you should delete everything from your SearchItem table and then do a reindex via the Host->Search Admin page, or else the trigger will run only for new or updated entries.
As always, use at your own risk!
Read more...