public function validation($data, $files)
 {
     $errors = parent::validation($data, $files);
     $question = $this->_customdata;
     // Inputs.
     $inputnames = array();
     foreach ($question->inputs as $inputname => $notused) {
         $field = 'inputname_' . $inputname;
         $proposedname = $data[$field];
         if (!stack_utils::is_valid_name($proposedname)) {
             $errors[$field] = stack_string('notavalidname');
         } else {
             if (array_key_exists($proposedname, $inputnames)) {
                 $errors[$field] = stack_string('namealreadyused');
             } else {
                 $inputnames[$proposedname] = $inputname;
             }
         }
     }
     // PRTs.
     $prtnames = array();
     foreach ($question->prts as $prtname => $notused) {
         $field = 'prtname_' . $prtname;
         $proposedname = $data[$field];
         if (!stack_utils::is_valid_name($proposedname)) {
             $errors[$field] = stack_string('notavalidname');
         } else {
             if (array_key_exists($proposedname, $prtnames)) {
                 $errors[$field] = stack_string('namealreadyused');
             } else {
                 $prtnames[$proposedname] = $prtname;
             }
         }
     }
     foreach ($question->prts as $prtname => $prt) {
         $nodenames = array();
         $nodes = $prt->get_nodes_summary();
         foreach ($nodes as $nodekey => $notused) {
             $field = 'nodename_' . $prtname . '_' . $nodekey;
             $proposedname = $data[$field];
             if ($proposedname < 1) {
                 $errors[$field] = stack_string('notavalidname');
             } else {
                 if (array_key_exists($proposedname, $nodenames)) {
                     $errors[$field] = stack_string('namealreadyused');
                 } else {
                     $nodenames[$proposedname] = $nodekey;
                 }
             }
         }
     }
     return $errors;
 }