dolibarr  19.0.0-dev
myobject_card.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) ---Put here your own copyright and developer email---
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <https://www.gnu.org/licenses/>.
17  */
18 
25 //if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
26 //if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
27 //if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
28 //if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
29 //if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
30 //if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
31 //if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
32 //if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
33 //if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
34 //if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
35 //if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
36 //if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
37 //if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
38 //if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
39 //if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
40 //if (! defined("MAIN_SECURITY_FORCECSP")) define('MAIN_SECURITY_FORCECSP', 'none'); // Disable all Content Security Policies
41 //if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
42 //if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
43 //if (! defined('NOSESSION')) define('NOSESSION', '1'); // Disable session
44 
45 // Load Dolibarr environment
46 $res = 0;
47 // Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
48 if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
49  $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
50 }
51 // Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
52 $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
53 while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
54  $i--; $j--;
55 }
56 if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
57  $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
58 }
59 if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
60  $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
61 }
62 // Try main.inc.php using relative path
63 if (!$res && file_exists("../main.inc.php")) {
64  $res = @include "../main.inc.php";
65 }
66 if (!$res && file_exists("../../main.inc.php")) {
67  $res = @include "../../main.inc.php";
68 }
69 if (!$res && file_exists("../../../main.inc.php")) {
70  $res = @include "../../../main.inc.php";
71 }
72 if (!$res) {
73  die("Include of main fails");
74 }
75 
76 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
77 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
78 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
79 dol_include_once('/mymodule/class/myobject.class.php');
80 dol_include_once('/mymodule/lib/mymodule_myobject.lib.php');
81 
82 // Load translation files required by the page
83 $langs->loadLangs(array("mymodule@mymodule", "other"));
84 
85 // Get parameters
86 $id = GETPOST('id', 'int');
87 $ref = GETPOST('ref', 'alpha');
88 $lineid = GETPOST('lineid', 'int');
89 
90 $action = GETPOST('action', 'aZ09');
91 $confirm = GETPOST('confirm', 'alpha');
92 $cancel = GETPOST('cancel', 'aZ09');
93 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
94 $backtopage = GETPOST('backtopage', 'alpha'); // if not set, a default page will be used
95 $backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); // if not set, $backtopage will be used
96 $backtopagejsfields = GETPOST('backtopagejsfields', 'alpha');
97 $dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09');
98 
99 if (!empty($backtopagejsfields)) {
100  $tmpbacktopagejsfields = explode(':', $backtopagejsfields);
101  $dol_openinpopup = $tmpbacktopagejsfields[0];
102 }
103 
104 // Initialize technical objects
105 $object = new MyObject($db);
106 $extrafields = new ExtraFields($db);
107 $diroutputmassaction = $conf->mymodule->dir_output.'/temp/massgeneration/'.$user->id;
108 $hookmanager->initHooks(array($object->element.'card', 'globalcard')); // Note that conf->hooks_modules contains array
109 
110 // Fetch optionals attributes and labels
111 $extrafields->fetch_name_optionals_label($object->table_element);
112 
113 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
114 
115 // Initialize array of search criterias
116 $search_all = GETPOST("search_all", 'alpha');
117 $search = array();
118 foreach ($object->fields as $key => $val) {
119  if (GETPOST('search_'.$key, 'alpha')) {
120  $search[$key] = GETPOST('search_'.$key, 'alpha');
121  }
122 }
123 
124 if (empty($action) && empty($id) && empty($ref)) {
125  $action = 'view';
126 }
127 
128 // Load object
129 include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
130 
131 // There is several ways to check permission.
132 // Set $enablepermissioncheck to 1 to enable a minimum low level of checks
133 $enablepermissioncheck = 0;
134 if ($enablepermissioncheck) {
135  $permissiontoread = $user->hasRight('mymodule', 'myobject', 'read');
136  $permissiontoadd = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
137  $permissiontodelete = $user->hasRight('mymodule', 'myobject', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
138  $permissionnote = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_setnotes.inc.php
139  $permissiondellink = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_dellink.inc.php
140 } else {
141  $permissiontoread = 1;
142  $permissiontoadd = 1; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
143  $permissiontodelete = 1;
144  $permissionnote = 1;
145  $permissiondellink = 1;
146 }
147 
148 $upload_dir = $conf->mymodule->multidir_output[isset($object->entity) ? $object->entity : 1].'/myobject';
149 
150 // Security check (enable the most restrictive one)
151 //if ($user->socid > 0) accessforbidden();
152 //if ($user->socid > 0) $socid = $user->socid;
153 //$isdraft = (isset($object->status) && ($object->status == $object::STATUS_DRAFT) ? 1 : 0);
154 //restrictedArea($user, $object->module, $object, $object->table_element, $object->element, 'fk_soc', 'rowid', $isdraft);
155 if (!isModEnabled("mymodule")) {
156  accessforbidden();
157 }
158 if (!$permissiontoread) {
159  accessforbidden();
160 }
161 
162 
163 /*
164  * Actions
165  */
166 
167 $parameters = array();
168 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
169 if ($reshook < 0) {
170  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
171 }
172 
173 if (empty($reshook)) {
174  $error = 0;
175 
176  $backurlforlist = dol_buildpath('/mymodule/myobject_list.php', 1);
177 
178  if (empty($backtopage) || ($cancel && empty($id))) {
179  if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
180  if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
181  $backtopage = $backurlforlist;
182  } else {
183  $backtopage = dol_buildpath('/mymodule/myobject_card.php', 1).'?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
184  }
185  }
186  }
187 
188  $triggermodname = 'MYMODULE_MYOBJECT_MODIFY'; // Name of trigger action code to execute when we modify record
189 
190  // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
191  include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
192 
193  // Actions when linking object each other
194  include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
195 
196  // Actions when printing a doc from card
197  include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
198 
199  // Action to move up and down lines of object
200  //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php';
201 
202  // Action to build doc
203  include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
204 
205  if ($action == 'set_thirdparty' && $permissiontoadd) {
206  $object->setValueFrom('fk_soc', GETPOST('fk_soc', 'int'), '', '', 'date', '', $user, $triggermodname);
207  }
208  if ($action == 'classin' && $permissiontoadd) {
209  $object->setProject(GETPOST('projectid', 'int'));
210  }
211 
212  // Actions to send emails
213  $triggersendname = 'MYMODULE_MYOBJECT_SENTBYMAIL';
214  $autocopy = 'MAIN_MAIL_AUTOCOPY_MYOBJECT_TO';
215  $trackid = 'myobject'.$object->id;
216  include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
217 }
218 
219 
220 
221 
222 /*
223  * View
224  */
225 
226 $form = new Form($db);
227 $formfile = new FormFile($db);
228 $formproject = new FormProjets($db);
229 
230 $title = $langs->trans("MyObject")." - ".$langs->trans('Card');
231 //$title = $object->ref." - ".$langs->trans('Card');
232 if ($action == 'create') {
233  $title = $langs->trans("NewObject");
234 }
235 $help_url = '';
236 
237 llxHeader('', $title, $help_url);
238 
239 // Example : Adding jquery code
240 // print '<script type="text/javascript">
241 // jQuery(document).ready(function() {
242 // function init_myfunc()
243 // {
244 // jQuery("#myid").removeAttr(\'disabled\');
245 // jQuery("#myid").attr(\'disabled\',\'disabled\');
246 // }
247 // init_myfunc();
248 // jQuery("#mybutton").click(function() {
249 // init_myfunc();
250 // });
251 // });
252 // </script>';
253 
254 
255 // Part to create
256 if ($action == 'create') {
257  if (empty($permissiontoadd)) {
258  accessforbidden('NotEnoughPermissions', 0, 1);
259  }
260 
261  print load_fiche_titre($langs->trans("NewObject", $langs->transnoentitiesnoconv("MyObject")), '', 'object_'.$object->picto);
262 
263  print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
264  print '<input type="hidden" name="token" value="'.newToken().'">';
265  print '<input type="hidden" name="action" value="add">';
266  if ($backtopage) {
267  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
268  }
269  if ($backtopageforcancel) {
270  print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
271  }
272  if ($backtopagejsfields) {
273  print '<input type="hidden" name="backtopagejsfields" value="'.$backtopagejsfields.'">';
274  }
275  if ($dol_openinpopup) {
276  print '<input type="hidden" name="dol_openinpopup" value="'.$dol_openinpopup.'">';
277  }
278 
279  print dol_get_fiche_head(array(), '');
280 
281  // Set some default values
282  //if (! GETPOSTISSET('fieldname')) $_POST['fieldname'] = 'myvalue';
283 
284  print '<table class="border centpercent tableforfieldcreate">'."\n";
285 
286  // Common attributes
287  include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
288 
289  // Other attributes
290  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
291 
292  print '</table>'."\n";
293 
294  print dol_get_fiche_end();
295 
296  print $form->buttonsSaveCancel("Create");
297 
298  print '</form>';
299 
300  //dol_set_focus('input[name="ref"]');
301 }
302 
303 // Part to edit record
304 if (($id || $ref) && $action == 'edit') {
305  print load_fiche_titre($langs->trans("MyObject"), '', 'object_'.$object->picto);
306 
307  print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
308  print '<input type="hidden" name="token" value="'.newToken().'">';
309  print '<input type="hidden" name="action" value="update">';
310  print '<input type="hidden" name="id" value="'.$object->id.'">';
311  if ($backtopage) {
312  print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
313  }
314  if ($backtopageforcancel) {
315  print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
316  }
317 
318  print dol_get_fiche_head();
319 
320  print '<table class="border centpercent tableforfieldedit">'."\n";
321 
322  // Common attributes
323  include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
324 
325  // Other attributes
326  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
327 
328  print '</table>';
329 
330  print dol_get_fiche_end();
331 
332  print $form->buttonsSaveCancel();
333 
334  print '</form>';
335 }
336 
337 // Part to show record
338 if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
339  $head = myobjectPrepareHead($object);
340 
341  print dol_get_fiche_head($head, 'card', $langs->trans("MyObject"), -1, $object->picto, 0, '', '', 0, '', 1);
342 
343  $formconfirm = '';
344 
345  // Confirmation to delete
346  if ($action == 'delete') {
347  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteMyObject'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 1);
348  }
349  // Confirmation to delete line
350  if ($action == 'deleteline') {
351  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
352  }
353 
354  // Clone confirmation
355  if ($action == 'clone') {
356  // Create an array for form
357  $formquestion = array();
358  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
359  }
360 
361  // Confirmation of action xxxx (You can use it for xxx = 'close', xxx = 'reopen', ...)
362  if ($action == 'xxx') {
363  $text = $langs->trans('ConfirmActionMyObject', $object->ref);
364  /*if (isModEnabled('notification'))
365  {
366  require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
367  $notify = new Notify($db);
368  $text .= '<br>';
369  $text .= $notify->confirmMessage('MYOBJECT_CLOSE', $object->socid, $object);
370  }*/
371 
372  $formquestion = array();
373 
374  /*
375  $forcecombo=0;
376  if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
377  $formquestion = array(
378  // 'text' => $langs->trans("ConfirmClone"),
379  // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
380  // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
381  // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
382  );
383  */
384  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220);
385  }
386 
387  // Call Hook formConfirm
388  $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
389  $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
390  if (empty($reshook)) {
391  $formconfirm .= $hookmanager->resPrint;
392  } elseif ($reshook > 0) {
393  $formconfirm = $hookmanager->resPrint;
394  }
395 
396  // Print form confirm
397  print $formconfirm;
398 
399 
400  // Object card
401  // ------------------------------------------------------------
402  $linkback = '<a href="'.dol_buildpath('/mymodule/myobject_list.php', 1).'?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
403 
404  $morehtmlref = '<div class="refidno">';
405  /*
406  // Ref customer
407  $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string', '', 0, 1);
408  $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ? ':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE : ''), '', null, null, '', 1);
409  // Thirdparty
410  $morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1, 'customer');
411  if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
412  $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/commande/list.php?socid='.$object->thirdparty->id.'&search_societe='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
413  }
414  // Project
415  if (isModEnabled('project')) {
416  $langs->load("projects");
417  $morehtmlref .= '<br>';
418  if ($permissiontoadd) {
419  $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
420  if ($action != 'classify') {
421  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
422  }
423  $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
424  } else {
425  if (!empty($object->fk_project)) {
426  $proj = new Project($db);
427  $proj->fetch($object->fk_project);
428  $morehtmlref .= $proj->getNomUrl(1);
429  if ($proj->title) {
430  $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
431  }
432  }
433  }
434  }
435  */
436  $morehtmlref .= '</div>';
437 
438 
439  dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
440 
441 
442  print '<div class="fichecenter">';
443  print '<div class="fichehalfleft">';
444  print '<div class="underbanner clearboth"></div>';
445  print '<table class="border centpercent tableforfield">'."\n";
446 
447  // Common attributes
448  //$keyforbreak='fieldkeytoswitchonsecondcolumn'; // We change column just before this field
449  //unset($object->fields['fk_project']); // Hide field already shown in banner
450  //unset($object->fields['fk_soc']); // Hide field already shown in banner
451  include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
452 
453  // Other attributes. Fields from hook formObjectOptions and Extrafields.
454  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
455 
456  print '</table>';
457  print '</div>';
458  print '</div>';
459 
460  print '<div class="clearboth"></div>';
461 
462  print dol_get_fiche_end();
463 
464 
465  /*
466  * Lines
467  */
468 
469  if (!empty($object->table_element_line)) {
470  // Show object lines
471  $result = $object->getLinesArray();
472 
473  print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
474  <input type="hidden" name="token" value="' . newToken().'">
475  <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
476  <input type="hidden" name="mode" value="">
477  <input type="hidden" name="page_y" value="">
478  <input type="hidden" name="id" value="' . $object->id.'">
479  ';
480 
481  if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
482  include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
483  }
484 
485  print '<div class="div-table-responsive-no-min">';
486  if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
487  print '<table id="tablelines" class="noborder noshadow" width="100%">';
488  }
489 
490  if (!empty($object->lines)) {
491  $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1);
492  }
493 
494  // Form to add new line
495  if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') {
496  if ($action != 'editline') {
497  // Add products/services form
498 
499  $parameters = array();
500  $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
501  if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
502  if (empty($reshook))
503  $object->formAddObjectLine(1, $mysoc, $soc);
504  }
505  }
506 
507  if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
508  print '</table>';
509  }
510  print '</div>';
511 
512  print "</form>\n";
513  }
514 
515 
516  // Buttons for actions
517 
518  if ($action != 'presend' && $action != 'editline') {
519  print '<div class="tabsAction">'."\n";
520  $parameters = array();
521  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
522  if ($reshook < 0) {
523  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
524  }
525 
526  if (empty($reshook)) {
527  // Send
528  if (empty($user->socid)) {
529  print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&token='.newToken().'&mode=init#formmailbeforetitle');
530  }
531 
532  // Back to draft
533  if ($object->status == $object::STATUS_VALIDATED) {
534  print dolGetButtonAction('', $langs->trans('SetToDraft'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_setdraft&confirm=yes&token='.newToken(), '', $permissiontoadd);
535  }
536 
537  print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken(), '', $permissiontoadd);
538 
539  // Validate
540  if ($object->status == $object::STATUS_DRAFT) {
541  if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
542  print dolGetButtonAction('', $langs->trans('Validate'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=confirm_validate&confirm=yes&token='.newToken(), '', $permissiontoadd);
543  } else {
544  $langs->load("errors");
545  print dolGetButtonAction($langs->trans("ErrorAddAtLeastOneLineFirst"), $langs->trans("Validate"), 'default', '#', '', 0);
546  }
547  }
548 
549  // Clone
550  if ($permissiontoadd) {
551  print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid)?'&socid='.$object->socid:'').'&action=clone&token='.newToken(), '', $permissiontoadd);
552  }
553 
554  /*
555  if ($permissiontoadd) {
556  if ($object->status == $object::STATUS_ENABLED) {
557  print dolGetButtonAction('', $langs->trans('Disable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=disable&token='.newToken(), '', $permissiontoadd);
558  } else {
559  print dolGetButtonAction('', $langs->trans('Enable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken(), '', $permissiontoadd);
560  }
561  }
562  if ($permissiontoadd) {
563  if ($object->status == $object::STATUS_VALIDATED) {
564  print dolGetButtonAction('', $langs->trans('Cancel'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=close&token='.newToken(), '', $permissiontoadd);
565  } else {
566  print dolGetButtonAction('', $langs->trans('Re-Open'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=reopen&token='.newToken(), '', $permissiontoadd);
567  }
568  }
569  */
570 
571  // Delete
572  $params = array();
573  print dolGetButtonAction('', $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete, $params);
574  }
575  print '</div>'."\n";
576  }
577 
578 
579  // Select mail models is same action as presend
580  if (GETPOST('modelselected')) {
581  $action = 'presend';
582  }
583 
584  if ($action != 'presend') {
585  print '<div class="fichecenter"><div class="fichehalfleft">';
586  print '<a name="builddoc"></a>'; // ancre
587 
588  $includedocgeneration = 0;
589 
590  // Documents
591  if ($includedocgeneration) {
592  $objref = dol_sanitizeFileName($object->ref);
593  $relativepath = $objref.'/'.$objref.'.pdf';
594  $filedir = $conf->mymodule->dir_output.'/'.$object->element.'/'.$objref;
595  $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
596  $genallowed = $permissiontoread; // If you can read, you can build the PDF to read content
597  $delallowed = $permissiontoadd; // If you can create/edit, you can remove a file on card
598  print $formfile->showdocuments('mymodule:MyObject', $object->element.'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
599  }
600 
601  // Show links to link elements
602  $linktoelem = $form->showLinkToObjectBlock($object, null, array('myobject'));
603  $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
604 
605 
606  print '</div><div class="fichehalfright">';
607 
608  $MAXEVENT = 10;
609 
610  $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dol_buildpath('/mymodule/myobject_agenda.php', 1).'?id='.$object->id);
611 
612  // List of actions on element
613  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
614  $formactions = new FormActions($db);
615  $somethingshown = $formactions->showactions($object, $object->element.'@'.$object->module, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter);
616 
617  print '</div></div>';
618  }
619 
620  //Select mail models is same action as presend
621  if (GETPOST('modelselected')) {
622  $action = 'presend';
623  }
624 
625  // Presend form
626  $modelmail = 'myobject';
627  $defaulttopic = 'InformationMessage';
628  $diroutput = $conf->mymodule->dir_output;
629  $trackid = 'myobject'.$object->id;
630 
631  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
632 }
633 
634 // End of page
635 llxFooter();
636 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class for MyObject.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
isModEnabled($module)
Is Dolibarr module enabled.
$formconfirm
if ($action == 'delbookkeepingyear') {
myobjectPrepareHead($object)
Prepare array of tabs for MyObject.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.