Uploaded image for project: 'Moodle'
  1. Moodle
  2. MDL-35158

Random Glossary block returns an error when you delete the linked glossary

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: 2.3.1
    • Fix Version/s: 2.3.4
    • Component/s: Glossary
    • Labels:

      Description

      Notice: Undefined index: 72 in S:\htdocs\moodle\blocks\glossary_random\block_glossary_random.php on line 132

      We're getting the above error on a course with the glossary and glossary random module installed.

      Reproduction steps:

      1. switch on debugging
      2. add a glossary activity (can be empty)
      3. add a Random Glossary block and configure it - just need to point it at the glossary you added and save
      4. delete the original Glossary
      5. Refresh the course page

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

              Hide
              bencosk Filip Benčo added a comment -

              This happens when you delete glossary, which is used by glossary_random block.

              I have attached a patch.

              Have a nice day.

              Filip

              Show
              bencosk Filip Benčo added a comment - This happens when you delete glossary, which is used by glossary_random block. I have attached a patch. Have a nice day. Filip
              Hide
              salvetore Michael de Raadt added a comment -

              Thanks for the report and the patch.

              Show
              salvetore Michael de Raadt added a comment - Thanks for the report and the patch.
              Hide
              salvetore Michael de Raadt added a comment -

              Here is some more information from a duplicate issue. Credit to Howard Miller.

              The code checks that it has configuration data and doesn't do anything if it doesn't. Once it has been successfully configured it can drop through to this line..

              $cm = $modinfo->instances['glossary'][$glossaryid];

              This fails because there is no 'glossary' index (there aren't any). A simple solution is to wrap that in an isset() and provide a sensible message. Better yet, it should un-configure itself under these conditions

              Show
              salvetore Michael de Raadt added a comment - Here is some more information from a duplicate issue. Credit to Howard Miller. The code checks that it has configuration data and doesn't do anything if it doesn't. Once it has been successfully configured it can drop through to this line.. $cm = $modinfo->instances['glossary'][$glossaryid]; This fails because there is no 'glossary' index (there aren't any). A simple solution is to wrap that in an isset() and provide a sensible message. Better yet, it should un-configure itself under these conditions
              Hide
              smakb Stephen Bloomer added a comment -

              Still there in 2.3.2. Causing issues as it wipes all access (including admins) and we have to restore from the last backup. It has happened twice to us know.

              Show
              smakb Stephen Bloomer added a comment - Still there in 2.3.2. Causing issues as it wipes all access (including admins) and we have to restore from the last backup. It has happened twice to us know.
              Hide
              dgmorrow@gmail.com David Morrow added a comment - - edited

              This seemed related, so I'm adding it to this issue instead of starting a new one. Main difference is that the glossary in question was not deleted, but had all of its entries deleted during a reset, and the error shows when importing material from that course into another course.:

              Situation (Moodle 2.3.2+ Build: 20120920):

              Course A containing several glossary and one Random Glossary Entry Block
              Course A is reset, deleting all glossary entries
              New Course B created and Import function used to pull one topic section from Course A
              Process ends with the following (debugging on):

              Coding error detected, it must be fixed by a programmer: PHP catchable fatal error
              Debug info: Argument 2 passed to has_capability() must be an instance of context, null given, called in /usr/share/moodle/blocks/glossary_random/block_glossary_random.php on line 134 and defined
              Error code: codingerror
              Stack trace:
              • line 397 of /lib/setuplib.php: coding_exception thrown
              • line 355 of /lib/accesslib.php: call to default_error_handler()
              • line 134 of /blocks/glossary_random/block_glossary_random.php: call to has_capability()
              • line 281 of /blocks/moodleblock.class.php: call to block_glossary_random->get_content()
              • line 232 of /blocks/moodleblock.class.php: call to block_base->formatted_contents()
              • line 935 of /lib/blocklib.php: call to block_base->get_content_for_output()
              • line 987 of /lib/blocklib.php: call to block_manager->create_block_contents()
              • line 352 of /lib/blocklib.php: call to block_manager->ensure_content_created()
              • line 7 of /theme/base/layout/general.php: call to block_manager->region_has_content()
              • line 765 of /lib/outputrenderers.php: call to include()
              • line 712 of /lib/outputrenderers.php: call to core_renderer->render_page_layout()
              • line 227 of /course/view.php: call to core_renderer->header()

              If the Random Entry Block is removed, the process competes successfully.
              If the Random Entry Block is added back, same error and stack trace are returned.

              The imported section contains a glossary, but not the one associated with the Random Glossary Entry Block.

              If the entire course is imported into the new course, the process completes successfully.

              Show
              dgmorrow@gmail.com David Morrow added a comment - - edited This seemed related, so I'm adding it to this issue instead of starting a new one. Main difference is that the glossary in question was not deleted, but had all of its entries deleted during a reset, and the error shows when importing material from that course into another course.: Situation (Moodle 2.3.2+ Build: 20120920): Course A containing several glossary and one Random Glossary Entry Block Course A is reset, deleting all glossary entries New Course B created and Import function used to pull one topic section from Course A Process ends with the following (debugging on): Coding error detected, it must be fixed by a programmer: PHP catchable fatal error Debug info: Argument 2 passed to has_capability() must be an instance of context, null given, called in /usr/share/moodle/blocks/glossary_random/block_glossary_random.php on line 134 and defined Error code: codingerror Stack trace: • line 397 of /lib/setuplib.php: coding_exception thrown • line 355 of /lib/accesslib.php: call to default_error_handler() • line 134 of /blocks/glossary_random/block_glossary_random.php: call to has_capability() • line 281 of /blocks/moodleblock.class.php: call to block_glossary_random->get_content() • line 232 of /blocks/moodleblock.class.php: call to block_base->formatted_contents() • line 935 of /lib/blocklib.php: call to block_base->get_content_for_output() • line 987 of /lib/blocklib.php: call to block_manager->create_block_contents() • line 352 of /lib/blocklib.php: call to block_manager->ensure_content_created() • line 7 of /theme/base/layout/general.php: call to block_manager->region_has_content() • line 765 of /lib/outputrenderers.php: call to include() • line 712 of /lib/outputrenderers.php: call to core_renderer->render_page_layout() • line 227 of /course/view.php: call to core_renderer->header() If the Random Entry Block is removed, the process competes successfully. If the Random Entry Block is added back, same error and stack trace are returned. The imported section contains a glossary, but not the one associated with the Random Glossary Entry Block. If the entire course is imported into the new course, the process completes successfully.
              Hide
              ohameiri omer added a comment -

              Was able to reproduce here...
              2.3.1

              Also happens when you import a whole course and the glossary comes empty.

              Omer

              Show
              ohameiri omer added a comment - Was able to reproduce here... 2.3.1 Also happens when you import a whole course and the glossary comes empty. Omer
              Hide
              allanlee Allan Lee Mesina added a comment -

              This is also happening on our freshly installed Moodle 2.3.2

              By looking at line 134 of the block_glossary_random.php, it tries to get the context_instance of a glossary. If the glossary has already been deleted, it will give out the error. Starting at line 138 is a code that should prevent the error. This is a simple logic that has been missed by the programmer. This should be changed so that the check is done prior to calling for a context_instance.

              In my attempt to resolve this issue, I managed to get rid of the error by changing the order of the if statements starting at line 134.

              Change lines 134 through 148

              from

              <code>
              if (!has_capability('mod/glossary:view', get_context_instance(CONTEXT_MODULE, $cm->id)))

              { return ''; }

              if (!isset($modinfo->instances['glossary'][$glossaryid])) { // we can get here if the glossary has been deleted, so // unconfigure the glossary from the block.. $this->config->glossary = 0; $this->config->cache = ''; $this->instance_config_commit(); $this->content->text = get_string('notyetconfigured','block_glossary_random'); $this->content->footer = ''; return $this->content; }
              </code>

              to

              <code>
              if (!isset($modinfo->instances['glossary'][$glossaryid])) { // we can get here if the glossary has been deleted, so // unconfigure the glossary from the block.. $this->config->glossary = 0; $this->config->cache = ''; $this->instance_config_commit(); $this->content->text = get_string('notyetconfigured','block_glossary_random'); $this->content->footer = ''; return $this->content; }

              if (!has_capability('mod/glossary:view', get_context_instance(CONTEXT_MODULE, $cm->id))) { return ''; }

              </code>

              Show
              allanlee Allan Lee Mesina added a comment - This is also happening on our freshly installed Moodle 2.3.2 By looking at line 134 of the block_glossary_random.php, it tries to get the context_instance of a glossary. If the glossary has already been deleted, it will give out the error. Starting at line 138 is a code that should prevent the error. This is a simple logic that has been missed by the programmer. This should be changed so that the check is done prior to calling for a context_instance. In my attempt to resolve this issue, I managed to get rid of the error by changing the order of the if statements starting at line 134. Change lines 134 through 148 from <code> if (!has_capability('mod/glossary:view', get_context_instance(CONTEXT_MODULE, $cm->id))) { return ''; } if (!isset($modinfo->instances ['glossary'] [$glossaryid] )) { // we can get here if the glossary has been deleted, so // unconfigure the glossary from the block.. $this->config->glossary = 0; $this->config->cache = ''; $this->instance_config_commit(); $this->content->text = get_string('notyetconfigured','block_glossary_random'); $this->content->footer = ''; return $this->content; } </code> to <code> if (!isset($modinfo->instances ['glossary'] [$glossaryid] )) { // we can get here if the glossary has been deleted, so // unconfigure the glossary from the block.. $this->config->glossary = 0; $this->config->cache = ''; $this->instance_config_commit(); $this->content->text = get_string('notyetconfigured','block_glossary_random'); $this->content->footer = ''; return $this->content; } if (!has_capability('mod/glossary:view', get_context_instance(CONTEXT_MODULE, $cm->id))) { return ''; } </code>
              Hide
              watersevenub Jozas Nhial added a comment -

              We solved the issue deleting the block in the database. In case anyone runs into this problem:
              select * from mdl_context where instanceid=COURSEID;
              (From the output read the ID of the table with depth 3, which will assume the value of CONTEXTID in the next select);
              select * from mdl_block_instances where parentcontextid=CONTEXTID and blockname="glossary_random";
              Check the ID of the block you want to delete (IDBLOCKINSTANCES). Then, after backuping up everything:
              delete from mdl_block_instances where id=IDBLOCKINSTANCES

              Show
              watersevenub Jozas Nhial added a comment - We solved the issue deleting the block in the database. In case anyone runs into this problem: select * from mdl_context where instanceid=COURSEID; (From the output read the ID of the table with depth 3, which will assume the value of CONTEXTID in the next select); select * from mdl_block_instances where parentcontextid=CONTEXTID and blockname="glossary_random"; Check the ID of the block you want to delete (IDBLOCKINSTANCES). Then, after backuping up everything: delete from mdl_block_instances where id=IDBLOCKINSTANCES
              Hide
              phalacee Jason Fowler added a comment -

              Thanks Andreas, I've just had a look at the code (this was pushed before I could set up the peer review) and it passes the requirements as best I can tell. I haven't tested the code or done any work on this at all.

              Show
              phalacee Jason Fowler added a comment - Thanks Andreas, I've just had a look at the code (this was pushed before I could set up the peer review) and it passes the requirements as best I can tell. I haven't tested the code or done any work on this at all.
              Hide
              poltawski Dan Poltawski added a comment -

              Makes sense, thanks guys, i've integrated this now.

              Show
              poltawski Dan Poltawski added a comment - Makes sense, thanks guys, i've integrated this now.
              Hide
              rwijaya Rossiani Wijaya added a comment -

              This is working as expected.

              However, after deleting the glossary activity, strict standards warning appears. I created MDL-36737 to fix the warning.

              Test passed.

              Show
              rwijaya Rossiani Wijaya added a comment - This is working as expected. However, after deleting the glossary activity, strict standards warning appears. I created MDL-36737 to fix the warning. Test passed.
              Hide
              poltawski Dan Poltawski added a comment -

              Congratulations! Another bug solved.. only another 7330 to go, thanks for contributing to contributing to 0.8% of all bugs being fixed this week!

              ciao
              Dan

              Show
              poltawski Dan Poltawski added a comment - Congratulations! Another bug solved.. only another 7330 to go, thanks for contributing to contributing to 0.8% of all bugs being fixed this week! ciao Dan

                People

                • Votes:
                  5 Vote for this issue
                  Watchers:
                  7 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved:
                    Fix Release Date:
                    14/Jan/13