]> 91.132.146.200 Git - bibliotheca-php.git/commitdiff
new combined search field. Implemented as a new system field to be added as a new...
authorBanana <mail@bananas-playground.net>
Sun, 28 Jan 2024 11:48:18 +0000 (12:48 +0100)
committerBanana <mail@bananas-playground.net>
Sun, 28 Jan 2024 11:48:18 +0000 (12:48 +0100)
15 files changed:
TODO
documentation/setup/bibliotheca.sql
upgrade/from-version-1.5.txt
webclient/lib/managecollectionfields.class.php
webclient/lib/managecollections.class.php
webclient/lib/manageentry.class.php
webclient/lib/mancubus.class.php
webclient/lib/trite.class.php
webclient/setup/bibliotheca.sql.default
webclient/view/98/advancedsearch/advancedsearch.html
webclient/view/98/managecolletions/managecolletions.html
webclient/view/98/manageentry/manageentry.html
webclient/view/default/entry/field-hidden.html [new file with mode: 0644]
webclient/view/default/managecolletions/managecolletions.html
webclient/view/default/manageentry/field-hidden.html [new file with mode: 0644]

diff --git a/TODO b/TODO
index 9de748f1a8c599ba39e1a708a1fc598ddffe665d..b4e81b0445116e26eafd57eb7e43c7830e28abf7 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,5 +1,5 @@
-* change the search data. Maybe an extra search field in which all the searchable information of an entry will be
-  saved.
+* Better error handling and display while adding / update and delete
+** Maybe some message "store"
 * query optimization and default indexes on columns
 * make documentation markdown to be nicer
 * change multiple-attachment to a field which tells it is used for a image gallery
 * i18n support
 * Definition of fields in "card view"
 * User and groupmanagement: Check where a user or group is used!
-* Better error handling and display while adding / update and delete
 * Export of an entry, collection or everything. Stored on disk.
 * Import of the export
 * remove ifset and maybe ifsetvalue from summoner
 
-
 * Field management: Web interface to configure or even create new ones.
index 1d910307006f54f63df93469dd38baf2e8ee66bb..89d6e037429e4bc193dc43158c049fdf98f15e32 100644 (file)
@@ -166,7 +166,8 @@ INSERT INTO `#REPLACEME#_sys_fields` (`id`, `identifier`, `displayname`, `type`,
 (30, 'sysReq', 'System Requirements', 'text3', 'entryText', '`sysReq` varchar(255) NULL DEFAULT NULL, ADD FULLTEXT (`sysReq`)', '', NULL, 'string 255', '2021-04-25 21:21:54', '2021-04-25 21:21:54', 0, 1, 1, 'rw-r--r--'),
 (31, 'artist', 'Artist', 'text', 'entrySingleText', '`artist` varchar(128) NULL DEFAULT NULL', '', NULL, 'string 128', '2021-07-09 08:30:11', '2021-07-09 08:38:33', NULL, 1, 1, 'rw-r--r--'),
 (32, 'artists', 'Artists', 'lookupmultiple', 'tag', NULL, 'allowSpace', NULL, 'string 64', '2021-07-18 11:42:16', '2021-07-18 11:42:16', NULL, 1, 1, 'rw-r--r--'),
-(34, 'isbn', 'ISBN', 'text', 'entrySingleText', '`isbn` varchar(32) NULL, ADD INDEX (`isbn`)', '', NULL, 'varchar 32', '2022-10-08 10:47:01', '2023-04-08 08:53:55', NULL, 1, 1, 'rw-r--r--');
+(34, 'isbn', 'ISBN', 'text', 'entrySingleText', '`isbn` varchar(32) NULL, ADD INDEX (`isbn`)', '', NULL, 'varchar 32', '2022-10-08 10:47:01', '2023-04-08 08:53:55', NULL, 1, 1, 'rw-r--r--'),
+(35, 'combSearch', 'Combined Search', 'hidden', 'entryText', '`combSearch` text NULL DEFAULT NULL, ADD FULLTEXT (`combSearch`)', '', NULL, 'mysql text - Content will be auto generated from other entry fields', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '1', '1', 'rw-r--r--');
 
 -- --------------------------------------------------------
 
@@ -363,7 +364,7 @@ ALTER TABLE `#REPLACEME#_menu`
 -- AUTO_INCREMENT for table `#REPLACEME#_sys_fields`
 --
 ALTER TABLE `#REPLACEME#_sys_fields`
-  MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=35;
+  MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=36;
 
 --
 -- AUTO_INCREMENT for table `#REPLACEME#_tool`
index 4c1f7166fa304ca72759561640946b603fddeb3e..760da8d79fc7b159bd170002edc384afead16956 100644 (file)
@@ -1,9 +1,14 @@
 # Added a new global search field
-As of version 1.6, the field 'Combined Search' provides a much better default search base.
-If you want to use it make sure you update its contents for all the existing entries in
-your collection. After that and for all new entries the data will be created automatically.
-The update and creation of the field is done by using the new option "Update combined search field data"
-in collection management. It needs to be done for each if your collections but only once.
+As of version 1.6, the field 'Combined Search' provides a much better search base.
+How to change and use new field: Run the following sql query. Replace #REPLACEME# with the used DB prefix.
+```
+INSERT INTO `#REPLACEME#_sys_fields` (`id`, `identifier`, `displayname`, `type`, `searchtype`, `createstring`, `inputValidation`, `value`, `apiinfo`, `created`, `modified`, `modificationuser`, `owner`, `group`, `rights`) VALUES (NULL, 'combSearch', 'Combined Search', 'hidden', 'entryText', '`combSearch` text NULL DEFAULT NULL, ADD FULLTEXT (`combSearch`)', '', NULL, 'mysql text - Content will be auto generated from other entry fields', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '1', '1', 'rw-r--r--');
+```
+Add the new field 'Combined Search' to a collection.
+Change the 'Default gloabal seach field' to 'Combined search' and save.
+After that check the 'Update combined search field data' option to create the search data
+for the selected collection. Do this for every collection.
+For all new entries the data will be created automatically.
 
 # Added new constants to config.php file.
 Use config.php.default as a help. The new lines are:
index a3d19168e7e87363033e294f4d7f109365757cde..eaaafffc2f41d08d1861ad93de26e423f373ea37 100644 (file)
@@ -314,7 +314,6 @@ class ManageCollectionFields {
         // add systemfields
                $def['created'] = array('identifier' => 'created', 'displayname' => 'Created', 'type' => 'systemfield');
                $def['modified'] = array('identifier' => 'modified', 'displayname' => 'Modified', 'type' => 'systemfield');
-               $def['search'] = array('identifier' => 'search', 'displayname' => 'Combined Search', 'type' => 'systemfield');
 
                return $def + $ret;
        }
index ac52dfa8231c64da6729ebd5a56ccce3edfa9632..cd1b7abfdbe9e831be93758c5622d07fdb24b26b 100644 (file)
@@ -226,9 +226,7 @@ class ManageCollections {
                                                                                 `owner` int NOT NULL,
                                                                                 `group` int NOT NULL,
                                                                                 `rights` char(9) COLLATE utf8mb4_bin NOT NULL,
-                                                                                `search` text COLLATE utf8mb4_unicode_ci NOT NULL,
-                                                                                PRIMARY KEY (`id`),
-                                                                                FULLTEXT KEY `search` (`search`)
+                                                                                PRIMARY KEY (`id`)
                                                                                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
                                if(QUERY_DEBUG) Summoner::sysLog("[QUERY] ".__METHOD__." query: ".Summoner::cleanForLog($queryCollectionEntry));
                                $this->_DB->query($queryCollectionEntry);
@@ -340,17 +338,7 @@ class ManageCollections {
                                        // optimize does a recreation and the column collation
                                        // is considered
                                        $this->_DB->query("OPTIMIZE TABLE `".DB_PREFIX."_collection_entry_".$data['id']."`");
-                               } elseif($data['defaultSearchField'] === "search") {
-                    // Special case. 1.6 adds the search field. Needs to be checked if there
-                    // It is a new default column which is added at creation of a collection
-                    // but needs to be added manually for existing ones.
-                    // could be removed in future version...
-                    $queryStr = "ALTER TABLE `".DB_PREFIX."_collection_entry_".$data['id']."` 
-                                    ADD `search` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci 
-                                    NOT NULL AFTER `rights`, ADD FULLTEXT (`search`)";
-                    if(QUERY_DEBUG) Summoner::sysLog("[QUERY] ".__METHOD__." query: ".Summoner::cleanForLog($queryStr));
-                    $this->_DB->query($queryStr);
-                }
+                               }
                        } catch (Exception $e) {
                                if($e->getCode() == "1061") {
                                        // duplicate key message if the index is already there.
@@ -466,14 +454,22 @@ class ManageCollections {
         // Name starts with entry. Here we want only the text fields
         // Those fields are the data for the combined search field
         $dataFields = array();
+        $_fieldAvailable = false;
         if(!empty($searchFields)) {
             foreach($searchFields as $k=>$v) {
+                if($v['identifier'] == "combSearch") {
+                    $_fieldAvailable = true;
+                    continue;
+                }
                 if(isset($v['searchtype']) && strpos($v['searchtype'],'Text') !== false) {
                     $dataFields[$k] = $v['identifier'];
                 }
             }
         }
 
+        // only if the combSearch field is available in the collection
+        if(!$_fieldAvailable) return $ret;
+
         // get the search data for every entry in the collection
         $entryData = array();
         if(!empty($dataFields)) {
@@ -500,7 +496,7 @@ class ManageCollections {
                 $searchData = implode(" ", Summoner::words($searchData));
 
                 $queryStr = "UPDATE `".DB_PREFIX."_collection_entry_".$collectionId."`
-                            SET `search` = '".$this->_DB->real_escape_string($searchData)."'
+                            SET `combSearch` = '".$this->_DB->real_escape_string($searchData)."'
                             WHERE `id` = '".$entryid."'";
                 if(QUERY_DEBUG) Summoner::sysLog("[QUERY] ".__METHOD__." query: ".Summoner::cleanForLog($queryStr));
                 try {
index 377e8a399cac00d5ac5c3086126d5a685e571fe1..b219fd3862717d16d15e1deae10676873c629aa0 100644 (file)
@@ -91,7 +91,7 @@ class Manageentry {
 
                if(!empty($this->_collectionId)) {
                        $queryStr = "SELECT `cf`.`fk_field_id` AS id, `sf`.`type`, `sf`.`displayname`, `sf`.`identifier`,
-                                                       `sf`.`value`, `sf`.`inputValidation`
+                                                       `sf`.`value`, `sf`.`inputValidation`, `sf`.`searchtype`
                                                FROM `".DB_PREFIX."_collection_fields_".$this->_DB->real_escape_string($this->_collectionId)."` AS cf
                                                LEFT JOIN `".DB_PREFIX."_sys_fields` AS sf ON `cf`.`fk_field_id` = `sf`.`id`
                                                ORDER BY `cf`.`sort`";
@@ -184,7 +184,7 @@ class Manageentry {
                 if(DEBUG) Summoner::sysLog("[DEBUG] ".__METHOD__." methodname: ".Summoner::cleanForLog($_methodName));
                 if(DEBUG) Summoner::sysLog("[DEBUG] ".__METHOD__." methodnamespecial: ".Summoner::cleanForLog($_methodNameSpecial));
                 if(method_exists($this, $_methodNameSpecial)) {
-                    $queryData = $this->$_methodNameSpecial($d, $queryData);
+                    $queryData = $this->$_methodNameSpecial($d, $queryData, $data);
                 }
                                elseif(method_exists($this, $_methodName)) {
                                        $queryData = $this->$_methodName($d, $queryData);
@@ -604,6 +604,40 @@ class Manageentry {
                return $this->_saveField_text($data, $queryData);
        }
 
+    /**
+     * Create part of the insert statement for field type hidden
+     *
+     * @param array $data
+     * @param array $queryData
+     * @return array
+     */
+    private function _saveField_hidden(array $data, array $queryData): array {
+        return $this->_saveField_text($data, $queryData);
+       }
+
+    /**
+     * Create part of the insert statement for field type hidden and identifier combSearch
+     * Creates it contents of the other fields as a combined search field. Ignores any input
+     *
+     * @see ManageCollections->updateSearchData()
+     *
+     * @param array $data
+     * @param array $queryData
+     * @param array $allInputData All the POST data if needed
+     * @return array
+     */
+       private function _saveField_hidden__combSearch(array $data, array $queryData, array $allInputData): array {
+        $searchData = '';
+           foreach($allInputData as $f=>$_d) {
+            if(isset($_d['searchtype']) && strpos($_d['searchtype'],'Text') !== false) {
+                $searchData .= " ".$_d['valueToSave'];
+            }
+           }
+        $data['valueToSave'] = implode(" ", Summoner::words($searchData));
+        $queryData['init'][] = "`".$data['identifier']."` = '".$this->_DB->real_escape_string($data['valueToSave'])."'";
+        return $queryData;
+       }
+
        /**
         * Create part of the insert statement for field type year
         * Uses some simple 4 digit patter to extract the year if the input is
@@ -756,9 +790,10 @@ class Manageentry {
      *
      * @param array $data
      * @param array $queryData
+     * @param array $allInputData All the POST data if needed
      * @return array
      */
-    private function _saveField_upload__coverimage(array $data, array $queryData): array {
+    private function _saveField_upload__coverimage(array $data, array $queryData, array $allInputData): array {
         $queryData = $this->_saveField_upload($data, $queryData);
 
         if(!isset($queryData['after']['upload'])) {
index ac29ef6554ef1b4cd777b1826ce5dc3b62f30b1d..1d699634f2ca2b6b5e8cb3c32b01dd3c2daf71cd 100644 (file)
@@ -351,6 +351,8 @@ class Mancubus {
 
        /**
         * Get entries for loaded collection by looking for the given value in given field
+     *
+     * @TODO: unused?
         *
         * @param string $fieldId Number ID of the field to search in
         * @param string $fieldValue Value of the field
index 53bcc1dd678f873568dbadcff3e4f6d8c26b4ef5..31d4d24bfcff41c4fa4c2a9fd6b1ae199e92c535 100644 (file)
@@ -255,10 +255,7 @@ class Trite {
         // add systemfields
                $def['created'] = array('identifier' => 'created', 'displayname' => 'Created', 'type' => 'systemfield');
                $def['modified'] = array('identifier' => 'modified', 'displayname' => 'Modified', 'type' => 'systemfield');
-        $def['search'] = array('identifier' => 'search', 'displayname' => 'Combined Search', 'type' => 'systemfield');
-               $ret = $def + $ret;
-
-               return $ret;
+               return $def + $ret;
        }
 
        /**
index 1d910307006f54f63df93469dd38baf2e8ee66bb..89d6e037429e4bc193dc43158c049fdf98f15e32 100644 (file)
@@ -166,7 +166,8 @@ INSERT INTO `#REPLACEME#_sys_fields` (`id`, `identifier`, `displayname`, `type`,
 (30, 'sysReq', 'System Requirements', 'text3', 'entryText', '`sysReq` varchar(255) NULL DEFAULT NULL, ADD FULLTEXT (`sysReq`)', '', NULL, 'string 255', '2021-04-25 21:21:54', '2021-04-25 21:21:54', 0, 1, 1, 'rw-r--r--'),
 (31, 'artist', 'Artist', 'text', 'entrySingleText', '`artist` varchar(128) NULL DEFAULT NULL', '', NULL, 'string 128', '2021-07-09 08:30:11', '2021-07-09 08:38:33', NULL, 1, 1, 'rw-r--r--'),
 (32, 'artists', 'Artists', 'lookupmultiple', 'tag', NULL, 'allowSpace', NULL, 'string 64', '2021-07-18 11:42:16', '2021-07-18 11:42:16', NULL, 1, 1, 'rw-r--r--'),
-(34, 'isbn', 'ISBN', 'text', 'entrySingleText', '`isbn` varchar(32) NULL, ADD INDEX (`isbn`)', '', NULL, 'varchar 32', '2022-10-08 10:47:01', '2023-04-08 08:53:55', NULL, 1, 1, 'rw-r--r--');
+(34, 'isbn', 'ISBN', 'text', 'entrySingleText', '`isbn` varchar(32) NULL, ADD INDEX (`isbn`)', '', NULL, 'varchar 32', '2022-10-08 10:47:01', '2023-04-08 08:53:55', NULL, 1, 1, 'rw-r--r--'),
+(35, 'combSearch', 'Combined Search', 'hidden', 'entryText', '`combSearch` text NULL DEFAULT NULL, ADD FULLTEXT (`combSearch`)', '', NULL, 'mysql text - Content will be auto generated from other entry fields', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '1', '1', 'rw-r--r--');
 
 -- --------------------------------------------------------
 
@@ -363,7 +364,7 @@ ALTER TABLE `#REPLACEME#_menu`
 -- AUTO_INCREMENT for table `#REPLACEME#_sys_fields`
 --
 ALTER TABLE `#REPLACEME#_sys_fields`
-  MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=35;
+  MODIFY `id` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=36;
 
 --
 -- AUTO_INCREMENT for table `#REPLACEME#_tool`
index 1ce7933ff8df2e07838baf7c6a872e26b5581d09..5cd6d106bc4c590ea176252302089defd387ebc0 100644 (file)
@@ -62,7 +62,7 @@
                        <div class="window-body">
                                <p>
                                        Display result for: <b><?php echo $TemplateData['search']; ?></b><br>
-                                       <small>(Max. result of 60)</small>
+                                       (Max. result of 60)
                                </p>
                        </div>
                </div>
index e860bd36141a9a820c41d280cdada38daa89c9c0..8401f5bc813108d171390137e297821ddaa5bd2c 100644 (file)
@@ -1,7 +1,7 @@
 <h3>Manage your collections</h3>
 <h4>Add or modify a collection</h4>
 <blockquote>
-       Any default field or any option which needs a field get its content after the fields are configured.
+       Any default field or any option which needs a field, get its values after the fields are configured.
 </blockquote>
 
 <form method="post" class="maxSizeForm">
        <div class="field-row-stacked">
                <label>
                        The field is used in the global search. Altering the default search field results in
-                       a DB reindex. This could take some time, depending on the amount of data.
+                       a DB reindex.<br />
+                       This could take some time, depending on the amount of data.<br />
+                       As of version 1.6, the field 'Combined Search' provides a much better default search base.<br />
+                       Select the field and save. Use the option below to created or update the search data
+                       for every entry in this collection.
                </label>
        </div>
+       <div class="field-row-stacked">
+               <input id="updateSearchData" type="checkbox" name="fdata[updateSearchData]" value="1">
+               <label for="updateSearchData">Update Combined Search field data</label>
+               This could take some time to complete, depending on the amount of data.<br />
+               Plase do this after you remove fields(text) from your collection.
+       </div>
        <div class="field-row-stacked">
                <label for="defaultSortField">Default sort field</label>
                <select id="defaultSortField" name="fdata[defaultSortField]">
@@ -52,7 +62,7 @@
                </select>
        </div>
        <div class="field-row-stacked">
-               <label for="advancedSearchTableFields">Table advanced search view</label>
+               <label for="advancedSearchTableFields">Advanced search table fields</label>
                <select id="advancedSearchTableFields" name="fdata[advancedSearchTableFields][]" multiple="multiple" size="5">
                        <?php foreach($TemplateData['existingFields'] as $k=>$v) { ?>
                        <option value="<?php echo $v['id']; ?>"
                </select>
        </div>
        <div class="field-row-stacked">
-               <label>Make sure that the default global search field is in this list. This does not limit the fields to search in.</label>
+               <label>
+                       Make sure that the default global search field is in this list.
+                       This does not limit the fields to search in.
+               </label>
        </div>
        <div class="field-row-stacked">
                        <label for="tool">Tools</label>
        <?php if(Summoner::ifset($TemplateData['editData'], 'name')) { ?>
        <div class="field-row-stacked">
                <input id="doRightsForEntries" type="checkbox" name="fdata[doRightsForEntries]" value="1">
-               <label for="doRightsForEntries">
-                       Overwrite existing rights<br />
+               <label for="doRightsForEntries">Overwrite existing rights</label>
                        Warning: This will overwrite existing entry rights (user, group, rights) with the ones from the collection!
                </label>
        </div>
        <div class="field-row-stacked">
                <input id="doDelete" type="checkbox" name="fdata[doDelete]" value="1">
-               <label for="doDelete">
-                       Delete<br />
-                       Warning: This will delete ALL the data in this collection!
-               </label>
+               <label for="doDelete">Delete</label>
+               Warning: This will delete ALL the data in this collection!
        </div>
        <?php } ?>
 
index b849aa681cdafc832c2ffe3ee8e8d7dfae6b28d1..fce3eca94fd1c21b33e278d11c53efd80d263bd5 100644 (file)
@@ -51,7 +51,7 @@ Possible duplicate
        ?>
 
        <div class="field-row-stacked">
-               <label>Rights *</label></td>
+               <label>Rights *</label>
 
                <table>
                        <thead>
diff --git a/webclient/view/default/entry/field-hidden.html b/webclient/view/default/entry/field-hidden.html
new file mode 100644 (file)
index 0000000..b9d1232
--- /dev/null
@@ -0,0 +1 @@
+<!-- hidden <?php echo $field['identifier']; ?> -->
index 38a1c285ec8c4b983ccac6bbaa225ac4ab668fd1..a354667da7576e9c9a525311059a6e95698ad98c 100644 (file)
@@ -4,8 +4,8 @@
        <div class="uk-width-1-2">
                <h4 class="uk-h4">Add or modify a collection</h4>
                <p>
-                       <span uk-icon="icon: warning"></span> Any default field or any option which needs a field
-                       get its content after the fields are configured.
+                       <span uk-icon="icon: warning"></span> Any default field or any option which needs a field,
+                       get its values after the fields are configured.
                </p>
                <form class="uk-form-horizontal uk-margin-small" method="post">
                        <div class="uk-margin">
                                        <small>
                                                <span class="" uk-icon="icon: warning"></span> As of version 1.6, the field 'Combined Search'
                                                provides a much better default search base.<br />
-                                               If you want to use it make sure you update its contents (following option) for all the existing entries in
-                                               your collection. After that and for all new entries the data will be created automatically.
+                                               Select the field and save. Use the option below to created or update the search data
+                                               for every entry in this collection.
                                        </small>
                                </div>
                        </div>
                        <div class="uk-margin">
-                               <div class="uk-form-label">Update combined search field data</div>
+                               <div class="uk-form-label">Update Combined Search field data</div>
                                <div class="uk-form-controls uk-form-controls-text">
                                        <label>
                                                <input class="uk-checkbox" type="checkbox" name="fdata[updateSearchData]" value="1">
                                                ><?php echo $v['displayname']; ?> (<?php echo $v['type']; ?>)</option>
                                                <?php } ?>
                                        </select>
-                                       <small>Make sure that the default global search field is in this list.<br />
-                                               This does not limit the fields to search in.</small>
+                                       <small>
+                                               Make sure that the default global search field is in this list.<br />
+                                               This does not limit the fields to search in.
+                                       </small>
                                </div>
                        </div>
                        <div class="uk-margin">
diff --git a/webclient/view/default/manageentry/field-hidden.html b/webclient/view/default/manageentry/field-hidden.html
new file mode 100644 (file)
index 0000000..3a79532
--- /dev/null
@@ -0,0 +1,4 @@
+<input type="hidden" id="<?php echo $field['identifier']; ?>" autocomplete="off"
+       name="fdata[<?php echo $field['identifier']; ?>]"
+       value="<?php echo Summoner::ifset($TemplateData['editData'], $field['identifier']); ?>"
+>