[OzzModz] Advanced Forms

[OzzModz] Advanced Forms [Paid] 2.2.4 Beta 1

No permission to buy ($30.00)
I don't know of anyone using the forms system to do this. Mainly because there is no payment system in the add-on. But it could probably be used for it by redirecting the user to PayPal after they fill out the form.

Thanks, I understand. I do not need paid advertising, but I'm looking for a way to reasonably classify separate ads (threads) and search between them.

Are there any live examples somewhere deployed that I could see before trying to put it into practice? I would like to see this module in practice - different uses to better illustrate its possibilities.
 
Thanks, I understand. I do not need paid advertising, but I'm looking for a way to reasonably classify separate ads (threads) and search between them.

Are there any live examples somewhere deployed that I could see before trying to put it into practice? I would like to see this module in practice - different uses to better illustrate its possibilities.
I'm using it at Cameraderie photography forum for the classifieds forum. Here's a link to a real thread that was created by a member using Snog's add-on...

To see the form in action, create an account and start creating a new thread in that forum (but don't save it unless, of course, you're actually selling something or looking to buy something or looking to trade something ;)). When you create a new thread the first question is what type of transaction it is, For Sale / WTB / Trade, if you switch between the different options you'll see an example of a form optional field "Price" appear & disappear from the form based on what your choose.

Snog's other add-on, Prefix Actions, makes a nice companion for this purpose. In my case, after a member creates a classifieds transaction then they can come back later, change the prefix, and based upon the prefix they choose it'll close the thread and move it to a corresponding 'archive' forum.
 
@Snog

Did an upgrade to 2.1.1 and now my form is breaking.

Also moved to PHP 7.3.1 in case it's relevant.

  • InvalidArgumentException: Attempted to convert NULL to string/binary [question]
  • src/XF/Mvc/Entity/Entity.php:740
  • Generated by: caddyboy
  • Mar 15, 2019 at 12:25 PM
Stack trace
#0 src/XF/Mvc/Entity/Entity.php(618): XF\Mvc\Entity\Entity->_castValueToType(NULL, 'question', 5, Array)
#1 src/XF/Mvc/Entity/Entity.php(548): XF\Mvc\Entity\Entity->set('question', NULL)
#2 src/XF/Service/Poll/Creator.php(71): XF\Mvc\Entity\Entity->__set('question', NULL)
#3 src/addons/Snog/Forms/ControllerPlugin/Poll.php(16): XF\Service\Poll\Creator->setQuestion(NULL)
#4 src/addons/Snog/Forms/Pub/Controller/Form.php(1625): Snog\Forms\ControllerPlugin\Poll->setupPollCreate('thread', Object(ForumApps\API\XF\Entity\Thread), Object(Snog\Forms\Entity\Form), 1)
#5 src/XF.php(478): Snog\Forms\Pub\Controller\Form->Snog\Forms\Pub\Controller\{closure}()
#6 src/addons/Snog/Forms/Pub/Controller/Form.php(1696): XF::asVisitor(Object(ForumApps\API\XF\Entity\User), Object(Closure))
#7 src/addons/Snog/Forms/Pub/Controller/Form.php(1060): Snog\Forms\Pub\Controller\Form->createThread(Array)
#8 src/XF/Mvc/Dispatcher.php(321): Snog\Forms\Pub\Controller\Form->actionSubmit(Object(XF\Mvc\ParameterBag))
#9 src/XF/Mvc/Dispatcher.php(244): XF\Mvc\Dispatcher->dispatchClass('Snog\\Forms:Form', 'Submit', Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#10 src/XF/Mvc/Dispatcher.php(100): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#11 src/XF/Mvc/Dispatcher.php(50): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#12 src/XF/App.php(2177): XF\Mvc\Dispatcher->run()
#13 src/XF.php(390): XF\App->run()
#14 index.php(20): XF::runApp('XF\\Pub\\App')
#15 {main}

-------------

Previous InvalidArgumentException: Attempted to convert NULL to string/binary - src/XF/Mvc/Entity/ValueFormatter.php:130
#0 src/XF/Mvc/Entity/Entity.php(736): XF\Mvc\Entity\ValueFormatter->castValueToType(NULL, 5, Array)
#1 src/XF/Mvc/Entity/Entity.php(618): XF\Mvc\Entity\Entity->_castValueToType(NULL, 'question', 5, Array)
#2 src/XF/Mvc/Entity/Entity.php(548): XF\Mvc\Entity\Entity->set('question', NULL)
#3 src/XF/Service/Poll/Creator.php(71): XF\Mvc\Entity\Entity->__set('question', NULL)
#4 src/addons/Snog/Forms/ControllerPlugin/Poll.php(16): XF\Service\Poll\Creator->setQuestion(NULL)
#5 src/addons/Snog/Forms/Pub/Controller/Form.php(1625): Snog\Forms\ControllerPlugin\Poll->setupPollCreate('thread', Object(ForumApps\API\XF\Entity\Thread), Object(Snog\Forms\Entity\Form), 1)
#6 src/XF.php(478): Snog\Forms\Pub\Controller\Form->Snog\Forms\Pub\Controller\{closure}()
#7 src/addons/Snog/Forms/Pub/Controller/Form.php(1696): XF::asVisitor(Object(ForumApps\API\XF\Entity\User), Object(Closure))
#8 src/addons/Snog/Forms/Pub/Controller/Form.php(1060): Snog\Forms\Pub\Controller\Form->createThread(Array)
#9 src/XF/Mvc/Dispatcher.php(321): Snog\Forms\Pub\Controller\Form->actionSubmit(Object(XF\Mvc\ParameterBag))
#10 src/XF/Mvc/Dispatcher.php(244): XF\Mvc\Dispatcher->dispatchClass('Snog\\Forms:Form', 'Submit', Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#11 src/XF/Mvc/Dispatcher.php(100): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#12 src/XF/Mvc/Dispatcher.php(50): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#13 src/XF/App.php(2177): XF\Mvc\Dispatcher->run()
#14 src/XF.php(390): XF\App->run()
#15 index.php(20): XF::runApp('XF\\Pub\\App')
#16 {main}
Request state
array(4) {
["url"] => string(31) "/form/hot-deals-submit.2/submit"
["referrer"] => string(48) "https://mysite.com/form/2/select"
["_GET"] => array(1) {
["/form/hot-deals-submit_2/submit"] => string(0) ""
}
["_POST"] => array(7) {
["question"] => array(10) {
[49] => string(2) "24"
[48] => string(4) "test"
[50] => string(1) "2"
[51] => string(34) "https://canadiancorvetteforums.com"
[52] => string(6) "Retail"
[57] => string(1) "1"
[53] => string(5) "22.99"
[54] => string(2) "11"
[55] => string(10) "2019-03-20"
["56_html"] => string(16) "<p>gwgwqgqwg</p>"
}
["attachment_hash"] => string(32) "7b97d77666140fce51e45edd63baf592"
["attachment_hash_combined"] => string(83) "{"type":"post","context":{"node_id":202},"hash":"7b97d77666140fce51e45edd63baf592"}"
["_xfToken"] => string(8) "****"
["_xfRequestUri"] => string(14) "/form/2/select"
["_xfWithData"] => string(1) "1"
["_xfResponseType"] => string(4) "json"
}
}
 
@Snog

Did an upgrade to 2.1.1 and now my form is breaking.

Also moved to PHP 7.3.1 in case it's relevant.

  • InvalidArgumentException: Attempted to convert NULL to string/binary [question]
  • src/XF/Mvc/Entity/Entity.php:740
  • Generated by: caddyboy
  • Mar 15, 2019 at 12:25 PM
Stack trace
#0 src/XF/Mvc/Entity/Entity.php(618): XF\Mvc\Entity\Entity->_castValueToType(NULL, 'question', 5, Array)
#1 src/XF/Mvc/Entity/Entity.php(548): XF\Mvc\Entity\Entity->set('question', NULL)
#2 src/XF/Service/Poll/Creator.php(71): XF\Mvc\Entity\Entity->__set('question', NULL)
#3 src/addons/Snog/Forms/ControllerPlugin/Poll.php(16): XF\Service\Poll\Creator->setQuestion(NULL)
#4 src/addons/Snog/Forms/Pub/Controller/Form.php(1625): Snog\Forms\ControllerPlugin\Poll->setupPollCreate('thread', Object(ForumApps\API\XF\Entity\Thread), Object(Snog\Forms\Entity\Form), 1)
#5 src/XF.php(478): Snog\Forms\Pub\Controller\Form->Snog\Forms\Pub\Controller\{closure}()
#6 src/addons/Snog/Forms/Pub/Controller/Form.php(1696): XF::asVisitor(Object(ForumApps\API\XF\Entity\User), Object(Closure))
#7 src/addons/Snog/Forms/Pub/Controller/Form.php(1060): Snog\Forms\Pub\Controller\Form->createThread(Array)
#8 src/XF/Mvc/Dispatcher.php(321): Snog\Forms\Pub\Controller\Form->actionSubmit(Object(XF\Mvc\ParameterBag))
#9 src/XF/Mvc/Dispatcher.php(244): XF\Mvc\Dispatcher->dispatchClass('Snog\\Forms:Form', 'Submit', Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#10 src/XF/Mvc/Dispatcher.php(100): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#11 src/XF/Mvc/Dispatcher.php(50): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#12 src/XF/App.php(2177): XF\Mvc\Dispatcher->run()
#13 src/XF.php(390): XF\App->run()
#14 index.php(20): XF::runApp('XF\\Pub\\App')
#15 {main}

-------------

Previous InvalidArgumentException: Attempted to convert NULL to string/binary - src/XF/Mvc/Entity/ValueFormatter.php:130
#0 src/XF/Mvc/Entity/Entity.php(736): XF\Mvc\Entity\ValueFormatter->castValueToType(NULL, 5, Array)
#1 src/XF/Mvc/Entity/Entity.php(618): XF\Mvc\Entity\Entity->_castValueToType(NULL, 'question', 5, Array)
#2 src/XF/Mvc/Entity/Entity.php(548): XF\Mvc\Entity\Entity->set('question', NULL)
#3 src/XF/Service/Poll/Creator.php(71): XF\Mvc\Entity\Entity->__set('question', NULL)
#4 src/addons/Snog/Forms/ControllerPlugin/Poll.php(16): XF\Service\Poll\Creator->setQuestion(NULL)
#5 src/addons/Snog/Forms/Pub/Controller/Form.php(1625): Snog\Forms\ControllerPlugin\Poll->setupPollCreate('thread', Object(ForumApps\API\XF\Entity\Thread), Object(Snog\Forms\Entity\Form), 1)
#6 src/XF.php(478): Snog\Forms\Pub\Controller\Form->Snog\Forms\Pub\Controller\{closure}()
#7 src/addons/Snog/Forms/Pub/Controller/Form.php(1696): XF::asVisitor(Object(ForumApps\API\XF\Entity\User), Object(Closure))
#8 src/addons/Snog/Forms/Pub/Controller/Form.php(1060): Snog\Forms\Pub\Controller\Form->createThread(Array)
#9 src/XF/Mvc/Dispatcher.php(321): Snog\Forms\Pub\Controller\Form->actionSubmit(Object(XF\Mvc\ParameterBag))
#10 src/XF/Mvc/Dispatcher.php(244): XF\Mvc\Dispatcher->dispatchClass('Snog\\Forms:Form', 'Submit', Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#11 src/XF/Mvc/Dispatcher.php(100): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Pub\Controller\Form), NULL)
#12 src/XF/Mvc/Dispatcher.php(50): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#13 src/XF/App.php(2177): XF\Mvc\Dispatcher->run()
#14 src/XF.php(390): XF\App->run()
#15 index.php(20): XF::runApp('XF\\Pub\\App')
#16 {main}
Request state
array(4) {
["url"] => string(31) "/form/hot-deals-submit.2/submit"
["referrer"] => string(48) "https://mysite.com/form/2/select"
["_GET"] => array(1) {
["/form/hot-deals-submit_2/submit"] => string(0) ""
}
["_POST"] => array(7) {
["question"] => array(10) {
[49] => string(2) "24"
[48] => string(4) "test"
[50] => string(1) "2"
[51] => string(34) "https://canadiancorvetteforums.com"
[52] => string(6) "Retail"
[57] => string(1) "1"
[53] => string(5) "22.99"
[54] => string(2) "11"
[55] => string(10) "2019-03-20"
["56_html"] => string(16) "<p>gwgwqgqwg</p>"
}
["attachment_hash"] => string(32) "7b97d77666140fce51e45edd63baf592"
["attachment_hash_combined"] => string(83) "{"type":"post","context":{"node_id":202},"hash":"7b97d77666140fce51e45edd63baf592"}"
["_xfToken"] => string(8) "****"
["_xfRequestUri"] => string(14) "/form/2/select"
["_xfWithData"] => string(1) "1"
["_xfResponseType"] => string(4) "json"
}
}
I can't duplicate this at all. What version of the forms add-on are you using?

The error is implying that you have a poll set up for the form, but there isn't a question for the poll. But that shouldn't be possible because an error would have been thrown when you created the form.

EDIT: Also, the poll creation code can't be called unless there is a question.
 
Last edited:
I can't duplicate this at all. What version of the forms add-on are you using?

The error is implying that you have a poll set up for the form, but there isn't a question for the poll. But that shouldn't be possible because an error would have been thrown when you created the form.

EDIT: Also, the poll creation code can't be called unless there is a question.

Errm.. Nothing changed other than migrating to 2.1.1 and updating php.

Running 2.0.18.



Actually I can't even edit the form in ACP, we have console errors in Chrome/Windows 10.


Seems to be having issues loading jquery on the form page itself.
 
For the benefit of everyone, the above error when submitting a form was caused by either a botched upgrade to PHP 7.3.1 or a bug in PHP 7.3.1. The admin area problems are being caused by another add-on that appears to be adding a pane to the form edit page.
 
Snog updated Advanced Forms for XenForo 2.1+ with a new update entry:

Advanced Forms for XenForo 2.x Update 2.0.19

An update to Advanced Forms for XenForo 2.x has been released. Those that have purchased this add-on, please log into your account on my site to download this update.
  • Fix - Node ID error if user removes thread ID from form button url
  • Fix - All of the above checkboxes not working as expected on some sites
  • Fix - Error submitting form when checkbox is used as conditional trigger
  • Fix - URL BBCode in question causes admin question list display to not show question
  • Fix -...

Read the rest of this update entry...
 

Might be related to earlier issue but browsing through the form tabs produces the below acp errors (on each tab click):

  • ErrorException: Template error: Cannot call method getFlattened on a non-object (NULL)
  • src/XF/Template/Templater.php:970
  • Generated by: Nik
  • Mar 25, 2019 at 3:25 PM
Stack trace
#0 [internal function]: XF\Template\Templater->handleTemplateError(512, 'Cannot call met...', '/home/nginx/dom...', 970, Array)
#1 src/XF/Template/Templater.php(970): trigger_error('Cannot call met...', 512)
#2 internal_data/code_cache/templates/l1/s0/admin/th_helper_criteria_content_qaForums.php(11): XF\Template\Templater->method(NULL, 'getFlattened', Array)
#3 src/XF/Template/Templater.php(1301): XF\Template\Templater->{closure}(Object(ThemeHouse\UIX\XF\Template\Templater), Array)
#4 src/XF/Template/Templater.php(1374): XF\Template\Templater->renderTemplate('th_helper_crite...', Array)
#5 internal_data/code_cache/templates/l1/s0/admin/helper_criteria.php(1211): XF\Template\Templater->includeTemplate('admin:th_helper...', Array)
#6 src/XF/Template/Templater.php(701): XF\Template\Templater->{closure}(Object(ThemeHouse\UIX\XF\Template\Templater), Array, Array)
#7 src/XF/Template/Templater.php(779): XF\Template\Templater->callMacro('helper_criteria', 'Snog_user_page', Array, Array)
#8 src/addons/Snog/Forms/Admin/Controller/Forms.php(448): XF\Template\Templater->renderMacro('admin:helper_cr...', 'Snog_user_page', Array)
#9 src/addons/Snog/Forms/Admin/Controller/Forms.php(37): Snog\Forms\Admin\Controller\Forms->buildPermissionDisplay(Object(Snog\Forms\Entity\Form))
#10 src/addons/Snog/Forms/Admin/Controller/Forms.php(84): Snog\Forms\Admin\Controller\Forms->formAddEdit(Object(Snog\Forms\Entity\Form))
#11 src/XF/Mvc/Dispatcher.php(321): Snog\Forms\Admin\Controller\Forms->actionEdit(Object(XF\Mvc\ParameterBag))
#12 src/XF/Mvc/Dispatcher.php(244): XF\Mvc\Dispatcher->dispatchClass('Snog\\Forms:Form...', 'Edit', Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Admin\Controller\Forms), NULL)
#13 src/XF/Mvc/Dispatcher.php(100): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Admin\Controller\Forms), NULL)
#14 src/XF/Mvc/Dispatcher.php(50): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#15 src/XF/App.php(2177): XF\Mvc\Dispatcher->run()
#16 src/XF.php(390): XF\App->run()
#17 admin.php(13): XF::runApp('XF\\Admin\\App')
#18 {main}
Request state
array(4) {
["url"] => string(28) "/admin.php?form-forms/3/edit"
["referrer"] => string(56) "https://mysite.com/admin.php?form-forms/"
["_GET"] => array(1) {
["form-forms/3/edit"] => string(0) ""
}
["_POST"] => array(0) {
}
}
 
Might be related to earlier issue but browsing through the form tabs produces the below acp errors (on each tab click):

  • ErrorException: Template error: Cannot call method getFlattened on a non-object (NULL)
  • src/XF/Template/Templater.php:970
  • Generated by: Nik
  • Mar 25, 2019 at 3:25 PM
Stack trace
#0 [internal function]: XF\Template\Templater->handleTemplateError(512, 'Cannot call met...', '/home/nginx/dom...', 970, Array)
#1 src/XF/Template/Templater.php(970): trigger_error('Cannot call met...', 512)
#2 internal_data/code_cache/templates/l1/s0/admin/th_helper_criteria_content_qaForums.php(11): XF\Template\Templater->method(NULL, 'getFlattened', Array)
#3 src/XF/Template/Templater.php(1301): XF\Template\Templater->{closure}(Object(ThemeHouse\UIX\XF\Template\Templater), Array)
#4 src/XF/Template/Templater.php(1374): XF\Template\Templater->renderTemplate('th_helper_crite...', Array)
#5 internal_data/code_cache/templates/l1/s0/admin/helper_criteria.php(1211): XF\Template\Templater->includeTemplate('admin:th_helper...', Array)
#6 src/XF/Template/Templater.php(701): XF\Template\Templater->{closure}(Object(ThemeHouse\UIX\XF\Template\Templater), Array, Array)
#7 src/XF/Template/Templater.php(779): XF\Template\Templater->callMacro('helper_criteria', 'Snog_user_page', Array, Array)
#8 src/addons/Snog/Forms/Admin/Controller/Forms.php(448): XF\Template\Templater->renderMacro('admin:helper_cr...', 'Snog_user_page', Array)
#9 src/addons/Snog/Forms/Admin/Controller/Forms.php(37): Snog\Forms\Admin\Controller\Forms->buildPermissionDisplay(Object(Snog\Forms\Entity\Form))
#10 src/addons/Snog/Forms/Admin/Controller/Forms.php(84): Snog\Forms\Admin\Controller\Forms->formAddEdit(Object(Snog\Forms\Entity\Form))
#11 src/XF/Mvc/Dispatcher.php(321): Snog\Forms\Admin\Controller\Forms->actionEdit(Object(XF\Mvc\ParameterBag))
#12 src/XF/Mvc/Dispatcher.php(244): XF\Mvc\Dispatcher->dispatchClass('Snog\\Forms:Form...', 'Edit', Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Admin\Controller\Forms), NULL)
#13 src/XF/Mvc/Dispatcher.php(100): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Snog\Forms\Admin\Controller\Forms), NULL)
#14 src/XF/Mvc/Dispatcher.php(50): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#15 src/XF/App.php(2177): XF\Mvc\Dispatcher->run()
#16 src/XF.php(390): XF\App->run()
#17 admin.php(13): XF::runApp('XF\\Admin\\App')
#18 {main}
Request state
array(4) {
["url"] => string(28) "/admin.php?form-forms/3/edit"
["referrer"] => string(56) "https://mysite.com/admin.php?form-forms/"
["_GET"] => array(1) {
["form-forms/3/edit"] => string(0) ""
}
["_POST"] => array(0) {
}
}
To fix this error @ThemeHouse needs to create a new code event listener in their add-on for the templater_macro_pre_render event:

callback.webp
 
Hi @Snog,

Just wondering if these forms can be used as custom user fields. For example, can I have a page to display the form, where the user fills it out, but can come back to it later a change the form information?

As an example, the form can have something like "My top 5 films" and the user inputs their 5 films they like. Later on, can they go back to the form (which has retained the information) and change their list whilst still being able to see what was previously set? Basically so it functions like a settings page so to speak.

Thanks.
 
Hi @Snog,

Just wondering if these forms can be used as custom user fields. For example, can I have a page to display the form, where the user fills it out, but can come back to it later a change the form information?

As an example, the form can have something like "My top 5 films" and the user inputs their 5 films they like. Later on, can they go back to the form (which has retained the information) and change their list whilst still being able to see what was previously set? Basically so it functions like a settings page so to speak.

Thanks.
No it can't. Form information is not retained after it's filled out. It's posted in a thread, a conversation or emailed.
 
No it can't. Form information is not retained after it's filled out. It's posted in a thread, a conversation or emailed.
Ah no problem. Thanks a lot for getting back to me.

Do you know of an addon that can do that? Extend custom user fields or something similar?

Thanks.
 
Ah no problem. Thanks a lot for getting back to me.

Do you know of an addon that can do that? Extend custom user fields or something similar?

Thanks.
Sorry, no I don't.

But why not just create a regular custom user field for what you want and make it user editable? Then they can edit it from their account details page.
 
Thanks, I'll tag @Jake B. And @Dalton Prock with a happy Monday chant. Logged in the TH GitHub issue tracker.
FYI, it's not a conflict per se. It's something that needs to be done to allow their add-on to display it's information properly in my add-on. The error is coming from their add-on, not mine. ;)
Code:
#2 internal_data/code_cache/templates/l1/s0/admin/th_helper_criteria_content_qaForums.php(11): XF\Template\Templater->method(NULL, 'getFlattened', Array)

And is related to my suggestion for XenForo itself:
 
FYI, it's not a conflict per se. It's something that needs to be done to allow their add-on to display it's information properly in my add-on. The error is coming from their add-on, not mine. ;)
Code:
#2 internal_data/code_cache/templates/l1/s0/admin/th_helper_criteria_content_qaForums.php(11): XF\Template\Templater->method(NULL, 'getFlattened', Array)

And is related to my suggestion for XenForo itself:

When two addons don't get along holding hands it's a conflict in my books irrespective of who's generating the errors. :)
 
Top Bottom