Giter VIP home page Giter VIP logo

redaxo_watson's Introduction

Watson

Beschreibung

Ein Suchagent für REDAXO 5+

Watson spart Zeit bei der Suche nach Artikeln, Modulen, Templates, Benutzer, Dateien und YForm Daten und … im REDAXO Backend.

Eine ausführlichere Beschreibung und die Benutzung findet man auf tbaddade.github.io/redaxo_watson/

Voraussetzungen

  • REDAXO 5.4

Installation

Im REDAXO via Backend ...

  1. über den Installer die letzte Version vom Watson herunterladen
  2. AddOn installieren und aktivieren

Benutzung

Watson

  • öffnen
    • ctrl + space
      (um im Firefox das Contextmenü zu vermeiden, "ctrl + alt + space" drücken)
    • ctrl + alt + space
    • ctrl + cmd + space
  • schließen
    • ESC
    • ctrl + space
    • ctrl + alt + space
    • ctrl + cmd + space

Quick look

  • öffnen
    • Cursortaste rechts
  • schließen
    • Cursortaste links
    • Cursortaste oben
    • Cursortaste unten

Workflows

Suchen

Werden Keywords verwendet, wird die Suche entsprechend eingegrenzt.

Keyword Suche in wird ohne Keyword durchsucht
a Artikel ja
m, f Medien ja
m Module ja
sp Sprog ja
t Templates ja
yf YForm ja

Spezielle Suchen

Keyword Suche in Beispiel Aktion nach Enter auf Ergebnis
m:inuse [Module ID] Artikel nach verwendeten Module m:inuse 15 Artikel wird aufgerufen
sp:miss Sucht nach nicht angelegten Platzhalter innerhalb der Struktur sp:miss Platzhalter wird angelegt

Generatoren

Keyword Optionen Beschreibung Beispiel
c:make status=[online(default)/offine] Erstellt Kategorien c:make Home Kontakt "Über uns"
c:make Home Kontakt "Über uns" --status="offline"
m:make [Modulname] fields Erstellt Module siehe Modulbeispiele
sp:make [Platzhalter] fields Erstellt Platzhalter sp:make Platzhalter

Modulbeispiel: Überschrift

Watsoneingabe

m:make Überschrift --fields="Überschrift:text"

erstellt folgende Moduleingabe

<div class="form-horizontal">

    <div class="form-group">
        <label class="col-sm-2 control-label">Überschrift</label>
        <div class="col-sm-10">
            <input class="form-control" type="text" name="REX_INPUT_VALUE[1]" value="REX_VALUE[1]" />
        </div>
    </div>
</div>

erstellt folgende Modulausgabe

<?php

$ueberschrift = '';
if(REX_VALUE[id="1" isset="1"]) {
    $ueberschrift = REX_VALUE[id="1"];
}
echo $ueberschrift;
?>

Modulbeispiel: Komplex

Watsoneingabe

m:make Komplex --fields="Überschrift:text, Intro:textarea(['class'=>'redactor']), Text:textarea:textile, Bild:media, Bilder:medialist, Auswahl:select( [1 => 'ja', 0 => 'nein'] ), Status:checkbox()"

erstellt folgende Moduleingabe

<div class="form-horizontal">

    <div class="form-group">
        <label class="col-sm-2 control-label">Überschrift</label>
        <div class="col-sm-10">
            <input class="form-control" type="text" name="REX_INPUT_VALUE[1]" value="REX_VALUE[1]" />
        </div>
    </div>

    <div class="form-group">
        <label class="col-sm-2 control-label">Intro</label>
        <div class="col-sm-10">
            <textarea class="form-control redactor" rows="10" name="REX_INPUT_VALUE[2]">REX_VALUE[2]</textarea>
        </div>
    </div>

    <div class="form-group">
        <label class="col-sm-2 control-label">Text</label>
        <div class="col-sm-10">
            <textarea class="form-control" rows="10" name="REX_INPUT_VALUE[3]">REX_VALUE[3]</textarea>
        </div>
    </div>

    <div class="form-group">
        <label class="col-sm-2 control-label">Bild</label>
        <div class="col-sm-10">
            REX_MEDIA[id="1" widget="1"]
        </div>
    </div>

    <div class="form-group">
        <label class="col-sm-2 control-label">Bilder</label>
        <div class="col-sm-10">
            REX_MEDIALIST[id="1" widget="1"]
        </div>
    </div>

    <div class="form-group">
        <label class="col-sm-2 control-label">Auswahl</label>
        <div class="col-sm-10">
            <?php
            $select = new rex_select();
            $select->setName('REX_INPUT_VALUE[4]');
            $select->setAttribute('class', 'form-control');
            $select->setAttributes([]);
            $select->addOptions([1 => 'ja', 0 => 'nein']);
            $select->setSelected('REX_VALUE[4]');
            echo $select->get();
            ?>
        </div>
    </div>
</div>

erstellt folgende Modulausgabe

<?php

$ueberschrift = '';
if(REX_VALUE[id="1" isset="1"]) {
    $ueberschrift = REX_VALUE[id="1"];
}
echo $ueberschrift;

$intro = '';
if (rex_addon::get('textile')->isAvailable()) {
    if(REX_VALUE[id="2" isset="1"]) {
        $textile = REX_VALUE[id="2"];
        $textile = str_replace('<br />', '', $textile);
        $intro = rex_textile::parse($textile);
    }
}
echo $intro;

$text = '';
if (rex_addon::get('textile')->isAvailable()) {
    if(REX_VALUE[id="3" isset="1"]) {
        $textile = REX_VALUE[id="3"];
        $textile = str_replace('<br />', '', $textile);
        $text = rex_textile::parse($textile);
    }
}
echo $text;

$bild = '';
if (REX_MEDIA[id="1" isset="1"]) {
    $media = rex_media::get(REX_MEDIA[id="1"]);
    $bild .= $media->toImage();
}
echo $bild;

$bilder = '';
if (REX_MEDIALIST[id="1" isset="1"]) {
    $mediaList = explode(',', REX_MEDIALIST[id="1"]);
    foreach ($mediaList as $mediaName) {
        $media = rex_media::get($mediaName);
        $bilder .= $media->toImage();
    }
}
echo $bilder;

$auswahl = '';
if(REX_VALUE[id="4" isset="1"]) {
    $auswahl = REX_VALUE[id="4"];
}
echo $auswahl;
?>

Bugtracker

Du hast einen Fehler gefunden oder ein nettes Feature parat? Lege ein Issue an. Bevor du ein neues Issue erstellts, suche bitte ob bereits eines mit deinem Anliegen existiert und lese die Issue Guidelines (englisch) von Nicolas Gallagher.

Changelog

siehe CHANGELOG.md

Lizenz

siehe LICENSE.md

Autor

Thomas Blum

redaxo_watson's People

Contributors

alxndr-w avatar dergel avatar fanello avatar interweave-media avatar nandes2062 avatar omphteliba avatar skerbis avatar staabm avatar tbaddade avatar viewsion avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

redaxo_watson's Issues

Suche nach Produkt: Artikelnummer

Es ist aktuell nicht möglich nach dem String "1351" zu suchen.

if (count($command_parts) == 1 && (int) $command_parts[0] >= 1) {

Diese Zeile sorgt dafür das anschließend die where Bedingung überschrieben wird und dann nach einer ArtikelID mit 1351 gesucht wird.

Dabei ist doch die Where Bedingung vorher (a.id LIKE "%1351%") OR (a.name LIKE "%1351%") richtig.

Könnte man dort eine andere Logik verbauen?

ausgeschriebene Keywords

ggf. würde es sinnvoll sein, ausgeschriebene Keywords zuzulassen... also "module" oder "article" (kann man sich vllt besser merken)

Responsive

Der Button sollte mobil immer sichtbar sein, da keine Tastenkombinationen möglich.

Das Fenster sollte in der Breite begrenzt werden, vielleicht auf die Vorschau verzichten, da mobil eh nicht gut nutzbar.
Screenshot_2021-07-08-17-45-19-486_com android chrome

schließen des overlays

aktuell kann die Such-Toolbar nur mit ESC geschlossen werden.

ggf. würde ein zusätzlicher Link zum schließen das ganze aus Usability-Sicht vereinfachen.
Alternativ/Ergänzend könnte man die Toolbar auch bei verlieren des Focuses oder Klick in den Background schließen.

Diverse Einträge im Systemlog

Bei der einfachen Eingabe von Buchstaben, Zahlen, Texte.

02.04.2019 12:23:35 rex_sql_exception Error while executing statement " SELECT a.id, a.clang_id, CONCAT(a.id, " ", a.clang_id) as bulldog FROM rex_article AS a WHERE () OR ( GROUP BY bulldog LIMIT 20"! SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') OR () GROUP BY bulldog LIMIT' at line 1 redaxo/src/core/lib/sql/sql.php
02.04.2019 12:23:34 Warning count() [function.count]: Parameter must be an array or an object that implements Countable redaxo/src/addons/watson/lib/Watson/Foundation/Result.php 42
02.04.2019 12:23:34 Warning count() [function.count]: Parameter must be an array or an object that implements Countable redaxo/src/addons/watson/lib/Watson/Foundation/Result.php 42
02.04.2019 12:23:34 Warning count() [function.count]: Parameter must be an array or an object that implements Countable redaxo/src/addons/watson/lib/Watson/Foundation/Result.php 42
02.04.2019 12:23:34 Warning count() [function.count]: Parameter must be an array or an object that implements Countable redaxo/src/addons/watson/lib/Watson/Foundation/Result.php 42
02.04.2019 12:23:34 Warning count() [function.count]: Parameter must be an array or an object that implements Countable redaxo/src/addons/watson/lib/Watson/Foundation/Result.php 42

countable()-Warning in result.php

count() [function.count]: Parameter must be an array or an object that implements Countable | redaxo/src/addons/watson/lib/Watson/Foundation/Result.php

Im Systemlog. Wodurch es verursacht wird, kann ich nicht sagen.

Suchergebnis: Hover > Vorschau

Da ein Klick direkt zum Artikel / Datensatz führt, kann man nur mit den Cursor-Tasten die Vorschau sehen. Hier wäre es schöner, zumindest mit der Maus hovern zu können, um die Vorschau zu triggern.

$watsonSettings is not defined

ReferenceError: $watsonSettings is not defined
/assets/addons/watson/watson.js?buster=1541757826:105

Auch nach Speichern der Einstellungen bleibt der Fehler, Watson öffnet sich nicht mehr.

REDAXO 5.8, alle Addons aktuell

Alternative für den Hotkey anbieten

via E-Mail:
kann man / könntest Du in Watson auch einen anderen Shortcut zum Aktivieren anbieten?
Bei mit Ctrl + Space nämlich mit Alfred belegt.

javascript:newPoolWindow() Fehler

Beim klicken auf einer Datei aus dem Medienpool im Watson Ergebniss erscheint kurz das Medienpool Popup Fenster und schließt sich sofort, da die Seite weitergeleitet wird auf: javascript:newPoolWindow('index.php?page=mediapool/media&file_id=1')
Steht dann in der Adresszeile.

Evtl. fehlt ein "return false" beim Aufruf von newPoolWindow()?

REDAXO 5.5.1

Warning wg. Count()

PHP: 7.2.18

count() [function.count]: Parameter must be an array or an object that implements Countable

redaxo/src/addons/watson/lib/Watson/Foundation/Result.php | 42

Fehler Frontend

Notice: Undefined index: USER in /Users/..../addons/watson/config.inc.php on line 49
Notice: Undefined index: USER in /Users/..../addons/watson/plugins/watson_core/config.inc.php on line 29

Klick auf Treffer führt – scheinbar regellos – mal zu Edit, mal zur Strukturansicht

Der Fehler tritt auf mehreren Servern (Redaxo 5.4 und 5.5.1) auf, Umfang der Websites zwischen 20 und 1500 Artikeln. Die Suche selbst klappt in aller Regel zuverlässig und sehr schnell, mitunter wird aber unversehens nichts mehr gefunden – auch nicht das, was Sekunden zuvor noch da war.

Das eigentliche Symptom ist aber das folgende: Blättert man mit den Pfeiltasten durch die Trefferliste und öffnet den Link zum gefundenen Artikel mit Return, werden unterschiedliche Aktionen ausgeführt:

(1) Man landet beim Artikel-Edit des Treffer. Das würde ich als erwartbares Verhalten bezeichnen.

(2) Man landet in der Strukturansicht der Kategorie, in der sich der gefundene Artikel befindet. Diese Seltsamkeit mag noch angehen, wenn in der Kategorie nur wenige Artikel sind, bei einigen hundert wird es spätestens sinnlos.

Wann passiert (1) und wann (2)? Keine Ahnung. Wir versuchen seit einigen Tagen mit mehreren erfahrenen Leuten ein System zu erkennen, es will uns nicht gelingen. Mal (1), mal (2), egal ob die Artikel Inhalte enthalten oder nicht, online oder offline sind und unabhängig von der Kategorie-Ebene. In ein und derselben Trefferliste führt Klick auf Treffer a bis e zum Ziel (1) und Treffer f zu (2) – bei praktisch identisch aufgebauten Artikeln derselben Kategorie.

Ganz bizarr: Es ist mitunter sogar ein Unterschied, mit welchem Suchbegriff gefunden wurde. Bei Artikeln mit dem Muster-Titel 'Foo Bar' führt der Klick auf den Treffer zu (1), wenn man nach 'foo', und zu (2) wenn man nach 'bar' sucht. Derselbe Artikel wohlgemerkt, der in beiden Fällen der einzige Treffer ist.

Watson wäre eigentlich ein absoluter Heuler, wenn er sich auf Verhalten (1) beschränken würde – so wie er sich benimmt, ist er leider nicht zu gebrauchen, was wirklich extrem schade ist.

Verzeichnisname

Ein Hinweis, dass das Verzeichnis watson lauten muss und nicht redaxo_watson, wäre hilfreich, denke ich.

RELEASE?

Da schon einige fixes eingeflossen sind würde ich ein release begrüßen.

Whooops unter PHP 5.5

Genaue Fehlermeldung kann ich nicht mehr geben, da das ein Live-System war und schnellstmöglich vom Hoster auf PHP7 umgestellt wurde.

Möglicher Workaround: Mindestanforderung für die PHP-Version bei der Installation erhöhen.

Hilfe für: Eigene Workflows einbinden | inside

Eigene Workflows einbinden

Wokflows erweitern Watson um zusätzliche Funktionen und Suchen.

Das nachfolgende Beispiel bindet eine Suche für eine Tabelle eines AddOns an.

Zunächst benötigt man einen Provider, diesen (hier StoreProvider.php) legt man im Lib-Ordner des eigenen oder des project-AddOns an.

Hier der Provider für ein Store-AddOn

namespace Watson\Workflows\Store;
use Watson\Foundation\SupportProvider;
use Watson\Foundation\Workflow;

class StoreProvider extends SupportProvider
{
    /**
     * Register the directory to search a translation file.
     *
     * @return string
     */
    public function i18n()
    {
        return __DIR__;
    }

    /**
     * Register the service provider.
     *
     * @return Workflow|array
     */
    public function register()
    {
        if (\rex_addon::get('store')->isAvailable()) {
            return $this->registerStoreSearch();
        }
        return [];
    }

    /**
     * Register store search.
     *
     * @return Workflow
     */
    public function registerStoreSearch()
    {
        return new StoreSearch();
    }
}

Die Suche für den Store wird in einer separaten Datei StoreSearch.php angelegt.

<?php
namespace Watson\Workflows\Store;

use Watson\Foundation\Command;
use Watson\Foundation\Documentation;
use Watson\Foundation\Result;
use Watson\Foundation\ResultEntry;
use Watson\Foundation\Watson;
use Watson\Foundation\Workflow;

class StoreSearch extends Workflow
{
    /**
     * Provide the commands of the search.
     *
     * @return array
     */
    public function commands()
    {
        return ['st'];
    }

    /**
     * @return Documentation
     */
    public function documentation()
    {
        $documentation = new Documentation();
        $documentation->setDescription(Watson::translate('watson_store_documentation_description'));
        $documentation->setUsage('st keyword');
        $documentation->setExample('st Phrase');

        return $documentation;
    }

    /**
     * Return array of registered page params.
     *
     * @return array
     */
    public function registerPageParams()
    {
        return [];
    }

    /**
     * Execute the command for the given Command.
     *
     * @param Command $command
     *
     * @return Result
     */
    public function fire(Command $command)
    {
        $result = new Result();

        $fields = ['text_1', 'teaser_1', 'name_1', 'price', 'updatedate', ];

       $sql_query = '
       SELECT      * 
       FROM       ' . Watson::getTable('store_products') . ' 
       WHERE       ' . $command->getSqlWhere($fields) . ' 
       ORDER BY    name_1';

        $items = $this->getDatabaseResults($sql_query);

        if (count($items))
        {
            $counter = 0;

            foreach ($items as $item)
            {

                $url = Watson::getUrl(['page' => 'store/list_form', 'base_path' => 'store/products/products', 'id' => $item['id'], 'func' => 'edit']);

                ++$counter;
                $entry = new ResultEntry();
                if ($counter == 1)
                {
                    $entry->setLegend('Store');
                }

                if (isset($item['name_1']))
                {
                    $entry->setValue($item['name_1'] . '', '(' . $item['id'] . ')');
                }
                else
                {
                    $entry->setValue($item['id']);
                }

                $entry->setDescription($item['price'] . ' € | ' . $item['updatedate']);
                $entry->setIcon('watson-icon-yform');
                $entry->setUrl($url);
                $entry->setQuickLookUrl($url);

                $result->addEntry($entry);
            }
        }
        return $result;
    }

}

Tipps:

  • Das Query wird per $this->getDatabaseResults($sql_query); ausgelöst
  • $entry->setQuickLookUrl($url); definiert die URL die zur Vorschau im Quickview verwendet wird.
    In diesem Beispiel führt sie zur identischen URL wie das Suchergebnis. Alternativ kann man hier auch die URL zum Frontend hinterlegen.
  • $entry->setValue() definiert den Ergebnistext. (HTML-Formatierung wird nicht unterstützt)
  • $entry->setDescription zeigt die (kleine graue( Beschreibung an.

Um die Suche nun anmelden zu können, muss man den Provider registrieren. Das erfolgt in der boot.php des eigenen oder des project- AddOns über den Extenstionpoint WATSON_PROVIDER

 function register_storesearch(rex_extension_point $ep)
 {
     $subject = $ep->getSubject();
     $subject[] = 'Watson\Workflows\Store\StoreProvider';
     return $subject;
 }
 rex_extension::register('WATSON_PROVIDER', 'register_storesearch', rex_extension::LATE); 

Kompatibilität zu YRewrite

Bei mir wird /domain.de/.../.../ ausgegeben. Vlt. wird die Artikel-ID nicht mit rex_getUrl() durchlaufen?

Watson-Button in und ohne Quicknavi

Ohne Quicknavi: Aktuell schlecht erkennbar.
Bildschirmfoto 2022-07-29 um 14 08 25

Mit Quicknavi

Bildschirmfoto 2022-07-29 um 14 11 59

In Quicknavi wird das Symbol nicht mehr ausgegeben da das Symbol wohl nicht mehr per CSS eingefügt wird.

Request:
Bitte auch trigger class von styles trennen. Das ermöglicht mir auch eine einfachere Übernahme oder Gestaltung in Quicknavi.

User :: Watson-Darstellung / Konfiguration

Gebe ich einem User das Recht Watson einzusetzen, kann dieser auch das Setup ändern und den Watson-Button für alle User wieder ausblenden / einblenden, die die Berechtigung haben.

Ideen:

  • Neues Recht zur Benutzung von Watson?
  • Per User Setting anbieten? (Siehe QuickNavi)

Darstellung kleine Bilder z-Index und Breite

Auf kleinen Bildschirmen wird die Eingabe abgeschnitten weil Watson zu breit ist oder die Eingabe wird vom Menü überdeckt.
Lösungsvorschlag: z-index erhöhen und Breite auf eine maximal und min-breite definieren.

Bildschirmfoto 2022-04-09 um 14 09 05

Bildschirmfoto 2022-04-09 um 14 08 50

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.