User Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
en:devel:add_special_block [2019/03/13 18:14]
joebordes [Developer Blocks]
en:devel:add_special_block [2019/11/10 17:20] (current)
joebordes [Show IFRAME]
Line 3: Line 3:
 The goal of this tutorial is to show how we could add a new block in the detail view of a module where we could add some special functionality that we may need. The goal of this tutorial is to show how we could add a new block in the detail view of a module where we could add some special functionality that we may need.
  
-This is basically a two step process; first we have to add the information into the database so the application knows that it has to load a new block and what code it has to launch to fill it in, then we have to implement that class to generate the output.+This is basically a two-step process; firstwe have to add the information into the database so the application knows that it has to load a new block and what code it has to launch to fill it in, then we have to implement that class to generate the output.
  
-For this tutorial I am simply going to sum the number of Purchase Orders related to a contact and show that in a block on the contacts detail view.+For this tutorialI am simply going to sum the number of Purchase Orders related to a contact and show that in a block on the contacts detail view.
  
 To change the database we use vtlib and add a DetailViewWidget Link using vtlib: To change the database we use vtlib and add a DetailViewWidget Link using vtlib:
Line 48: Line 48:
 The initial idea is the same as above, you need a class that you reference in the DETAILVIEWWIDGET,​ this class returns another class that must implement a //​process()//​ method. What we do is that this second class extends the [[https://​github.com/​tsolucio/​corebos/​blob/​master/​modules/​Vtiger/​DeveloperWidget.php#​L17|class DeveloperBlock]] which gives you a set of predefined functions to help you concentrate only on the actual logic of your requirement. The initial idea is the same as above, you need a class that you reference in the DETAILVIEWWIDGET,​ this class returns another class that must implement a //​process()//​ method. What we do is that this second class extends the [[https://​github.com/​tsolucio/​corebos/​blob/​master/​modules/​Vtiger/​DeveloperWidget.php#​L17|class DeveloperBlock]] which gives you a set of predefined functions to help you concentrate only on the actual logic of your requirement.
  
-Additionally,​ we have modified the DEAILVIEWWIDGET code to permit you to send more parameters into your class.+Additionally,​ we have modified the DEAILVIEWWIDGET code to permit you to send more parameters into your class which is done using the URL parameter syntax. 
 + 
 +<WRAP center round info 60%> 
 +[[http://​blog.corebos.org/​blog/​developerblock|You can find a blog post]] with a step by step example and {{ :​en:​devel:​asktoproceeddevblock.zip |download the related code clicking here.}} 
 +</​WRAP>​ 
  
 The coreBOS Question analytical module has [[https://​github.com/​tsolucio/​corebos/​blob/​master/​modules/​cbQuestion/​cbQuestionWidget.php|an example of the usage of the Developer Block]] which makes it easy to get the execution of the question into a block. Try these steps to see the result: The coreBOS Question analytical module has [[https://​github.com/​tsolucio/​corebos/​blob/​master/​modules/​cbQuestion/​cbQuestionWidget.php|an example of the usage of the Developer Block]] which makes it easy to get the execution of the question into a block. Try these steps to see the result:
  
-  ​Unordered List Item+==== Create a Business Question ==== 
 + 
 +Like this: 
 + 
 +{{ :​en:​adminmanual:​bquestion01.png |Business Question}} 
 + 
 +|Columns:​|<​code>​[{"​fieldname":"​countres","​operation":"​is","​value":"​count(ticket_title)","​valuetype":"​expression","​joincondition":"​and","​groupid":"​0"​},​{"​fieldname":"​ticketstatus","​operation":"​is","​value":"​ticketstatus","​valuetype":"​fieldname","​joincondition":"​and","​groupid":"​0"​}]</​code>​| 
 +|Condition:​|<​code>​[{"​fieldname":"​$(parent_id : (Accounts) account_no) ","​operation":"​is","​value":"​$account_no$","​valuetype":"​raw","​joincondition":"​and","​groupid":"​0"​}]</​code>​| 
 +|Type properties:​|<​code>​{"​key_label":"​ticketstatus","​key_value":"​countres"​}</​code>​| 
 + 
 +==== Create a Business Action ==== 
 + 
 +This one will appear in the body of the detail view. 
 + 
 +|Type:​|DETAILVIEWWIDGET| 
 +|Action:​|<​code>​block://​bqanswer:​modules/​cbQuestion/​cbQuestionWidget.php:​QID=43177&​RECORDID=$RECORD$</​code>​| 
 +|Module:​|Accounts| 
 + 
 +==== Create another Business Action ==== 
 + 
 +This one will appear in the right panel. 
 + 
 +|Type:​|DETAILVIEWWIDGET| 
 +|Action:​|module=cbQuestion&​action=cbQuestionAjax&​file=cbQuestionWidget&​QID=43177&​RECORDID=$RECORD$| 
 +|Module:​|Accounts| 
 + 
 +<WRAP center round important 60%> 
 +NOTE that the QID value is actually the CRMID of the Business Question you created in the first step, so you MUST change the **43177** above to the one assigned to your record 
 +</​WRAP>​ 
 + 
 +==== Appearence ==== 
 + 
 +Now go to any account with tickets and you should see something like this: 
 + 
 +{{ :​en:​adminmanual:​bquestion02.png |}} 
 + 
 +==== Another example: Show Message ==== 
 + 
 +The application has another native developer block that permits you to show a message. Watch the next video to see how that works and learn a little more about how this development resource works. 
 + 
 +{{youtube>​aAs2FVJ0veE}} 
 + 
 +==== Another example: Mass Upload Documents ==== 
 + 
 +The application has another native developer block that permits you to mass upload documents. Watch the next video to see how that works and [[https://​github.com/​tsolucio/​corebos/​commit/​889884362b82ff24a8c1b5499f22e7705e55d519|look at the commit to see the code]]. 
 + 
 +{{youtube>​lW3RrQQQb-4}} 
 + 
 +==== Show IFRAME ==== 
 + 
 +You can show an IFRAME in a block with the **showHTMLBlock**,​ something like this: 
 + 
 +<​code>​ 
 +block://​showHTMLBlock:​modules/​Utilities/​showHTMLBlock.php:​op=iframe&​height=400px&​ex=http%3A%2F%2Fcorebos.org%3Fifcrmid%3D%24RECORD%24%26ifmodule%3D%24MODULE%24 
 +</​code>​ 
 + 
 +where you are passing to the Develop Block these parameters:​ 
 + 
 +  * **op** ​ =iframe (there are curently no other options) 
 +  * **height** string of iframe height, optional 
 +  * **ex** URL Encoded string with the URL to load in iframe. you can use the meta variables 
 +    * $RECORD$ which will be changed to CRMID of the current record if it exists 
 +    * $MODULE$ which will be changed to the MODULE NAME 
 + 
 +==== Developer Block Template ==== 
 + 
 +This is the starting point of any developer block (the boilerplate). 
 + 
 +<code PHP> 
 +<?php 
 +/​************************************************************************************************* 
 +** PUT YOUR LICENSE HERE ** 
 + ​*************************************************************************************************/​ 
 +require_once '​modules/​Vtiger/​DeveloperWidget.php';​ 
 +global $currentModule;​ 
 + 
 +class YOURWIDGETNAMEHERE { 
 + // Get class name of the object that will implement the widget functionality 
 + public static function getWidget($name) { 
 + return (new YOURWIDGETNAMEHERE_DetailViewBlock());​ 
 +
 +
 + 
 +class YOURWIDGETNAMEHERE_DetailViewBlock extends DeveloperBlock { 
 + // Implement widget functionality 
 + private $widgetName = '​YOURWIDGETNAMEHERE';​ 
 + 
 + // This one is called to get the contents to show on screen 
 + public function process($context = false) { 
 + global $adb; 
 + $this->​context = $context; 
 + $smarty = $this->​getViewer();​ 
 + ************* 
 + ALL YOU LOGIC GOES HERE 
 + ************* 
 + return THE_HTML_YOU_WANT_TO_SHOW_INSIDE_THE_BLOCK;​ 
 +
 +
 + 
 +if (isset($_REQUEST['​action'​]) && $_REQUEST['​action'​]==$currentModule.'​Ajax'​) { 
 + $smq = new YOURWIDGETNAMEHERE_DetailViewBlock();​ 
 + echo $smq->​process($_REQUEST);​ 
 +
 +</​code>​ 
 + 
 ======How to add a special block to a module using templates====== ======How to add a special block to a module using templates======