first commit
This commit is contained in:
14
Resources/Private/Templates/Backend/PageModule/Summary.html
Normal file
14
Resources/Private/Templates/Backend/PageModule/Summary.html
Normal file
@@ -0,0 +1,14 @@
|
||||
<table class="typo3-dblist" style="width:100%; {f:if(condition: hidden, then: 'hidden')}">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2" style="padding-bottom: 0.5em;"><f:format.raw>{pluginLabel}</f:format.raw></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<f:for each="{settings}" as="settingValue" key="settingName" iteration="current">
|
||||
<tr class="{f:if(condition: current.isOdd, then: 'bgColor4', else: 'bgColor3')}">
|
||||
<td style="font-weight:bold; width:40%; padding-right: 3px;">{settingName}</td>
|
||||
<td>{settingValue}</td>
|
||||
</tr>
|
||||
</f:for>
|
||||
</table>
|
@@ -0,0 +1,35 @@
|
||||
<p style="margin-bottom: 10px;">
|
||||
The Solr Access Filter
|
||||
Plugin you are using is outdated. You are using version <strong>{installedVersion}</strong>, the currently recommended
|
||||
version is <strong>{recommendedVersion}</strong></p>
|
||||
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
Affected Solr server
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Host</th>
|
||||
<td>{solr.primaryEndpoint.host}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<td>{solr.corePath}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Port</th>
|
||||
<td>{solr.primaryEndpoint.port}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>Please download and install the
|
||||
<a target="_blank"
|
||||
href="http://www.typo3-solr.com/fileadmin/files/solr/solr-typo3-plugin-{recommendedVersion}.jar">
|
||||
current version of the plugin
|
||||
</a>.
|
||||
</p>
|
@@ -0,0 +1,38 @@
|
||||
<p style="margin-bottom: 10px;">
|
||||
EXT:meilisearch comes with a plugin for the Apache Solr server to
|
||||
ensure TYPO3 access restrictions are enforced for search
|
||||
results, thus allowing visitors to only see results they are
|
||||
allowed to see. The plugin is not installed on the following
|
||||
server. It is recommended to install the plugin if you are using
|
||||
frontend user group access restrictions for your site.</p>
|
||||
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
Affected Solr server
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Host</th>
|
||||
<td>{solr.primaryEndpoint.host}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<td>{solr.corePath}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Port</th>
|
||||
<td>{solr.primaryEndpoint.port}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>Please download and install the
|
||||
<a target="_blank"
|
||||
href="http://www.typo3-solr.com/fileadmin/files/solr/solr-typo3-plugin-{recommendedVersion}.jar">
|
||||
current version of the plugin
|
||||
</a>.
|
||||
</p>
|
@@ -0,0 +1 @@
|
||||
<p>'Connections to your Solr server are detected automatically. To make this work you need to set the "Use as Root Page" page property for your site root pages.'</p>
|
@@ -0,0 +1,37 @@
|
||||
<p>A schema different
|
||||
from the one provided with the extension was detected.</p>
|
||||
<p>It is recommended to use the
|
||||
schema.xml file shipping with the Apache Solr for TYPO3
|
||||
extension as it provides an optimized field setup for
|
||||
using Solr with TYPO3. A difference can occur when you
|
||||
update the TYPO3 extension, but forget to update the
|
||||
schema.xml file on the Solr server. The schema sometimes
|
||||
changes to accommodate changes or new features in Apache
|
||||
Solr. Also make sure to restart the Tomcat server after
|
||||
updating the schema.xml file.</p>
|
||||
<p>Your Solr server is
|
||||
currently using schema version <strong>{solr.schema.name}</strong>, the
|
||||
recommended schema version is <strong>{recommendedVersion}</strong>. You can
|
||||
find the recommended <code>schema.xml</code> file in the extension's
|
||||
resources folder: <code>EXT:meilisearch/Resources/Private/Solr/</code>. While
|
||||
you're at it, please make sure you're using the current <code>solrconfig.xml</code> file, too.</p>
|
||||
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">Affected Solr server</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<th>Host</th>
|
||||
<td>{solr.primaryEndpoint.host}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<td>{solr.corePath}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Port</th>
|
||||
<td>{solr.primaryEndpoint.port}</td>
|
||||
</tr>
|
||||
</table>
|
@@ -0,0 +1,7 @@
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<f:for each="{validationResults}" as="validationResult">
|
||||
<tr {f:render(section: 'CSSClassesFor', arguments:{validationResult: validationResult, forTag: 'tr'})}><th {f:render(section: 'CSSClassesFor', arguments:{validationResult: validationResult, forTag: 'th'})} >{validationResult.label}</th><td {f:render(section: 'CSSClassesFor', arguments:{validationResult: validationResult, forTag: 'td'})}>{validationResult.message}</td></tr>
|
||||
</f:for>
|
||||
</table>
|
||||
|
||||
<f:section name="CSSClassesFor"><f:if condition="{validationResult.CSSClassesFor.{forTag}}">class="{validationResult.CSSClassesFor.{forTag}}"</f:if></f:section>
|
@@ -0,0 +1,36 @@
|
||||
<p>A <code>solrconfig.xml</code> different from the one provided with the extension was
|
||||
detected.</p>
|
||||
<p>It is recommended to use the
|
||||
<code>solrconfig.xml</code> file shipping with the Apache Solr for TYPO3
|
||||
extension as it provides an optimized setup for the use of
|
||||
Solr with TYPO3. A difference can occur when you update the
|
||||
TYPO3 extension, but forget to update the <code>solrconfig.xml</code>
|
||||
file on the Solr server. The Solr configuration sometimes
|
||||
changes to accommodate changes or new features in Apache
|
||||
Solr. Also make sure to restart the Tomcat server after
|
||||
updating <code>solrconfig.xml</code>.</p>
|
||||
<p>Your Solr server is currently using a Solr configuration file named
|
||||
<strong>{f:if(condition:solr.solrconfigName, then:solr.solrconfigName, else:'not set')}</strong>,
|
||||
the recommended schema is called <strong>{recommendedVersion}</strong>. You can
|
||||
find the recommended <code>solrconfig.xml</code> file in the extension's resources folder: <code>EXT:meilisearch/Resources/Private/Solr/</code>.
|
||||
While you're at it, please check whether you're using the current <code>schema.xml</code> file, too.</p>
|
||||
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">Affected Solr server</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<th>Host</th>
|
||||
<td>{solr.primaryEndpoint.host}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<td>{solr.corePath}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Port</th>
|
||||
<td>{solr.primaryEndpoint.port}</td>
|
||||
</tr>
|
||||
</table>
|
@@ -0,0 +1,8 @@
|
||||
Domain records are needed to properly index pages. The following
|
||||
sites are marked as root pages, but do not have a domain configured:
|
||||
|
||||
<ul>
|
||||
<f:for each="{pages}" as="page">
|
||||
<li>[{page.uid}] {page.title}</li>
|
||||
</f:for>
|
||||
</ul>
|
@@ -0,0 +1,8 @@
|
||||
You need to set <code>config.index_enable = 1</code> to allow page indexing.
|
||||
The following sites were found with indexing disabled:
|
||||
|
||||
<ul>
|
||||
<f:for each="{pages}" as="page">
|
||||
<li>[{page.uid}] {page.title}</li>
|
||||
</f:for>
|
||||
</ul>
|
47
Resources/Private/Templates/Backend/Reports/SolrStatus.html
Normal file
47
Resources/Private/Templates/Backend/Reports/SolrStatus.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">{header}</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<th>Site</th>
|
||||
<td>{connection.label}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Scheme</th>
|
||||
<td>{solr.primaryEndpoint.scheme}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Host</th>
|
||||
<td>{solr.primaryEndpoint.host}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<td>{solr.corePath}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Port</th>
|
||||
<td>{solr.primaryEndpoint.port}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Username</th>
|
||||
<td>{connection.solrUsername}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Apache Solr</th>
|
||||
<td>{solrVersion}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>solrconfig.xml</th>
|
||||
<td>{configName}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>schema.xml</th>
|
||||
<td>{schemaName}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Access Filter Plugin</th>
|
||||
<td>{accessFilter}</td>
|
||||
</tr>
|
||||
</table>
|
@@ -0,0 +1,22 @@
|
||||
<p style="margin-bottom: 10px;">Found an
|
||||
outdated Apache Solr server version. <br />The <strong>minimum
|
||||
required version is <code>{requiredVersion}</code></strong>, you have <code>{currentVersion}</code>.</p>
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">Affected Solr server</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<th>Host</th>
|
||||
<td>{solr.primaryEndpoint.host}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<td>{solr.corePath}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Port</th>
|
||||
<td>{solr.primaryEndpoint.port}</td>
|
||||
</tr>
|
||||
</table>
|
@@ -0,0 +1,183 @@
|
||||
{namespace solr=WapplerSystems\Meilisearch\ViewHelpers}
|
||||
{namespace core=TYPO3\CMS\Core\ViewHelpers}
|
||||
|
||||
<f:layout name="Backend/WithPageTree"/>
|
||||
|
||||
<f:section name="Main">
|
||||
<div role="tabpanel">
|
||||
<ul class="nav nav-tabs t3js-tabs" role="tablist" id="tabs-tab" data-store-last-tab="1">
|
||||
<li role="presentation" class="t3js-tabmenu-item active">
|
||||
<a href="#synonyms-tab" title="" aria-controls="synonyms-tab" role="tab" data-toggle="tab">
|
||||
Synonyms
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation" class="t3js-tabmenu-item ">
|
||||
<a href="#stopwords-tab" title="" aria-controls="stopwords-tab" role="tab" data-toggle="tab">
|
||||
Stop Words
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="synonyms-tab">
|
||||
<div class="panel panel-tab">
|
||||
<div class="panel-body">
|
||||
|
||||
<f:render section="Synonyms" arguments="{_all}"/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="stopwords-tab">
|
||||
<div class="panel panel-tab">
|
||||
<div class="panel-body">
|
||||
|
||||
<f:render section="StopWords" arguments="{_all}"/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
<f:section name="Synonyms">
|
||||
By defining synonyms you can allow to find documents by words that do not occur in the documents but have the same meaning:<br/>
|
||||
<b>Note:</b> The word that you want replace with a synonym needs to appear on <b>both</b> sides when you want to find it with the term itself later!<br/>
|
||||
Example:<br />
|
||||
<ul>
|
||||
<li><b>"smartphone" => "smartphone, cellphone, mobile, mobilephone"</b>
|
||||
<ul>
|
||||
<li>will match <b>"smartphone, cellphone, mobile, mobilephone"</b></li>
|
||||
<li>And when "smartphone" were missing on the right side, then you could not find the documents with "smartphone" anymore!</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<b>Note: The changes do not apply on the fly, you need to reindex all the pages whith occurrences of changed synonyms.</b>
|
||||
|
||||
<f:if condition="{synonyms}">
|
||||
<f:then>
|
||||
<h3>Manage Synonyms</h3>
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr class="t3-row-header">
|
||||
<th>Base Word</th><th>Synonyms</th>
|
||||
<th>
|
||||
<f:link.action action="deleteAllSynonyms" title="Delete all synonyms" class="btn btn-default btn-sm">
|
||||
<core:icon identifier="actions-edit-delete"/>
|
||||
</f:link.action>
|
||||
<f:link.action action="exportSynonyms" title="Export all synonyms" class="btn btn-default btn-sm">
|
||||
<core:icon identifier="actions-document-export-csv"/>
|
||||
</f:link.action>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<f:for each="{synonyms}" key="baseWord" as="synonymList">
|
||||
<tr>
|
||||
<td>{baseWord}</td>
|
||||
<td>{synonymList}</td>
|
||||
<td>
|
||||
<f:link.action action="deleteSynonyms" arguments="{baseWord:'{baseWord}'}" title="Remove Synonym Mapping"><core:icon identifier="actions-edit-delete"/></f:link.action>
|
||||
</td>
|
||||
</tr>
|
||||
</f:for>
|
||||
</tbody>
|
||||
</table>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:be.infobox state="-1">
|
||||
No synonyms configured yet.
|
||||
</f:be.infobox>
|
||||
</f:else>
|
||||
</f:if>
|
||||
|
||||
<h3>Add Synonyms (lowercase)</h3>
|
||||
<div class="section">
|
||||
<f:form action="addSynonyms" id="add-synonyms">
|
||||
<div class="form-group">
|
||||
<label for="baseWord">Base Word</label>
|
||||
<f:form.textfield id="baseWord" name="baseWord" class="form-control" />
|
||||
<span class="example">f.e. iphone</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="synonyms">Synonyms</label>
|
||||
<f:form.textfield id="synonyms" name="synonyms" class="form-control" />
|
||||
<span class="example">comma-separated; f.e. smartphone, cellphone</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<f:form.checkbox id="overrideExistingSingle" name="overrideExisting" value="1" />
|
||||
<label for="overrideExistingSingle"> Override, if synonym already exists</label>
|
||||
</div>
|
||||
<div class="submit">
|
||||
<f:form.submit value="Add Synonyms" class="btn btn-sm btn-default"/>
|
||||
</div>
|
||||
</f:form>
|
||||
</div>
|
||||
<h3>Upload Synonym List</h3>
|
||||
<div class="section">
|
||||
<f:form action="importSynonymList" id="upload-synonyms" method="post" enctype="multipart/form-data">
|
||||
<div class="form-group">
|
||||
<f:form.upload id="synonymFileUpload" name="synonymFileUpload" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<f:form.checkbox id="overrideExisting" name="overrideExisting" value="1" />
|
||||
<label for="overrideExisting"> Override synonym, if synonym already exists</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<f:form.checkbox id="deleteSynonymsBefore" name="deleteSynonymsBefore" value="1" />
|
||||
<label for="deleteSynonymsBefore"> Replace complete synonym list</label>
|
||||
</div>
|
||||
<div class="submit">
|
||||
<f:form.submit value="Upload file" class="btn btn-sm btn-default"/>
|
||||
</div>
|
||||
</f:form>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
<f:section name="StopWords">
|
||||
<p> Stop words allow you to specify a list of words that will be discarded during indexing.<br/>
|
||||
Usually they are very small and very common words (such as "the" and "and") that often have <br/>
|
||||
little bearing on whether a document is a good match or not.<br/>
|
||||
The format is one word per line.</p>
|
||||
|
||||
<h3>Stop Word List (one per line, lowercase)</h3>
|
||||
<div class="section section-with-header">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<f:if condition="{stopWordsCount} == 0">
|
||||
<f:be.infobox state="-1">
|
||||
The stop word list is empty.
|
||||
</f:be.infobox>
|
||||
</f:if>
|
||||
|
||||
<f:form action="saveStopWords" id="edit-stopwords">
|
||||
<f:form.textarea name="stopWords" rows="20" cols="50" style="width: auto;" value="{stopWords}"/>
|
||||
<div class="submit">
|
||||
<f:form.submit value="Save Stop Word List" class="btn btn-sm btn-default"/>
|
||||
<f:if condition="{stopWordsCount} > 0">
|
||||
<f:link.action action="exportStopWords" title="Export StopWords" class="btn btn-default btn-sm">
|
||||
<core:icon identifier="actions-document-export-csv"/>
|
||||
</f:link.action>
|
||||
</f:if>
|
||||
</div>
|
||||
</f:form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Upload StopWords List</h3>
|
||||
<div class="section section-with-header">
|
||||
<f:form action="importStopWordList" id="upload-stopwords" method="post" enctype="multipart/form-data">
|
||||
<div class="form-group">
|
||||
<f:form.upload id="stopwordsFileUpload" name="stopwordsFileUpload" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<f:form.checkbox id="replaceStopwords" name="replaceStopwords" value="1" checked="1"/>
|
||||
<label for="replaceStopwords"> Override complete list</label>
|
||||
</div>
|
||||
<div class="submit">
|
||||
<f:form.submit value="Upload file" class="btn btn-sm btn-default"/>
|
||||
</div>
|
||||
</f:form>
|
||||
</div>
|
||||
</f:section>
|
@@ -0,0 +1,72 @@
|
||||
{namespace solr=WapplerSystems\Meilisearch\ViewHelpers}
|
||||
<f:layout name="Backend/WithPageTree"/>
|
||||
|
||||
<f:section name="Main">
|
||||
<f:be.pageRenderer includeRequireJsModules="{0:'TYPO3/CMS/Solr/FormModal'}"/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<h1>{f:translate(key: 'solr.backend.index_administration.label', default: 'Index Administration')}</h1>
|
||||
<p class="lead"><f:translate key="solr.backend.index_administration.description" /></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Reload Core Configuration</h3>
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<f:form action="reloadIndexConfiguration">
|
||||
<f:form.submit value="Reload Configuration" class="btn btn-sm btn-default" />
|
||||
</f:form>
|
||||
</div>
|
||||
<div class="col-xs-9 action-description">
|
||||
<p>
|
||||
A core in Solr is what holds your index. When changing core/index configuration
|
||||
such as synonyms, stop words, or protected words you need to reload the core
|
||||
to make the changes become active. To reload configuration you can either restart
|
||||
the whole Solr server or simply reload a specific core.
|
||||
Here you can reload the site's cores/indexes.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Empty Index</h3>
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<f:form action="emptyIndex" method="POST">
|
||||
<f:form.submit class="btn btn-sm btn-default btn-danger t3js-modal-formsubmit-trigger"
|
||||
data="{title: 'Please confirm', content: 'Are you sure you want to clear the index? All Solr documents will be removed.', severity: 'warning'}"
|
||||
value="Empty Index"/>
|
||||
|
||||
</f:form>
|
||||
</div>
|
||||
<div class="col-xs-9 action-description">
|
||||
<p>
|
||||
This will simply empty the site's index. When doing so it will take
|
||||
care of
|
||||
only deleting the currently selected site's documents even if
|
||||
you index multiple sites into one index.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>
|
||||
<f:translate key="solr.backend.index_queue_module.button.clear_index_queue"/>
|
||||
</h3>
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<f:form action="clearIndexQueue" method="POST">
|
||||
<f:form.submit class="btn btn-sm btn-default btn-danger t3js-modal-formsubmit-trigger"
|
||||
data="{title: 'Please confirm', content: 'Are you sure you want to clear the Index Queue?', severity: 'warning'}"
|
||||
value="{f:translate(key:'solr.backend.index_queue_module.button.clear_index_queue')}"/>
|
||||
</f:form>
|
||||
</div>
|
||||
<div class="col-xs-9 action-description">
|
||||
<p>
|
||||
This will empty the Index Queue. It will take care of only deleting
|
||||
the currently selected site's Index Queue entries.
|
||||
You will have to re-initialize the Index Queue afterwards.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</f:section>
|
@@ -0,0 +1,154 @@
|
||||
{namespace solr=WapplerSystems\Meilisearch\ViewHelpers}
|
||||
<f:layout name="Backend/WithPageTree"/>
|
||||
|
||||
<f:section name="Main">
|
||||
<f:be.pageRenderer includeCssFiles="{0: '{f:uri.resource(path:\'StyleSheets/Backend/IndexQueueModule.css\')}'}" includeRequireJsModules="{0:'TYPO3/CMS/Solr/FormModal'}"/>
|
||||
|
||||
<h1>Index Queue</h1>
|
||||
<p class="lead"><f:translate key="solr.backend.index_queue_module.description" /></p>
|
||||
|
||||
<hr class="section-divider" />
|
||||
|
||||
<f:if condition="{indexqueue_statistics.totalCount} > 0">
|
||||
<div class="row section-with-header">
|
||||
<div class="col-md-12">
|
||||
<h2>
|
||||
<f:translate key="solr.backend.index_queue_module.header_status"/>
|
||||
</h2>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="progress">
|
||||
<f:if condition="{indexqueue_statistics.successCount} > 0">
|
||||
<div class="progress-bar progress-bar-success"
|
||||
style="width: {indexqueue_statistics.successPercentage}%"
|
||||
title="{f:translate(key:'solr.backend.index_queue_module.status.indexed')}: {indexqueue_statistics.successCount}/{indexqueue_statistics.totalCount} ({indexqueue_statistics.successPercentage}%)">
|
||||
|
||||
<f:translate key="solr.backend.index_queue_module.status.indexed"/>
|
||||
</div>
|
||||
</f:if>
|
||||
|
||||
<f:if condition="{indexqueue_statistics.pendingCount} > 0">
|
||||
<div class="progress-bar progress-bar-warning"
|
||||
style="width: {indexqueue_statistics.pendingPercentage}%"
|
||||
title="{f:translate(key:'solr.backend.index_queue_module.status.pending')}: {indexqueue_statistics.pendingCount}/{indexqueue_statistics.totalCount} ({indexqueue_statistics.pendingPercentage}%)">
|
||||
|
||||
<f:translate key="solr.backend.index_queue_module.status.pending"/>
|
||||
</div>
|
||||
</f:if>
|
||||
|
||||
<f:if condition="{indexqueue_statistics.failedCount} > 0">
|
||||
<div class="progress-bar progress-bar-danger"
|
||||
style="width: {indexqueue_statistics.failedPercentage}%"
|
||||
title="{f:translate(key:'solr.backend.index_queue_module.status.errors')}: {indexqueue_statistics.failedCount}/{indexqueue_statistics.totalCount} ({indexqueue_statistics.failedPercentage}%)">
|
||||
|
||||
<f:translate key="solr.backend.index_queue_module.status.errors"/>
|
||||
</div>
|
||||
</f:if>
|
||||
|
||||
</div>
|
||||
<f:form action="doIndexingRun" method="POST">
|
||||
<f:form.submit class="btn btn-sm btn-default"
|
||||
value="{f:translate(key:'solr.backend.index_queue_module.index_now')}"/>
|
||||
</f:form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
<f:if condition="{indexqueue_errors}">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2>
|
||||
<f:translate key="solr.backend.index_queue_module.errors.headline"/>
|
||||
</h2>
|
||||
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<tr>
|
||||
<th>
|
||||
<f:translate key="solr.backend.index_queue_module.errors.id"/>
|
||||
</th>
|
||||
<th>
|
||||
<f:translate key="solr.backend.index_queue_module.errors.item_type"/>
|
||||
</th>
|
||||
<th>
|
||||
<f:translate key="solr.backend.index_queue_module.errors.item_uid"/>
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
|
||||
<f:for each="{indexqueue_errors}" as="item">
|
||||
<tr>
|
||||
<td>{item.uid}</td>
|
||||
<td>{item.item_type}</td>
|
||||
<td>{item.item_uid}</td>
|
||||
<td>
|
||||
<f:link.action action="showError" arguments="{indexQueueItemId: item.uid}">
|
||||
<f:translate key="solr.backend.index_queue_module.errors.show_button"/>
|
||||
</f:link.action>
|
||||
</td>
|
||||
</tr>
|
||||
</f:for>
|
||||
</table>
|
||||
|
||||
<f:form action="resetLogErrors" method="POST">
|
||||
<f:form.submit class="btn btn-sm btn-default"
|
||||
value="{f:translate(key:'solr.backend.index_queue_module.errors.reset_button')}"/>
|
||||
</f:form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</f:if>
|
||||
</div>
|
||||
</div>
|
||||
</f:if>
|
||||
|
||||
<hr class="section-divider" />
|
||||
|
||||
<div class="row section-with-header">
|
||||
<div class="col-md-12">
|
||||
<h2>
|
||||
<f:translate key="solr.backend.index_queue_module.header_init" />
|
||||
</h2>
|
||||
|
||||
<f:form name="editform" action="initializeIndexQueue">
|
||||
|
||||
<div class="t3js-formengine-palette-field index-queue-init-form">
|
||||
<f:format.raw>{indexQueueInitializationSelector}</f:format.raw>
|
||||
</div>
|
||||
<f:form.submit name="initializeIndexQueue" value="Queue Selected Content for Indexing" class="btn btn-sm btn-default"/>
|
||||
<solr:backend.button.helpButton title="Index Queue Initialization" description="{f:translate(key:'solr.backend.index_queue_module.help')}" />
|
||||
</f:form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<f:comment><!-- Show this button only if module indexadministration is allowed for be user/group --></f:comment>
|
||||
<solr:backend.security.ifHasAccessToModule extension="Solr" main="searchbackend" sub="indexadministration">
|
||||
<f:then>
|
||||
<hr class="section-divider" />
|
||||
|
||||
<div class="row section-with-header">
|
||||
<div class="col-md-3">
|
||||
|
||||
<f:form addQueryString="1"
|
||||
additionalParams="{route: '/searchbackend/SolrIndexadministration/', tx_meilisearch_searchbackend_solrindexadministration:{controller: 'Backend\\Search\\IndexAdministrationModule', action: 'clearIndexQueue', id: '{pageUID}', fromQueue: 'true'}}">
|
||||
<f:form.submit class="btn btn-sm btn-default btn-danger t3js-modal-formsubmit-trigger"
|
||||
data="{title: 'Please confirm', content: 'Are you sure you want to clear the Index Queue?', severity: 'warning'}"
|
||||
value="{f:translate(key:'solr.backend.index_queue_module.button.clear_index_queue')}"/>
|
||||
</f:form>
|
||||
|
||||
</div>
|
||||
<div class="col-md-9 action-description">
|
||||
<h3>
|
||||
<f:translate key="solr.backend.index_queue_module.button.clear_index_queue"/>
|
||||
</h3>
|
||||
|
||||
<p>
|
||||
This will empty the Index Queue. It will take care of only deleting
|
||||
the currently selected site's Index Queue entries.
|
||||
You will have to re-initialize the Index Queue afterwards.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</f:then>
|
||||
</solr:backend.security.ifHasAccessToModule>
|
||||
</f:section>
|
@@ -0,0 +1,13 @@
|
||||
<html
|
||||
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
|
||||
data-namespace-typo3-fluid="true">
|
||||
|
||||
<f:if condition="{indexQueueItem.errors}">
|
||||
<h1><f:translate key="solr.backend.index_queue_module.error_details"/> (uid: <code>{indexQueueItem.indexQueueUid}</code>, type: <code>{indexQueueItem.type}</code>):</h1>
|
||||
<pre class="alert alert-danger">{indexQueueItem.errors}</pre>
|
||||
|
||||
<f:link.action class="btn btn-default">
|
||||
{core:icon(identifier:'actions-view-go-back')} <f:translate key="solr.backend.index_queue_module.back"/>
|
||||
</f:link.action>
|
||||
</f:if>
|
||||
</html>
|
@@ -0,0 +1,8 @@
|
||||
{namespace solr=WapplerSystems\Meilisearch\ViewHelpers}
|
||||
<f:layout name="Backend/WithPageTree"/>
|
||||
|
||||
<f:section name="Main">
|
||||
<f:for each="{documents}" as="document">
|
||||
<f:render partial="Backend/ApacheSolr/SingleDocument" arguments="{document: document, documentType: documentType, documentsCount: '{f:count(subject: documents)}'}"/>
|
||||
</f:for>
|
||||
</f:section>
|
334
Resources/Private/Templates/Backend/Search/InfoModule/Index.html
Normal file
334
Resources/Private/Templates/Backend/Search/InfoModule/Index.html
Normal file
@@ -0,0 +1,334 @@
|
||||
{namespace solr=WapplerSystems\Meilisearch\ViewHelpers}
|
||||
<f:layout name="Backend/WithPageTree"/>
|
||||
|
||||
<f:section name="Main">
|
||||
<div role="tabpanel">
|
||||
<ul class="nav nav-tabs t3js-tabs" role="tablist" id="tabs-tab" data-store-last-tab="1">
|
||||
<li role="presentation" class="t3js-tabmenu-item active">
|
||||
<a href="#connections-tab" title="" aria-controls="tab-1" role="tab" data-toggle="tab">
|
||||
Connections
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation" class="t3js-tabmenu-item ">
|
||||
<a href="#statistics-tab" title="" aria-controls="tab-3" role="tab" data-toggle="tab">
|
||||
Statistics
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation" class="t3js-tabmenu-item ">
|
||||
<a href="#index_fields-tab" title="" aria-controls="tab-2" role="tab" data-toggle="tab">
|
||||
Index Fields
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation" class="t3js-tabmenu-item">
|
||||
<a href="#index_inspector-tab" title="" aria-controls="tab-2" role="tab" data-toggle="tab">
|
||||
Index Documents
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="connections-tab">
|
||||
<div class="panel panel-tab">
|
||||
<div class="panel-body">
|
||||
<f:render section="ConnectionInfos" arguments="{_all}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="statistics-tab">
|
||||
<div class="panel panel-tab">
|
||||
<div class="panel-body">
|
||||
<f:render section="Statistics" arguments="{_all}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="index_fields-tab">
|
||||
<div class="panel panel-tab">
|
||||
<div class="panel-body">
|
||||
<f:render section="IndexFields" arguments="{_all}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="index_inspector-tab">
|
||||
<div class="panel panel-tab">
|
||||
<div class="panel-body">
|
||||
<f:render section="IndexInspector" arguments="{_all}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
<f:comment><!-- Sections --></f:comment>
|
||||
|
||||
<f:section name="ConnectionInfos">
|
||||
<h2>Site: {site.label}</h2>
|
||||
|
||||
<f:if condition="{connectedHosts}">
|
||||
<f:be.infobox title="Following Apache Solr servers have been contacted:" state="0">
|
||||
<ul>
|
||||
<f:for each="{connectedHosts}" as="connectedHost">
|
||||
<li>{connectedHost}</li>
|
||||
</f:for>
|
||||
</ul>
|
||||
</f:be.infobox>
|
||||
</f:if>
|
||||
|
||||
<f:if condition="{missingHosts}">
|
||||
<f:be.infobox title="Unable to contact following Apache Solr servers:" state="2">
|
||||
<ul>
|
||||
<f:for each="{missingHosts}" as="missingHost">
|
||||
<li>{missingHost}</li>
|
||||
</f:for>
|
||||
</ul>
|
||||
</f:be.infobox>
|
||||
</f:if>
|
||||
|
||||
<f:if condition="{invalidPaths}">
|
||||
<f:be.infobox title="Following paths are not valid:" state="1">
|
||||
<ul>
|
||||
<f:for each="{invalidPaths}" as="invalidPath">
|
||||
<li>{invalidPath}</li>
|
||||
</f:for>
|
||||
</ul>
|
||||
<p>Path should not contain the characters "*, ?, <, >, |, :, or #"!</p>
|
||||
</f:be.infobox>
|
||||
</f:if>
|
||||
|
||||
<hr class="double" />
|
||||
Used domain: {site.domain}
|
||||
|
||||
<hr class="double" />
|
||||
API key: {apiKey}
|
||||
|
||||
<hr class="double" />
|
||||
|
||||
No solr server running? You can use <strong><a href="http://www.hosted-solr.com/" target="_blank">hosted-solr.com</a></strong> to setup a solr core with just a few clicks.
|
||||
</f:section>
|
||||
|
||||
<f:section name="Statistics">
|
||||
<!-- TODO add buttons to select time frame [last 24h] [last 30 days] [all] -->
|
||||
|
||||
<f:be.pageRenderer
|
||||
includeJsFiles="{
|
||||
0: '{f:uri.resource(path:\'JavaScript/SearchStatistics.js\')}'
|
||||
}"
|
||||
/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<script type="application/javascript">
|
||||
var queryLabels = <f:format.raw>{queriesChartLabels}</f:format.raw>;
|
||||
var queryData = {queriesChartData};
|
||||
</script>
|
||||
<canvas id="queriesOverTime"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<f:if condition="{top_search_phrases}">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2>
|
||||
<f:translate key="solr.backend.search_statistics_module.top_search_phrases"/>
|
||||
</h2>
|
||||
|
||||
<ul>
|
||||
<f:for each="{top_search_phrases}" as="phrase">
|
||||
<li>
|
||||
{phrase.keywords} ({phrase.count})
|
||||
</li>
|
||||
</f:for>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="section-divider" />
|
||||
</f:if>
|
||||
|
||||
<f:if condition="{top_search_phrases_without_hits}">
|
||||
<div class="row section-with-header">
|
||||
<div class="col-md-12">
|
||||
<h2>
|
||||
<f:translate key="solr.backend.search_statistics_module.top_search_phrases_without_hits"/>
|
||||
</h2>
|
||||
|
||||
<ul>
|
||||
<f:for each="{top_search_phrases_without_hits}" as="phrase">
|
||||
<li>
|
||||
{phrase.keywords} ({phrase.count})
|
||||
</li>
|
||||
</f:for>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="section-divider" />
|
||||
</f:if>
|
||||
|
||||
<div class="row section-with-header">
|
||||
<div class="col-md-12">
|
||||
<h2>
|
||||
<f:translate key="solr.backend.search_statistics_module.search_phrases_header"/>
|
||||
</h2>
|
||||
|
||||
<f:if condition="{search_phrases_statistics}">
|
||||
<f:then>
|
||||
<table class="table table-condensed table-hover table-striped">
|
||||
<thead>
|
||||
<tr class="t3-row-header">
|
||||
<th class="nowrap"> </th>
|
||||
<th>
|
||||
<f:translate key="solr.backend.search_statistics_module.item_phrase"/>
|
||||
</th>
|
||||
<th>
|
||||
<f:translate key="solr.backend.search_statistics_module.item_count"/>
|
||||
</th>
|
||||
<th>
|
||||
<f:translate key="solr.backend.search_statistics_module.results"/>
|
||||
</th>
|
||||
<th>
|
||||
<f:translate key="solr.backend.search_statistics_module.percentage"/>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<f:for each="{search_phrases_statistics}" as="item" iteration="i">
|
||||
<tr>
|
||||
<td class="nowrap"><strong>{i.cycle}.</strong></td>
|
||||
<td>{item.keywords}</td>
|
||||
<td>{item.count}</td>
|
||||
<td>{item.hits -> f:format.number(decimals: 1)}</td>
|
||||
<td>{item.percent -> f:format.number(decimals: 1)}%</td>
|
||||
</tr>
|
||||
</f:for>
|
||||
</tbody>
|
||||
</table>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:be.infobox state="2">
|
||||
<f:translate key="solr.backend.search_statistics_module.no_records_found"/>
|
||||
</f:be.infobox>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</div>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
<f:section name="IndexFields">
|
||||
<div class="panel-group" id="index-fields_accordion">
|
||||
<f:for each="{indexFieldsInfoByCorePaths}" as="indexFieldsInfoForCore" iteration="iterator">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<f:if condition="{indexFieldsInfoForCore.coreMetrics.numberOfDocuments}">
|
||||
<f:then>
|
||||
<a data-toggle="collapse" data-parent="#index-fields_accordion" href="#collapse-core{iterator.index}">{indexFieldsInfoForCore.corePath}</a>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<a>{indexFieldsInfoForCore.corePath} is empty!</a>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</h4>
|
||||
</div>
|
||||
<div id="collapse-core{iterator.index}" class="panel-collapse collapse {f:if(condition: '{iterator.isFirst}', then: 'in')}">
|
||||
<div class="panel-body">
|
||||
<f:render partial="Backend/ApacheSolr/FieldTypesForSingleCore" arguments="{indexFieldsInfoForCore: indexFieldsInfoForCore}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</f:for>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
|
||||
<f:section name="IndexInspector">
|
||||
<div class="panel-group" id="index-inspector_accordion">
|
||||
|
||||
|
||||
<f:for each="{indexInspectorDocumentsByLanguageAndType}" as="indexInspectorDocumentsByType" key="language" iteration="currentCore">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
<a href="#panel-group3document-core-{currentCore.index}" data-toggle="collapse">{indexInspectorDocumentsByType.core.corepath}</a>
|
||||
<a href="#panel-group3document-core-{currentCore.index}" title="Collapse table" class="pull-right" data-toggle="collapse">
|
||||
<core:icon identifier="actions-view-list-expand" size="small"/><f:comment><!-- @todo: make Icon toggable between actions-view-list-collapse/actions-view-list-expand --></f:comment>
|
||||
</a>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div id="panel-group3document-core-{currentCore.index}" class="panel-collapse collapse {f:if(condition: '{iterator.isFirst}', then: 'in')}">
|
||||
<div class="panel-body">
|
||||
<f:for each="{indexInspectorDocumentsByType.documents}" as="documents" key="documentType">
|
||||
<f:if condition="{documents}"> <f:comment><!-- Don't show emty panel groups if array with documents is empty. --></f:comment>
|
||||
<f:render section="PanelGroupForDocumentType" arguments="{_all}"/>
|
||||
</f:if>
|
||||
</f:for>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</f:for>
|
||||
</div>
|
||||
|
||||
<f:section name="PanelGroupForDocumentType">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
<a href="#panel-group4document-type-{currentCore.index}-{documentType}" data-toggle="collapse">Type: {documentType} ({f:count(subject: documents)})</a>
|
||||
<a href="#panel-group4document-type-{currentCore.index}-{documentType}" title="Collapse table" class="pull-right" data-toggle="collapse">
|
||||
<core:icon identifier="actions-view-list-expand" size="small"/><f:comment><!-- @todo: make Icon toggable between actions-view-list-collapse/actions-view-list-expand --></f:comment>
|
||||
</a>
|
||||
</h3>
|
||||
</div>
|
||||
<div id="panel-group4document-type-{currentCore.index}-{documentType}" class="panel-collapse collapse {f:if(condition: '{f:count(subject: documentsByType)} < 2', then: 'in', else: '')}">
|
||||
<div class="panel-body">
|
||||
<div class="panel-group">
|
||||
<table class="table table-striped table-condensed">
|
||||
<tr>
|
||||
<th>Id</th>
|
||||
<th>Title</th>
|
||||
<th>Url</th>
|
||||
<th>Created</th>
|
||||
<th>Indexed</th>
|
||||
<th>Actions</th>
|
||||
|
||||
</tr>
|
||||
<f:for each="{documents}" as="document">
|
||||
<tr>
|
||||
<td>{document.uid}</td>
|
||||
<td><f:format.crop maxCharacters="20">{document.title}</f:format.crop></td>
|
||||
<td><f:format.crop maxCharacters="40">{document.url}</f:format.crop></td>
|
||||
<td><f:format.date format="d.m.Y H:i:s">{document.created}</f:format.date></td>
|
||||
<td><f:format.date format="d.m.Y H:i:s">{document.indexed}</f:format.date></td>
|
||||
|
||||
<td>
|
||||
<span class="btn btn-default">
|
||||
<f:link.action action="documentsDetails" arguments="{uid: document.uid, type: document.type, languageUid: language, pageId: pageId}" title="Show details">
|
||||
<core:icon identifier="actions-document-view" />
|
||||
</f:link.action>
|
||||
</span>
|
||||
<f:comment>
|
||||
<!-- The additionalPrams M:'...' can be removed whe TYPO3 8 support will be dropped. -->
|
||||
</f:comment>
|
||||
<solr:backend.security.ifHasAccessToModule extension="Solr" main="searchbackend" sub="indexqueue">
|
||||
<span class="btn btn-default">
|
||||
|
||||
<f:link.action action="requeueDocument" arguments="{uid: document.uid, type: document.type}"
|
||||
controller="Backend\Search\IndexQueueModule"
|
||||
pluginName="searchbackend_SolrIndexqueue"
|
||||
additionalParams="{M:'searchbackend_SolrIndexqueue',route: 'searchbackend_SolrIndexqueue'}" title="ReQueue for all languages">
|
||||
<core:icon identifier="actions-refresh" />
|
||||
</f:link.action>
|
||||
|
||||
</span>
|
||||
</solr:backend.security.ifHasAccessToModule>
|
||||
</td>
|
||||
</tr>
|
||||
</f:for>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</f:section>
|
||||
</f:section>
|
Reference in New Issue
Block a user