PageRenderTime 69ms CodeModel.GetById 32ms RepoModel.GetById 2ms app.codeStats 0ms

/application/controllers/ContactsController.class.php

https://gitlab.com/x33n/ProjectPier-Core
PHP | 738 lines | 524 code | 133 blank | 81 comment | 115 complexity | 40b75eb9cc73c1ccb16409b2a9e2e325 MD5 | raw file
  1. <?php
  2. /**
  3. * Contacts controller
  4. *
  5. * @version 1.0
  6. * @http://www.projectpier.org/
  7. */
  8. class ContactsController extends ApplicationController {
  9. /**
  10. * Construct the ContactsController
  11. *
  12. * @access public
  13. * @param void
  14. * @return ContactController
  15. */
  16. function __construct() {
  17. parent::__construct();
  18. prepare_company_website_controller($this, 'administration');
  19. } // __construct
  20. /**
  21. * Contact management index
  22. *
  23. * @access public
  24. * @param void
  25. * @return null
  26. */
  27. function index() {
  28. } // index
  29. /**
  30. * Add contact
  31. *
  32. * @access public
  33. * @param void
  34. * @return null
  35. */
  36. function add() {
  37. $this->setTemplate('add_contact');
  38. $company_id = get_id('company_id', null, 0);
  39. $company = Companies::findById($company_id);
  40. if (!Contact::canAdd(logged_user(), $company)) {
  41. flash_error(lang('no access permissions'));
  42. $this->redirectToReferer(get_url('dashboard', 'index'));
  43. } // if
  44. $contact = new Contact();
  45. $im_types = ImTypes::findAll(array('order' => '`id`'));
  46. $contact_data = array_var($_POST, 'contact');
  47. if (!is_array($contact_data)) {
  48. $contact_data = array(
  49. 'company_id' => $company_id,
  50. ); // array
  51. } // if
  52. $user_data = array_var($contact_data, 'user');
  53. if (!is_array($user_data)) {
  54. $user_data = array(
  55. 'password_generator' => 'random'
  56. ); // array
  57. } // if
  58. tpl_assign('contact', $contact);
  59. tpl_assign('company', $company);
  60. tpl_assign('contact_data', $contact_data);
  61. tpl_assign('user_data', $user_data);
  62. tpl_assign('im_types', $im_types);
  63. $avatar = array_var($_FILES, 'new_avatar');
  64. if (is_array($avatar) && isset($avatar['size']) && $avatar['size'] != 0) {
  65. try {
  66. if (!isset($avatar['name']) || !isset($avatar['type']) || !isset($avatar['size']) || !isset($avatar['tmp_name']) || !is_readable($avatar['tmp_name'])) {
  67. throw new InvalidUploadError($avatar, lang('error upload file'));
  68. } // if
  69. $valid_types = array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
  70. $max_width = config_option('max_avatar_width', 50);
  71. $max_height = config_option('max_avatar_height', 50);
  72. if ($avatar['size']) {
  73. if (!in_array($avatar['type'], $valid_types) || !($image = getimagesize($avatar['tmp_name']))) {
  74. throw new InvalidUploadError($avatar, lang('invalid upload type', 'JPG, GIF, PNG'));
  75. } elseif (!$contact->setAvatar($avatar['tmp_name'], $max_width, $max_height, false)) {
  76. throw new Error($avatar, lang('error edit avatar'));
  77. $contact->setAvatarFile('');
  78. } // if
  79. } // if
  80. } catch (Exception $e) {
  81. flash_error($e->getMessage());
  82. }
  83. } else {
  84. $contact->setAvatarFile('');
  85. } // if
  86. if (is_array(array_var($_POST, 'contact'))) {
  87. $contact->setFromAttributes($contact_data);
  88. try {
  89. // Company info
  90. if ($_POST['contact']['company']['what'] == 'existing') {
  91. $company_id = $_POST['contact']['company_id'];
  92. } else {
  93. $company = new Company();
  94. $company->setName($_POST['contact']['company']['name']);
  95. $company->setTimezone($_POST['contact']['company']['timezone']);
  96. $company->setClientOfId(owner_company()->getId());
  97. $company->save();
  98. $company_id = $company->getId();
  99. } // if
  100. $contact->setCompanyId($company_id);
  101. $contact->setUserId(0);
  102. $contact->save();
  103. if (plugin_active('tags')) {
  104. $contact->setTagsFromCSV(array_var($contact_data, 'tags'));
  105. }
  106. $contact->clearImValues();
  107. foreach ($im_types as $im_type) {
  108. $value = trim(array_var($contact_data, 'im_' . $im_type->getId()));
  109. if ($value <> '') {
  110. $contact_im_value = new ContactImValue();
  111. $contact_im_value->setContactId($contact->getId());
  112. $contact_im_value->setImTypeId($im_type->getId());
  113. $contact_im_value->setValue($value);
  114. $contact_im_value->setIsDefault(array_var($contact_data, 'default_im') == $im_type->getId());
  115. $contact_im_value->save();
  116. } // if
  117. } // foreach
  118. ApplicationLogs::createLog($contact, null, ApplicationLogs::ACTION_ADD);
  119. DB::commit();
  120. flash_success(lang('success add contact', $contact->getDisplayName()));
  121. $this->redirectToUrl($contact->getCardUrl()); // Translate to profile page
  122. } catch (Exception $e) {
  123. DB::rollback();
  124. tpl_assign('error', $e);
  125. } // try
  126. } // if
  127. } // add
  128. /**
  129. *
  130. * @access public
  131. * @param void
  132. * @return null
  133. */
  134. function edit() {
  135. $this->setTemplate('add_contact');
  136. $contact = Contacts::findById(get_id());
  137. if (!($contact instanceof Contact)) {
  138. flash_error(lang('contact dnx'));
  139. $this->redirectTo('dashboard', 'contacts');
  140. } // if
  141. if (!$contact->canEdit(logged_user())) {
  142. flash_error(lang('no access permissions'));
  143. $this->redirectTo('dashboard', 'contacts');
  144. } // if
  145. $im_types = ImTypes::findAll(array('order' => '`id`'));
  146. $contact_data = array_var($_POST, 'contact');
  147. $company = $contact->getCompany();
  148. if (!is_array($contact_data)) {
  149. $tag_names = null;
  150. if (plugin_active('tags')) {
  151. $tag_names = $contact->getTagNames();
  152. }
  153. $contact_data = array(
  154. 'display_name' => $contact->getDisplayName(),
  155. 'first_name' => $contact->getFirstName(),
  156. 'middle_name' => $contact->getMiddleName(),
  157. 'last_name' => $contact->getLastName(),
  158. 'company_id' => $contact->getCompanyId(),
  159. 'title' => $contact->getTitle(),
  160. 'email' => $contact->getEmail(),
  161. 'timezone' => $contact->getTimezone(),
  162. 'office_number' => $contact->getOfficeNumber(),
  163. 'fax_number' => $contact->getFaxNumber(),
  164. 'mobile_number' => $contact->getMobileNumber(),
  165. 'home_number' => $contact->getHomeNumber(),
  166. 'food_preferences' => $contact->getFoodPreferences(),
  167. 'license_plate' => $contact->getLicensePlate(),
  168. 'location_details' => $contact->getLocationDetails(),
  169. 'department_details' => $contact->getDepartmentDetails(),
  170. 'use_gravatar' => $contact->getUseGravatar(),
  171. 'tags' => is_array($tag_names) ? implode(', ', $tag_names) : '',
  172. ); // array
  173. if (is_array($im_types)) {
  174. foreach ($im_types as $im_type) {
  175. $contact_data['im_' . $im_type->getId()] = $contact->getImValue($im_type);
  176. } // forech
  177. } // if
  178. $default_im = $contact->getDefaultImType();
  179. $contact_data['default_im'] = $default_im instanceof ImType ? $default_im->getId() : '';
  180. } // if
  181. tpl_assign('contact', $contact);
  182. tpl_assign('company', $company);
  183. tpl_assign('contact_data', $contact_data);
  184. tpl_assign('im_types', $im_types);
  185. $avatar = array_var($_FILES, 'new_avatar');
  186. if (is_array($avatar) && isset($avatar['size']) && $avatar['size'] != 0) {
  187. try {
  188. $old_file = $contact->getAvatarPath();
  189. if (!isset($avatar['name']) || !isset($avatar['type']) || !isset($avatar['size']) || !isset($avatar['tmp_name']) || !is_readable($avatar['tmp_name'])) {
  190. throw new InvalidUploadError($avatar, lang('error upload file'));
  191. } // if
  192. $valid_types = array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
  193. $max_width = config_option('max_avatar_width', 50);
  194. $max_height = config_option('max_avatar_height', 50);
  195. if ($avatar['size']) {
  196. if (!in_array($avatar['type'], $valid_types) || !($image = getimagesize($avatar['tmp_name']))) {
  197. throw new InvalidUploadError($avatar, lang('invalid upload type', 'JPG, GIF, PNG'));
  198. } elseif (!$contact->setAvatar($avatar['tmp_name'], $max_width, $max_height, false)) {
  199. throw new Error($avatar, lang('error edit avatar'));
  200. $contact->setAvatarFile('');
  201. } // if
  202. if (is_file($old_file)) {
  203. @unlink($old_file);
  204. } // if
  205. } // if
  206. } catch (Exception $e) {
  207. flash_error($e->getMessage());
  208. } // try
  209. } else if (array_var($contact_data, 'delete_avatar') == "checked") {
  210. $old_file = $contact->getAvatarPath();
  211. if (is_file($old_file)) {
  212. @unlink($old_file);
  213. } // if
  214. $contact->setAvatarFile('');
  215. } // if
  216. if (is_array(array_var($_POST, 'contact'))) {
  217. try {
  218. DB::beginWork();
  219. $contact->setFromAttributes($contact_data);
  220. $contact->save();
  221. if (plugin_active('tags')) {
  222. $contact->setTagsFromCSV(array_var($contact_data, 'tags'));
  223. }
  224. $contact->clearImValues();
  225. foreach ($im_types as $im_type) {
  226. $value = trim(array_var($contact_data, 'im_' . $im_type->getId()));
  227. if ($value <> '') {
  228. $contact_im_value = new ContactImValue();
  229. $contact_im_value->setContactId($contact->getId());
  230. $contact_im_value->setImTypeId($im_type->getId());
  231. $contact_im_value->setValue($value);
  232. $contact_im_value->setIsDefault(array_var($contact_data, 'default_im') == $im_type->getId());
  233. $contact_im_value->save();
  234. } // if
  235. } // foreach
  236. ApplicationLogs::createLog($contact, null, ApplicationLogs::ACTION_ADD);
  237. DB::commit();
  238. flash_success(lang('success edit contact', $contact->getDisplayName()));
  239. if (!logged_user()->isMemberOfOwnerCompany()) {
  240. $this->redirectToUrl(logged_user()->getAccountUrl());
  241. } else {
  242. $this->redirectToUrl($contact->getCompany()->getViewUrl()); // Translate to profile page
  243. } // if
  244. } catch (Exception $e) {
  245. DB::rollback();
  246. tpl_assign('error', $e);
  247. } // try
  248. } // if
  249. } // edit
  250. /**
  251. * Delete specific contact
  252. *
  253. * @access public
  254. * @param void
  255. * @return null
  256. */
  257. function delete() {
  258. $this->setTemplate('del_contact');
  259. $contact = Contacts::findById(get_id());
  260. if (!($contact instanceof Contact)) {
  261. flash_error(lang('contact dnx'));
  262. $this->redirectTo('administration', 'contacts');
  263. } // if
  264. if (!$contact->canDelete(logged_user())) {
  265. flash_error(lang('no access permissions'));
  266. $this->redirectToReferer(get_url('dashboard', 'contacts'));
  267. } // if
  268. $delete_data = array_var($_POST, 'deleteContact');
  269. tpl_assign('contact', $contact);
  270. tpl_assign('delete_data', $delete_data);
  271. if (!is_array($delete_data)) {
  272. $delete_data = array(
  273. 'really' => 0,
  274. 'password' => '',
  275. ); // array
  276. tpl_assign('delete_data', $delete_data);
  277. } else if ($delete_data['really'] == 1) {
  278. $password = $delete_data['password'];
  279. if (trim($password) == '') {
  280. tpl_assign('error', new Error(lang('password value missing')));
  281. return $this->render();
  282. }
  283. if (!logged_user()->isValidPassword($password)) {
  284. tpl_assign('error', new Error(lang('invalid password')));
  285. return $this->render();
  286. }
  287. try {
  288. DB::beginWork();
  289. $contact->delete();
  290. ApplicationLogs::createLog($contact, null, ApplicationLogs::ACTION_DELETE);
  291. DB::commit();
  292. flash_success(lang('success delete contact', $contact->getDisplayName()));
  293. } catch (Exception $e) {
  294. DB::rollback();
  295. flash_error(lang('error delete contact'));
  296. } // try
  297. $this->redirectToUrl($contact->getCompany()->getViewUrl());
  298. } else {
  299. flash_error(lang('error delete contact'));
  300. $this->redirectToUrl($contact->getCompany()->getViewUrl());
  301. }
  302. } // delete
  303. /**
  304. * Show contact card
  305. *
  306. * @access public
  307. * @param void
  308. * @return null
  309. */
  310. function card() {
  311. $this->setLayout('dashboard');
  312. $contact = Contacts::findById(get_id());
  313. if (!($contact instanceof Contact)) {
  314. flash_error(lang('contact dnx'));
  315. $this->redirectToReferer(get_url('dashboard', 'contacts'));
  316. } // if
  317. if (!logged_user()->canSeeContact($contact)) {
  318. flash_error(lang('no access permissions'));
  319. $this->redirectToReferer(get_url('dashboard', 'contacts'));
  320. } // if
  321. tpl_assign('contact', $contact);
  322. } // card
  323. /**
  324. * Create and attach a user account to the contact
  325. *
  326. * @access public
  327. * @param void
  328. * @return null
  329. */
  330. function add_user_account() {
  331. $this->setTemplate('add_user_to_contact');
  332. $contact = Contacts::findById(get_id());
  333. if (!($contact instanceof Contact)) {
  334. flash_error(lang('contact dnx'));
  335. $this->redirectTo('dashboard', 'contacts');
  336. } // if
  337. if (!$contact->canAddUserAccount(logged_user())) {
  338. flash_error(lang('no access permissions'));
  339. $this->redirectTo('dashboard','contacts');
  340. } // if
  341. if ($contact->hasUserAccount()) {
  342. flash_error(lang('contact already has user'));
  343. $this->redirectToUrl($contact->getCardUrl());
  344. }
  345. $user = new User();
  346. $company = $contact->getCompany();
  347. $user_data = array_var($_POST, 'user');
  348. if (!is_array($user_data)) {
  349. $user_data = array(
  350. 'email' => $contact->getEmail(),
  351. 'password_generator' => 'random',
  352. 'timezone' => $company->getTimezone(),
  353. ); // array
  354. } // if
  355. $projects = $company->getProjects();
  356. $permissions = PermissionManager::getPermissionsText();
  357. tpl_assign('contact', $contact);
  358. tpl_assign('user', $user);
  359. tpl_assign('company', $company);
  360. tpl_assign('projects', $projects);
  361. tpl_assign('permissions', $permissions);
  362. tpl_assign('user_data', $user_data);
  363. if (is_array(array_var($_POST, 'user'))) {
  364. $user->setFromAttributes($user_data);
  365. try {
  366. // Generate random password
  367. if (array_var($user_data, 'password_generator') == 'random') {
  368. $password = substr(sha1(uniqid(rand(), true)), rand(0, 25), 13);
  369. // Validate user input
  370. } else {
  371. $password = array_var($user_data, 'password');
  372. if (trim($password) == '') {
  373. throw new Error(lang('password value required'));
  374. } // if
  375. if ($password <> array_var($user_data, 'password_a')) {
  376. throw new Error(lang('passwords dont match'));
  377. } // if
  378. } // if
  379. $user->setPassword($password);
  380. $granted = 0;
  381. if (logged_user()->isAdministrator()) {
  382. $user->setIsAdmin( array_var($user_data, 'is_admin') );
  383. $user->setAutoAssign( array_var($user_data, 'auto_assign') );
  384. $granted = (trim(array_var($user_data, 'can_manage_projects')) == '1') ? 1 : 0;
  385. } else {
  386. $user->setIsAdmin( 0 );
  387. $user->setAutoAssign( 0 );
  388. }
  389. DB::beginWork();
  390. $user->save();
  391. $user->setPermission(PermissionManager::CAN_MANAGE_PROJECTS, $granted);
  392. $contact->setUserId($user->getId());
  393. $contact->save();
  394. ApplicationLogs::createLog($user, null, ApplicationLogs::ACTION_ADD);
  395. if (is_array($projects)) {
  396. foreach ($projects as $project) {
  397. if (array_var($user_data, 'project_permissions_' . $project->getId()) == 'checked') {
  398. $relation = new ProjectUser();
  399. $relation->setProjectId($project->getId());
  400. $relation->setUserId($user->getId());
  401. foreach ($permissions as $permission => $permission_text) {
  402. $permission_value = array_var($user_data, 'project_permission_' . $project->getId() . '_' . $permission) == 'checked';
  403. $setter = 'set' . Inflector::camelize($permission);
  404. $relation->$setter($permission_value);
  405. } // foreach
  406. $relation->save();
  407. } // if
  408. } // forech
  409. } // if
  410. DB::commit();
  411. // Send notification...
  412. try {
  413. if (array_var($user_data, 'send_email_notification')) {
  414. Notifier::newUserAccount($user, $password);
  415. } // if
  416. } catch(Exception $e) {
  417. } // try
  418. flash_success(lang('success add user', $user->getDisplayName()));
  419. $this->redirectToUrl($company->getViewUrl()); // Translate to profile page
  420. } catch(Exception $e) {
  421. DB::rollback();
  422. tpl_assign('error', $e);
  423. } // try
  424. } // if
  425. } // add_user_account
  426. /**
  427. * Edit the contact's user account
  428. *
  429. * @access public
  430. * @param void
  431. * @return null
  432. */
  433. function edit_user_account() {
  434. $this->setTemplate('add_user_to_contact');
  435. $contact = Contacts::findById(get_id());
  436. if (!($contact instanceof Contact)) {
  437. flash_error(lang('contact dnx'));
  438. $this->redirectTo('dashboard', 'contacts');
  439. } // if
  440. if (!$contact->canEditUserAccount(logged_user())) {
  441. flash_error(lang('no access permissions'));
  442. $this->redirectTo('dashboard', 'contacts');
  443. } // if
  444. if (!$contact->hasUserAccount()) {
  445. flash_error(lang('user dnx'));
  446. $this->redirectToUrl($contact->getCompany()->getViewUrl());
  447. }
  448. $user = $contact->getUserAccount();
  449. $company = $contact->getCompany();
  450. $user_data = array_var($_POST, 'user');
  451. if (!is_array($user_data)) {
  452. $user_data = array(
  453. 'username' => $user->getUsername(),
  454. 'email' => $user->getEmail(),
  455. 'timezone' => $user->getTimezone(),
  456. 'locale' => $user->getLocale(),
  457. 'is_admin' => $user->isAdministrator(),
  458. 'auto_assign' => $user->getAutoAssign(),
  459. 'use_LDAP' => $user->getUseLDAP(),
  460. 'can_manage_projects' => $user->canManageProjects() ? '1' : '0'
  461. ); // array
  462. } // if
  463. tpl_assign('contact', $contact);
  464. tpl_assign('user', $user);
  465. tpl_assign('company', $company);
  466. tpl_assign('user_data', $user_data);
  467. if (is_array(array_var($_POST, 'user'))) {
  468. $user->setFromAttributes($user_data);
  469. try {
  470. $password = '';
  471. // Generate random password
  472. if (array_var($user_data, 'password_generator') == 'random') {
  473. $password = substr(sha1(uniqid(rand(), true)), rand(0, 25), 13);
  474. $user->setPassword($password);
  475. // Validate user input
  476. } else if (array_var($user_data, 'password_generator') == 'specify') {
  477. $password = array_var($user_data, 'password');
  478. if (trim($password) == '') {
  479. throw new Error(lang('password value required'));
  480. } // if
  481. if ($password <> array_var($user_data, 'password_a')) {
  482. throw new Error(lang('passwords dont match'));
  483. } // if
  484. $user->setPassword($password);
  485. } // if
  486. $granted = 0;
  487. if (logged_user()->isAdministrator()) {
  488. $user->setIsAdmin( array_var($user_data, 'is_admin') );
  489. $user->setAutoAssign( array_var($user_data, 'auto_assign') );
  490. $granted = (trim(array_var($user_data, 'can_manage_projects')) == '1') ? 1 : 0;
  491. } else {
  492. $user->setIsAdmin( 0 );
  493. $user->setAutoAssign( 0 );
  494. }
  495. DB::beginWork();
  496. $user->save();
  497. $user->setPermission(PermissionManager::CAN_MANAGE_PROJECTS, $granted);
  498. ApplicationLogs::createLog($user, null, ApplicationLogs::ACTION_EDIT);
  499. DB::commit();
  500. // Send notification...
  501. try {
  502. if (array_var($user_data, 'send_email_notification')) {
  503. Notifier::updatedUserAccount($user, $password);
  504. } // if
  505. } catch(Exception $e) {
  506. } // try
  507. flash_success(lang('success edit user', $user->getDisplayName()));
  508. $this->redirectToUrl($company->getViewUrl()); // Translate to profile page
  509. } catch(Exception $e) {
  510. DB::rollback();
  511. tpl_assign('error', $e);
  512. } // try
  513. } // if
  514. } // edit_user_account
  515. /**
  516. * Delete the user account associated with that contact
  517. *
  518. * @param void
  519. * @return null
  520. */
  521. function delete_user_account() {
  522. $this->setTemplate('del_user_account');
  523. $contact = Contacts::findById(get_id());
  524. if (!($contact instanceof Contact)) {
  525. flash_error(lang('contact dnx'));
  526. $this->redirectTo('administration', 'contacts');
  527. } // if
  528. $user = $contact->getUserAccount();
  529. if (!($user instanceof User)) {
  530. flash_error(lang('user dnx'));
  531. $this->redirectTo('administration', 'contacts');
  532. } // if
  533. if (!$contact->canDeleteUserAccount(logged_user())) {
  534. flash_error(lang('no access permissions'));
  535. $this->redirectToReferer(get_url('dashboard', 'contacts'));
  536. } // if
  537. $company = $contact->getCompany();
  538. $delete_data = array_var($_POST, 'deleteUser');
  539. tpl_assign('contact', $contact);
  540. tpl_assign('company', $company);
  541. tpl_assign('user', $user);
  542. tpl_assign('delete_data', $delete_data);
  543. if (!is_array($delete_data)) {
  544. $delete_data = array(
  545. 'really' => 0,
  546. 'password' => '',
  547. ); // array
  548. tpl_assign('delete_data', $delete_data);
  549. } else if ($delete_data['really'] == 1) {
  550. $password = $delete_data['password'];
  551. if (trim($password) == '') {
  552. tpl_assign('error', new Error(lang('password value missing')));
  553. return $this->render();
  554. }
  555. if (!logged_user()->isValidPassword($password)) {
  556. tpl_assign('error', new Error(lang('invalid password')));
  557. return $this->render();
  558. }
  559. try {
  560. DB::beginWork();
  561. $user->delete();
  562. $contact->setUserId('0');
  563. $contact->save();
  564. ApplicationLogs::createLog($user, null, ApplicationLogs::ACTION_DELETE);
  565. DB::commit();
  566. flash_success(lang('success delete user', $user->getDisplayName()));
  567. } catch (Exception $e) {
  568. DB::rollback();
  569. flash_error(lang('error delete user'));
  570. } // try
  571. $this->redirectToUrl($company->getViewUrl());
  572. } else {
  573. flash_error(lang('error delete user'));
  574. $this->redirectToUrl($company->getViewUrl());
  575. }
  576. } // delete_user_account
  577. /**
  578. * Toggle favorite status
  579. *
  580. * @param void
  581. * @return null
  582. */
  583. function toggle_favorite() {
  584. if (!logged_user()->isAdministrator()) {
  585. flash_error('no access permisssions');
  586. $this->redirectToReferer(get_url('dashboard', 'index'));
  587. }
  588. $contact = Contacts::findById(get_id());
  589. if (!($contact instanceof Contact)) {
  590. flash_error(lang('contact dnx'));
  591. $this->redirectToReferer(get_url('administration', 'contacts'));
  592. } // if
  593. $contact->setIsFavorite(!$contact->isFavorite());
  594. if (!$contact->save()) {
  595. flash_error(lang('could not save info'));
  596. }
  597. $redirect_to = urldecode(array_var($_GET, 'redirect_to'));
  598. //if ((trim($redirect_to)) == '' || !is_valid_url($redirect_to)) {
  599. if (trim($redirect_to) == '') {
  600. $redirect_to = $contact->getCompany()->getViewUrl();
  601. } // if
  602. $this->redirectToUrl($redirect_to);
  603. } // toggleFavorite
  604. } // ContactsController
  605. ?>