html:a und html:link bug

Das Forum ist für das Melden von Bugs gedacht. // This forum is intended to report bugs with the APF.
welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

html:a und html:link bug

Beitrag von welworx » 23.11.2012, 00:01:35

einen bug hab ich noch:

Wenn man im html:a einen href als attribut setzt, dann wird dieser einfach ignoriert. Hab den fehler gefunden und gemeinsam mit dem a:getstring bug (viewtopic.php?f=8&t=1241&p=12667#p12667) behoben.

Hier die Dateien:

Code: Alles auswählen

<?php

/**
 * <!--
 * This file is part of the adventure php framework (APF) published under
 * http://adventure-php-framework.org.
 *
 * The APF is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * The APF is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the APF. If not, see http://www.gnu.org/licenses/lgpl-3.0.txt.
 * -->
 */
import('tools::link::taglib', 'a_taglib_getstring');
import('tools::link::taglib', 'html_taglib_link');

/**
 * @package tools::link::taglib
 * @class html_taglib_a
 *
 * This taglib generates a html link tag based on the html_taglib_link taglib.
 *
 * @author: Werner Liemberger wpublicmail [at] gmail DOT com
 * @version
 * Version 0.1, 06.08.2011<br />
 * Version 0.2, 22.11.2012<br /> Werner Liemberger: removed a:getstring and ignored href bug
 */
class html_taglib_a extends html_taglib_link {

    protected $attributeList = array('id' => null, 'style' => null, 'class' => null, 'onabort' => null,
        'onclick' => null, 'ondblclick' => null, 'onmousedown' => null, 'onmouseup' => null,
        'onmouseover' => null, 'onmousemove' => null, 'onmouseout' => null,
        'onkeypress' => null, 'onkeydown' => null, 'onkeyup' => null, 'tabindex' => null,
        'dir' => null, 'accesskey' => null, 'title' => null, 'charset' => null,
        'coords' => null, 'href' => null, 'hreflang' => null, 'name' => null, 'rel' => null,
        'rev' => null, 'shape' => null, 'target' => null, 'xml:lang' => null, 'onblur' => null);

    public function onParseTime() {
        // Move all vales from parameters which are in the white list into this array
        // and remove them from the attribute array, because they should not be part oft the url.
        foreach ($this->attributeList as $key => $elem) {
            $attr = $this->getAttribute($key, null);
            if ($attr != null) {
                $this->attributeList[$key] = $attr;
                if ($key != 'href') {
                    $this->deleteAttribute($key);
                }
            }
        }

        $this->attributeList['href'] = parent::transform();
        if ($this->attributeList['href'] === null) {
            throw new InvalidArgumentException('[html_taglib_a::onParseTime()] The Attribute "href" is missing. '
                    . 'Please provide the destination!', E_USER_ERROR);
        }
        $this->__extractTagLibTags();
    }

    public function __construct() {
        $this->__TagLibs[] = new TagLib('tools::link::taglib', 'a_taglib_getstring', 'a', 'getstring');
    }

    public function transform() {
        // If no Content is set, this taglib tries to set the title as content.
        // If this is also missing it throws an Exception. This exception is needed,
        // because otherwise you will get an invalid html.
        $content = $this->getContent();
        if (empty($content)) {
            $content = $this->attributeList['title'];
        }

        if (empty($content)) {
            throw new InvalidArgumentException('No anchor text available!');
        }

        // if the current link is active, this taglib adds the css class active.
        if (!isset($this->attributeList['href'])) {
            return '';
        }
        if (substr_count(str_replace('&', '&', Registry::retrieve('apf::core', 'CurrentRequestURL')), $this->attributeList['href']) > 0) {
            $this->attributeList['class'] = $this->attributeList['class'] . ' active';
        }

        foreach ($this->attributeList as $key => $elem) {
            if ($elem === null) {
                unset($this->attributeList[$key]);
            }
        }

        return '<a ' . $this->getAttributesAsString($this->attributeList) . '>' . $content . '</a>';
    }

}
 

Code: Alles auswählen

<?php
/**
 * <!--
 * This file is part of the adventure php framework (APF) published under
 * http://adventure-php-framework.org.
 *
 * The APF is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * The APF is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the APF. If not, see http://www.gnu.org/licenses/lgpl-3.0.txt.
 * -->
 */
import('tools::link', 'LinkGenerator');

/**
 * @package tools::link::taglib
 * @class html_taglib_link
 *
 * This taglib generates a url with the given parameters taking care of the
 * current LinkScheme.
 *
 * @author Ralf Schubert <<a href="http://develovision.de">Develovision Webentwicklung</a>>
 * @version
 * Version 0.1, 28.07.2011<br />
 * Version 0.2, 22.11.2012<br /> Werner Liemberger: removed a:getstring and ignored href bug
 */
class html_taglib_link extends Document {

   public function transform() {
      $parameters = $this->getAttributes();

      if (isset($parameters['href'])) {
         $url = Url::fromString($parameters['href']);
         unset($parameters['href']);
      } else {
         $url = Url::fromCurrent(true);
      }

      $queryOption = 'set';
      if (isset($parameters['queryoption'])) {
         $queryOption = $parameters['queryoption'];
         unset($parameters['queryoption']);
      }

      if ($queryOption === 'merge') {
         $url->mergeQuery($parameters);
      } else {
         $url->setQuery($parameters);
      }

      return LinkGenerator::generateUrl($url);
   }
}
 

Code: Alles auswählen

<?php

class a_taglib_getstring extends html_taglib_getstring {

    public function onAfterAppend() {
        $this->getParentObject()->setContent(parent::transform());
    }

    public function transform() {
        return '';
    }

} 

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 25.11.2012, 14:50:48

Hallo Werner,

danke für deinen Input. Ich habe deine Dateien ins SVN in Version 1.17 integriert. Kannst du das bitte mal testen?

Noch eine Anmerkung zur Benennung: ich habe im Sinne des Roadmap-Eintrags zum Refactoring der Klassen-Namen die Klassen/Dateien entsprechend umbenannt.
  • html_taglib_getstring -> LanguageLabelTag
  • a_taglib_getstring -> LinkLanguageLabelTag
  • html_taglib_a -> HtmlLinkTag
Bei der Gelegenheit ist mir aufgefallen, dass es für die hier besprochenen Tags noch keine Dokumentation gibt. Kümmerst du dich um eine Doku dafür für 1.17?
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: html:a und html:link bug

Beitrag von welworx » 28.11.2012, 02:05:00

hab soeben die doku seite angelegt und entsprechend verlinkt. Muss sie nur noch befüllen ;)

Mir ist dabei jedenfalls aufgefallen, das noch etwas fehlt. Es wäre praktisch, wenn man das title attribut auch sprachabhängig aus einer config laden könnte.

ohne es bisher getestet zu haben sollte es vermutlich so aussehen:

Code: Alles auswählen

<?php
/**
 * <!--
 * This file is part of the adventure php framework (APF) published under
 * http://adventure-php-framework.org.
 *
 * The APF is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * The APF is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the APF. If not, see http://www.gnu.org/licenses/lgpl-3.0.txt.
 * -->
 */

/**
 * @package tools::link::taglib
 * @class LinkLanguageTitleTag
 *
 * Re-implements the language label tag for the link tags.
 *
 * @author Werner Liemberger wpublicmail [at] gmail DOT com
 * @version
 * Version 0.1, 28.11.2012<br />
 */
class LinkLanguageTitleTag extends LanguageLabelTag {

   public function onAfterAppend() {
       $this->getParentObject()->setAttribute('Title', parent::transform());
   }

   public function transform() {
      return '';
   }

} 
weiters muss das natürlich dann auch in die default taglibs aufgenommen werden.

Einwände?

LG Werner

EDIT: beim Beginnen des schreiben der Doku ist mir eingefallen, dass es vlt praktisch wäre, wenn man einen eigenen Taglib anbieten würde der wenn der Link aktiv ist, einen anderen getstring holt. (auch wenn mir dazu grad kein bsp einfällt wozu man das brauchen könnte)

EDIT2: Stellst du dir sowas vor: http://wiki.adventure-php-framework.org/HtmlLinkTag ?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 28.11.2012, 23:29:04

Hallo Werner,

ich hatte vorher in der U-Bahn schon mal eine Antwort erstellt, mir ist dann leider das Netz abgerissen. Daher hier meine Antwort:

Da du noch einige Ideen für die Umsetzung und offensichtlich auch Fehler gefunden hast, schlage ich vor, das Proposal das du angefangen hast zu Ende zu schreiben und alle möglichen Anwendungsfälle als Vorlage für die Entwicklung und Dokumentation zu skizzieren. Anschließend können wir gemeinsam - oder du, da dir das Thema am Herzen liegt - die Implementierung dahingehend verbessern/korrigieren/erweitern. Die Implementierung integriere ich dann gerne wie gewohnt ins SVN.
EDIT2: Stellst du dir sowas vor: http://wiki.adventure-php-framework.org/HtmlLinkTag ?
Jep, das gefällt mir schon sehr gut. Sobald du fertig bist, sag Bescheid, dann geben bitten wir die anderen um Feedback.

Einverstanden mit der Vorgehensweise?
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: html:a und html:link bug

Beitrag von welworx » 30.11.2012, 00:41:57

Hey,

implementierung ist fertig und unter 1.17 getestet.

Alle dateien liegen in der zip datei bei.

Habe nun, wie in der doku bereits hinzugefügt, zwei klassen ins Angebot aufgenommen, die falls verwendet, bei aktivem link title und/oder Link Text ändern.

Somit gibt es nun neben der automatisch hinzugefügten CSS class active maximale Flexibilität ;)

Sofern es gefällt, bitte ins SVN einchecken.

LG Werner
Dateianhänge
tools_link.zip
(6.92 KiB) 59-mal heruntergeladen

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 01.12.2012, 23:02:41

Hallo Werner,

integriere deinen Code sobald ich nächstes Wochenende wieder in München bin.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 12.01.2013, 11:11:12

Hallo Werner,

ich habe soeben deinen Code in das SVN integriert. Neben Anpassungen auf die in 1.17 neue API (siehe http://wiki.adventure-php-framework.org ... 6_auf_1.17) habe ich einige Stellen gefunden, die folgendes tun:

Code: Alles auswählen

      // removes remaining if link is not active
      $count = substr_count($parent->getContent(), '<' . $this->getObjectId() . " />\r\n");
      if ($count > 0) {
         $parent->setContent(str_replace('<' . $this->getObjectId() . ' />' . "\r\n", '', $parent->getContent()));
      } else {
         $parent->setContent(str_replace('<' . $this->getObjectId() . ' />', '', $parent->getContent()));
      } 
Ich verstehe den Code grundsätzlich, allerdings nicht, warum Marker des APF-Parser künstlich entfernt werden. Kannst du das nicht in der transform()-Methode des jeweiligen Tags regeln? Effektiv entfernst du zwar den Marker, verhinderst aber die Transformation nicht. Sofern du beides verhinden möchtest, musst du auch die Kind-Instanzen aus dem $this->children-Arrays entfernen. Die sauberste Möglichkeit ist IMHO jedoch den relevanten Knoten einfach in der transform() keinen Output generieren zu lassen.

Kannst du dir bitte das Ersetzungsthema und meinen Checkin nochmals validieren? Danke! :)
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 22.01.2013, 00:22:18

Hallo Werner,

konntest du dir das Thema schon ansehen?
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: html:a und html:link bug

Beitrag von welworx » 22.01.2013, 09:10:54

hi christian,

hatte leider noch keine zeit mir das anzusehen.

Bei den zwei taglibs (LinkLanguageLabelActiveTag und LinkLanguageTitleActiveTag) handlet es sich ja um taglibs die als child dem HtmlLinkTag eingefügt werden. Ohne diese section produzieren sie als Output

Code: Alles auswählen

<02ca81dd8cf73668a1ab99854975ae76 /> 
dh im normalfall wird ihre transform methode garnicht aufgerufen. Nur warum nicht?

LG Werner

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 22.01.2013, 13:30:20

Hi Werner,

hast du mal ein Beispiel-Template/Controller mit dem ich deinen Fall nachstellen kann?
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: html:a und html:link bug

Beitrag von welworx » 23.01.2013, 00:36:43

zb mit dem hier:

Code: Alles auswählen

<core:addtaglib    namespace="tools::link::taglib"    class="HtmlLinkTag"     prefix="html"   name="a" /> 
<html:a parameter="value" href="" newparameter="newvalue" parametertoremove="" class="cssclass">
    <a:getstring namespace="examples::link" config="labels" entry="link.text" />
    <aActive:getstring namespace="examples::link" config="labels" entry="link.text.active" />
    
    <title:getstring namespace="examples::link" config="labels" entry="link.title" />
    <titleActive:getstring namespace="examples::link" config="labels" entry="link.title.active" />
</html:a>


<core:addtaglib    namespace="tools::link::taglib"    class="HtmlLinkTag"     prefix="html"   name="a" /> 
<html:a parameter="value" href="" newparameter="newvalue" parametertoremove="" class="cssclass">
    <aActive:getstring namespace="examples::link" config="labels" entry="link.text.active" />
    xxx
</html:a>
 

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 25.01.2013, 01:30:00

Danke, werde mir den Effekt genauer ansehen. Aktuell arbeite ich nur an einem spannenden Thema für den APF-Parser (Details in Kürze). Sobald ich damit fertig bin, melde ich mich wieder. Hoffe es ist nicht allzudringend...
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 27.01.2013, 21:34:21

Hallo Werner,

ich habe mir dein Beispiel basierend auf des aktuellen SVN-Standes (1.17, Revision #2072) angesehen und ich kann den Effekt nicht reproduzieren. Deine Taglib LinkLanguageLabelTag bzw. LinkLanguageLabelActiveTag überschreiben den Inhalt der HtmlLinkTag ja im onAfterAppend() mit einem statischen Wert, so dass die Marker-Tags autpmatisch verschwinden.

Aus meiner Sicht ist das Überschreiben der Marker-Tags nicht ideal, funktioniert aber bei mir gemäß deiner Erwartungshaltung.

Kannst du dein Phänomen nochmal auf dem 1.17-SVN-Stand nachtesten?
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: html:a und html:link bug

Beitrag von welworx » 27.01.2013, 22:26:30

hallo christian,

habs mit 1.17, Revision #2077 getestet.

Wenn man

Code: Alles auswählen

 // removes remaining if link is not active
      $count = substr_count($parent->getContent(), '<' . $this->getObjectId() . " />\r\n");
      if ($count > 0) {
         $parent->setContent(str_replace('<' . $this->getObjectId() . ' />' . "\r\n", '', $parent->getContent()));
      } else {
         $parent->setContent(str_replace('<' . $this->getObjectId() . ' />', '', $parent->getContent()));
      } 
auskommentiert, dann funktionierts nicht. Lässt man es drinnen, funktioniert es.

LG werner

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: html:a und html:link bug

Beitrag von dr.e. » 27.01.2013, 22:53:23

Das ist klar. Wenn du die benannten Stellen ausmärzt, musst du die Kinder natürlich innerhalb der HtmlLinkTag-Implementierung transformieren (z.B. mit transformChildrenAsEmpty()). Einfach auskommentieren ist natürlich keine Lösung. ;)
Viele Grüße,
Christian

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast