[3.0][UMGT] RegistrationController: Maxim Loops exceeded

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

[3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dave » 11.03.2015, 21:23:34

Heute wollte ich mal die Registrierung für mein Portal fertig stellen. Ich verwende dabei das unveränderte Template sowie den Controller aus dem mitgelieferten UMGT. Als Fehlermeldung erhalte ich beim Aufrufen der Seite folgendes:
[XmlParser::getAttributesFromString()] Error while parsing: " class="APF\modules\usermanagement\pres\documentcontroller\registration\RegistrationController". Maximum number of loops ("20") exceeded!
Folgender Stacktrace:

Code: Alles auswählen

APF\core\frontcontroller\Frontcontroller->start()   ...www/preis-db/index.php  31
APF\core\pagecontroller\Page->loadDesign()          ...www/preis-db/APF/core/frontcontroller/Frontcontroller.php  251
APF\core\pagecontroller\Document->loadDesign()      ...www/preis-db/APF/core/pagecontroller/Page.php  89
APF\core\pagecontroller\Document->extractTagLibTags()       ...www/preis-db/APF/core/pagecontroller/Document.php  754
APF\core\pagecontroller\ImportTemplateTag->onParseTime()    ...www/preis-db/APF/core/pagecontroller/Document.php  1123
APF\core\pagecontroller\Document->extractTagLibTags()       ...www/preis-db/APF/core/pagecontroller/ImportTemplateTag.php  93
APF\tools\html\taglib\FallbackImportTemplateTag->onParseTime()  ...www/preis-db/APF/core/pagecontroller/Document.php  1123
APF\core\pagecontroller\ImportTemplateTag->onParseTime()        ...www/preis-db/APF/tools/html/taglib/FallbackImportTemplateTag.php  56
APF\core\pagecontroller\Document->extractTagLibTags()           ...www/preis-db/APF/core/pagecontroller/ImportTemplateTag.php  93
APF\core\pagecontroller\ImportTemplateTag->onParseTime()        ...www/preis-db/APF/core/pagecontroller/Document.php  1123
APF\core\pagecontroller\Document->extractTagLibTags()           ...www/preis-db/APF/core/pagecontroller/ImportTemplateTag.php  93
APF\tools\html\taglib\FallbackImportTemplateTag->onParseTime()  ...www/preis-db/APF/core/pagecontroller/Document.php  1123
APF\core\pagecontroller\ImportTemplateTag->onParseTime()        ...www/preis-db/APF/tools/html/taglib/FallbackImportTemplateTag.php  56
APF\core\pagecontroller\Document->extractDocumentController()   ...www/preis-db/APF/core/pagecontroller/ImportTemplateTag.php  90
APF\core\pagecontroller\XmlParser::getAttributesFromString()    ...www/preis-db/APF/core/pagecontroller/Document.php  1203  
Ideen? Hab schon einiges versucht und den Controller schlanker gemacht, allerdings hilft es nichts.

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

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dr.e. » 15.03.2015, 10:11:16

Hallo dave,

der XmlParser hat hierzu ein öffentlichen Parameter, den du einfach entsprechend anpassen kannst. Das geht so (z.B. in der index.php):

Code: Alles auswählen

XmlParser::$maxParserLoops = 40; 
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dave » 15.03.2015, 15:21:23

Ok, interessant. Welchen Sinn hast das Ganze?

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

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dr.e. » 16.03.2015, 12:17:26

Hallo dave,

das ist ein Sicherheitsmechanismus des Parsers, dass du ihn nicht mit einer "unendlichen" Anzahl an Attributen absichtlich crashen kannst. Eine Anzahl von 20 Attributen hat sich in der Vergangenheit als durchaus praktikabel erwiesen und eine Anzahl größer 20 ist hinsichtlich des Tag-Designs etwas fragwürdig. Kannst du mal ein Beispiel posten?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dave » 17.03.2015, 12:10:44

Das Beispiel ist der ausgelieferte RegistrationController vom UMGT.

Code: Alles auswählen

class RegistrationController extends UmgtBaseController {

   public function transformContent() {

      $form = & $this->getForm('register');

      if ($form->isSent() && $form->isValid()) {

         $uM = $this->getManager();

         $user = new UmgtUser();

         $firstName = $form->getFormElementByName('firstname');
         $firstNameValue = $firstName->getValue();
         $user->setFirstName($firstNameValue);

         $lastName = $form->getFormElementByName('lastname');
         $lastNameValue = $lastName->getValue();
         $user->setLastName($lastNameValue);

         $street = $form->getFormElementByName('street');
         $user->setStreetName($street->getValue());

         $number = $form->getFormElementByName('number');
         $user->setStreetNumber($number->getValue());

         $zip = $form->getFormElementByName('zip');
         $user->setZIPCode($zip->getValue());

         $city = $form->getFormElementByName('city');
         $user->setCity($city->getValue());

         $email = $form->getFormElementByName('email');
         $user->setEMail($email->getValue());

         $userName = $form->getFormElementByName('username');
         $userNameValue = $userName->getValue();
         $user->setUsername($userNameValue);

         $password = $form->getFormElementByName('password');
         $user->setPassword($password->getValue());

         // assemble display name to have a more readable user within the umgt mgmt UI
         if (empty($firstNameValue) && empty($lastNameValue)) {
            $user->setDisplayName($userNameValue);
         } else {
            $user->setDisplayName($lastNameValue . ', ' . $firstNameValue);
         }

         // add initial groups and roles if applicable
         try {
            foreach ($this->getInitialGroups() as $initialGroup) {
               $user->addGroup($initialGroup);
            }

            foreach ($this->getInitialRoles() as $initialRole) {
               $user->addRole($initialRole);
            }
         } catch (ConfigurationException $e) {
            $l = & Singleton::getInstance('APF\core\logging\Logger');
            /* @var $l Logger */
            $l->logEntry('registration', 'Registration cannot add initial groups or roles due to the following '
                  . 'exception: ' . $e . ' This may be ok, in case you have no initial groups and/or roles specified.',
                  LogEntry::SEVERITY_INFO);
         }

         try {
            $uM->saveUser($user);
            $this->getTemplate('register-ok')->transformOnPlace();
         } catch (Exception $e) {
            $this->getTemplate('system-error')->transformOnPlace();
            $l = & Singleton::getInstance('APF\core\logging\Logger');
            /* @var $l Logger */
            $l->logEntry('registration', 'Registration is not possible due to ' . $e, LogEntry::SEVERITY_ERROR);
         }
      } elseif ($form->isSent() && !$form->isValid()) {
         $form->setPlaceHolder('register-error', $this->getTemplate('register-error')->transformTemplate());
         $form->transformOnPlace();
      } else {
         $form->transformOnPlace();
      }

   }

   /**
    * Evaluates the user's initial groups that are applied during registration.
    *
    * @return UmgtGroup[] The list of initial groups.
    * @throws ConfigurationException In case of any misconfiguration.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1 12.12.2011
    */
   private function getInitialGroups() {

      $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'registration.ini');
      $section = $config->getSection('Default');

      if ($section === null) {
         throw new ConfigurationException('Section "default" is not defined within registration.ini');
      }

      $uM = $this->getManager();

      $groups = array();

      $initialGroups = $section->getSection('group');
      if ($initialGroups !== null) {
         foreach ($initialGroups->getValueNames() as $name) {
            $group = $uM->loadGroupByName($initialGroups->getValue($name));
            if ($group !== null) {
               $groups[] = $group;
            }
         }
      }

      return $groups;
   }

   /**
    * Evaluates the user's initial roles that are applied during registration.
    *
    * @return UmgtRole[] The list of initial roles.
    * @throws ConfigurationException In case of any misconfiguration.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1 12.12.2011
    */
   private function getInitialRoles() {

      $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'registration.ini');
      $section = $config->getSection('Default');

      if ($section === null) {
         throw new ConfigurationException('Section "default" is not defined within registration.ini');
      }

      $uM = $this->getManager();

      $roles = array();

      $initialRoles = $section->getSection('role');
      if ($initialRoles !== null) {
         foreach ($initialRoles->getValueNames() as $name) {
            $role = $uM->loadRoleByName($initialRoles->getValue($name));
            if ($role !== null) {
               $roles[] = $role;
            }
         }
      }

      return $roles;
   }

} 

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

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dr.e. » 17.03.2015, 21:45:02

Hallo dave,

das ist sehr komisch. Habe das Formular lokal in der Sandbox getestet und komme definitiv ohne Fehler (insbesondere diesen) durch den Prozess.

Nach deiner obigen Fehlermeldung müsste in der Datei APF\code\modules\usermanagement\pres\templates\registration\register.html ja ein Fehler im <@controller-Tag sein. Bei mir stehen in den ersten Zeilen:

Code: Alles auswählen

<@controller
class="APF\modules\usermanagement\pres\documentcontroller\registration\RegistrationController"
@>
<html:form class="umgt-fe-reg" name="register" method="post">
   <div>
      <p>
...
Daran sollte sich der Parser nicht verschlucken dürfen. Habe das gerade nochmal in einem Unit Test nachvollzogen:

Code: Alles auswählen

public function testSimpleAttributesParsing() {
   $class = 'APF\modules\usermanagement\pres\documentcontroller\registration\RegistrationController';
   $attributes = XmlParser::getAttributesFromString('class="' . $class . '"');
   $this->assertEquals($class, $attributes['class']);
} 
Kannst du mal genauer reinschauen, an was das liegen kann?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dave » 18.03.2015, 11:22:53

Fehler gefeunden!
Ich habe eine Kopie von APF\code\modules\usermanagement\pres\templates\registration\register.html erstellt und in meine App eingefügt, diese dann aufgerufen. Allerdings habe ich etwas entscheidendes geändert:

Ich mache den Aufruf des Controllers immer gern in einer Zeile, damit der Code schlanker wirkt. Habe dabei das Leerzeichen vom schliessenden @-Tag vergessen.

So sahs aus:

Code: Alles auswählen

<@controller class="APF\modules\usermanagement\pres\documentcontroller\registration\RegistrationController"@>
So muss es aussehen:

Code: Alles auswählen

<@controller class="APF\modules\usermanagement\pres\documentcontroller\registration\RegistrationController" @>
Ich bin der Meinung, dass die Fehlermeldungen des APF 1 früher auch aussagekräftiger waren sodass ich selbst irgendwie dem Problem auf die Schliche gekommen bin. Oder aber es benötigt einfach noch etwas Einarbeitungszeit ;)

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

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dr.e. » 20.03.2015, 00:08:36

Hallo dave,

danke für die Analyse. Konnte das nun lokal nachvollziehen. Ich schaue mir das am Wochenende nochmal an.
Viele Grüße,
Christian

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

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dr.e. » 20.03.2015, 09:37:41

Hallo dave,

bin doch schon heute Morgen im Zug dazu gekommen mir das anzusehen. Ist ein auf jeden Fall ein Bug im Parser, der den Document-Controller aus dem Template extrahiert und erzeugt. Habe bereits einen Fix dafür gebaut, schreibe gerade noch an Unit Tests um das abzusichern, dann pushe ich das auf GitHub.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dave » 20.03.2015, 09:49:23

Oh, sehr gut. Gute Arbeit! :)

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

Re: [3.0][UMGT] RegistrationController: Maxim Loops exceeded

Beitrag von dr.e. » 21.03.2015, 00:28:06

Hallo dave,

du kannst dir nun ein aktuelles Package unter https://github.com/AdventurePHP/code/archive/master.zip herunterladen. Viel Spass mit der neuen Version. :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast