I am having an issue with a cakephp script. It was written with cakephp version 2.5.1.
I'm getting fatal error: Fatal error: Cannot call constructor in /lib/Cake/Controller/CakeErrorController.php on line 46.
The original AppController.php file looked like this:
<?php
if (session_id() == '') {
session_start();
}
class AppController
{
public $components = array('Auth');
public $helpers = array(
0 => 'Form',
'Html' => array('className' => 'MyHtml')
);
public function beforeFilter()
{
global $loguser;
global $username;
global $siteChanges;
global $paypalAdaptive;
global $user_level;
global $setngs;
global $price;
global $colors;
global $parent_categori;
global $googlecode;
parent::beforeFilter();
$this->Auth->loginAction = array('controller' => '/', 'action' => '/login');
$this->Auth->logoutRedirect = array('controller' => '/', 'action' => '/');
$this->Auth->authenticate = array(
AuthComponent::ALL => array(
'fields' => array('username' => 'email', 'password' => 'password'),
'userModel' => 'Users.User'
),
0 => 'Form'
);
if ($this->params['controller'] == 'api') {
$this->Auth->allow();
}
if ($this->params['controller'] == 'fantasyhelps') {
$this->Auth->allow();
}
if ($this->params['controller'] == 'paypals') {
App::import('Vendor', 'PayPal');
}
$this->Auth->allow(, , 'login', 'signup', 'emailverification', 'verification', 'index', 'setpassword', 'userprofiles', 'viewshops', 'addto', 'press', 'about', 'toppeople', 'findpeople', 'storeprofiles', 'getstoreprofile', 'listings', 'show_color', 'show_price', 'showByCategory', 'getMorePosts', 'ipnprocess', 'getmorepricecolor', 'getItemByCategory', 'ajaxSearch', 'captcha', 'forgotpassword', 'showByRelation', 'getItemByRelation', 'faq', 'contact', 'item_comments', 'changePassword', 'copyrights', 'termsofsale', 'termsofservice', 'termsofmerchant', 'privacy', 'loginwith', 'loginwithtwitter', 'changecurrency', 'downimage', 'sitemaintenance', 'getviewmore', 'customviewmore', 'orderstatus', 'getsizeqty', 'searches', 'getmoregallery', 'viewitemdesc', 'followersList', 'getmoreprofile', 'getmorestorycomment', 'followingList', 'twittlogin_save', 'item_favorited', 'merupdate', 'custupdatend', 'testing', 'bookmarklet', 'getmorecomments', 'adaptiveipnprocess', 'additemusingurl', 'giftcardipnIpn', 'ggipn', 'ggcronjob', 'nearme', 'getMorenearme', 'gifts', 'story');
$loguser = $this->Auth->user();
$userid = $loguser[0]['User']['id'];
$username = $loguser[0]['User']['username'];
$first_name = $loguser[0]['User']['first_name'];
$username_url = $loguser[0]['User']['username_url'];
$user_level = $loguser[0]['User']['user_level'];
$profile_image = $loguser[0]['User']['profile_image'];
$this->set('loguser', $loguser);
$this->set('username', $username);
$this->set('username_url', $username_url);
$this->set('user_level', $user_level);
$this->set('first_name', $first_name);
$this->set('profile_image', $profile_image);
$this->set('currentaction', $this->params['action']);
$this->loadModel('User');
$user_datas = $this->User->findById($userid);
if (!empty($loguser) && empty($user_datas)) {
$this->Auth->logout();
}
$user_status_val = $this->User->find('first', array(
'conditions' => array('User.id' => $userid)
));
$user_status = $user_status_val['User']['user_status'];
if ($user_status == 'disable') {
$this->Session->setFlash(__('Your account has been disabled please contact our support'), 'default', array(), 'bad');
$this->redirect($this->Auth->logout());
$this->redirect('/login');
}
$this->loadModel('Sitesetting');
$this->loadModel('Cart');
$this->loadModel('Orders');
$this->loadModel('Item');
$this->loadModel('Price');
$this->loadModel('Color');
$this->loadModel('Category');
$this->loadModel('Forexrate');
$this->loadModel('Managemodule');
$this->loadModel('Googlecode');
$this->loadModel('Contactseller');
$this->loadModel('Story');
$orderdetails = $this->Orders->find('all', array(
'conditions' => array('Orders.merchant_id' => $userid)
));
$this->set('orderdetails', $orderdetails);
$storyCount = $this->Story->find('count', array(
'conditions' => array('userid' => $userid)
));
$this->set('storyCounts', $storyCount);
$managemoduleModel = $this->Managemodule->find('first');
$this->set('managemoduleModel', $managemoduleModel);
$params = $this->params;
$action = $params['action'];
if ($this->params['controller'] != 'api') {
$this->_setLanguage();
}
if (($action != 'sitemaintenance') && ($action != 'login') && ($this->params['controller'] != 'api')) {
if (!$this->isauthenticated() || ($user_level != 'god')) {
if ($managemoduleModel['Managemodule']['site_maintenance_mode'] == 'yes') {
$this->redirect('/sitemaintenance');
}
}
}
$messageCount = $this->Contactseller->find('count', array(
'conditions' => array(
'OR' => array(
array('merchantid' => $userid, 'sellerread' => 1),
array('buyerid' => $userid, 'buyerread' => 1)
)
)
));
$_SESSION['userMessageCount'] = $messageCount;
if (!isset($_SESSION['language_settings'])) {
$languageJson = file_get_contents(SITE_URL . 'language_settings.json');
$_SESSION['language_settings'] = json_decode($languageJson, true);
$defaultLanguage = $_SESSION['language_settings']['settings']['default'];
Configure::write('Config.language', $defaultLanguage);
}
if (!isset($_SESSION['currency_value'])) {
$forexrateModel = $this->Forexrate->find('first', array(
'conditions' => array('status' => 'default')
));
$_SESSION['currency_symbol'] = $forexrateModel['Forexrate']['currency_symbol'];
$_SESSION['currency_value'] = $forexrateModel['Forexrate']['price'];
$_SESSION['currency_code'] = $forexrateModel['Forexrate']['currency_code'];
$_SESSION['default_currency_code'] = $forexrateModel['Forexrate']['currency_code'];
$_SESSION['default_currency_symbol'] = $forexrateModel['Forexrate']['currency_symbol'];
}
$setngs = $this->Sitesetting->find('all');
$price = ('all');
$forexrateModel = $this->Forexrate->find('all', array(
'conditions' => array('status <>' => 'disable')
));
$colors = $this->Color->find('all');
$UserDetailss = $this->User->findById($userid);
$this->set('UserDetailss', $UserDetailss);
$this->loadModel('Shop');
$sellerDetails = $this->Shop->find('all', array(
'conditions' => array('user_id' => $userid)
));
$this->set('sellerDetails', $sellerDetails);
$shopDetails = $this->Shop->find('first', array(
'conditions' => array('user_id' => $userid)
));
$this->set('shop_name', $shopDetails['Shop']['shop_name']);
$parent_categori = $this->Category->find('all', array(
'conditions' => array('category_parent' => 0)
));
$googlecode = $this->Googlecode->find('all');
if (!empty($userid)) {
if (!empty($carts)) {
foreach ($carts as $crt) {
$itmids[] = $crt['Cart']['item_id'];
}
$itm_datas = $this->Item->find('all', array(
'conditions' => array('Item.id' => $itmids, 'Item.status' => 'publish')
));
$total_itms = count($itm_datas);
$this->set('total_itms', $total_itms);
}
}
$this->set('price', $price);
$this->set('colors', $colors);
$this->set('forexrateModel', $forexrateModel);
$this->set('parent_categori', $parent_categori);
$this->set('googlecode', $googlecode);
$this->set('media_url', $setngs[0]['Sitesetting']['media_url']);
$this->set('setngs', $setngs);
$siteChanges = $setngs[0]['Sitesetting']['site_changes'];
$siteChanges = json_decode($siteChanges, true);
$paypalAdaptive = $setngs[0]['Sitesetting']['paypaladaptive'];
$paypalAdaptive = json_decode($paypalAdaptive, true);
$this->set('siteChanges', $siteChanges);
$_SESSION['site_url'] = SITE_URL;
$_SESSION['media_url'] = SITE_URL;
if (!empty($setngs[0]['Sitesetting']['media_url'])) {
$_SESSION['media_host_name'] = $setngs[0]['Sitesetting']['media_server_hostname'];
$_SESSION['media_url'] = $setngs[0]['Sitesetting']['media_url'];
$_SESSION['media_server_username'] = $setngs[0]['Sitesetting']['media_server_username'];
$_SESSION['media_server_password'] = $setngs[0]['Sitesetting']['media_server_password'];
}
$params = $this->params;
$action = $params['action'];
$this->set('action', $action);
if ($this->params['controller'] != 'api') {
$this->_setLanguage();
}
}
public function isauthenticated()
{
$user = $this->Auth->user();
if (!empty($user)) {
return true;
}
return false;
}
public function isauthorized()
{
$user = $this->Auth->user();
if (($user[0]['User']['user_level'] == 'god') || ($user[0]['User']['user_level'] == 'moderator')) {
return true;
}
return false;
}
public function isauthorizedpersn()
{
$user = ();
if (($user[0]['User']['user_level'] == 'god') || ($user[0]['User']['user_level'] == 'shop')) {
return true;
}
return false;
}
public function _setLanguage()
{
if (isset($this->Cookie) && $this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
$this->Session->write('Config.language', $this->Cookie->read('lang'));
}
else if (isset($this->params['language']) && ($this->params['language'] != $this->Session->read('Config.language'))) {
$this->Session->write('Config.language', $this->params['language']);
$this->Cookie->write('lang', $this->params['language'], false, '20 days');
}
}
}
$config['Settings'] = Configure::read('Settings');
define('SITE_URL', $config['Settings']['SITE_URL']);
define('SITE_NAME', $config['Settings']['SITE_TITLE']);
define('FB_ID', $config['Settings']['FB_ID']);
define('FB_SECRET', $config['Settings']['FB_SECRET']);
define('GOOGLE_ID', $config['Settings']['GOOGLE_ID']);
define('GOOGLE_SECRET', $config['Settings']['GOOGLE_SECRET']);
define('TWITTER_ID', $config['Settings']['TWITTER_ID']);
define('TWITTER_SECRET', $config['Settings']['TWITTER_SECRET']);
define('GMAIL_CLIENT_SECRET', $config['Settings']
['GMAIL_CLIENT_SECRET']);
define('GMAIL_CLIENT_ID', $config['Settings']['GMAIL_CLIENT_ID']);
?>
The first error pointed to this line:
$this->Auth->allow(, , 'login', 'signup', 'emailverification',
so I removed the , , and hence it became:
$this->Auth->allow('login', 'signup', 'emailverification',
The second error pointed to this line $user = ();
So I changed it to $user = $this->Auth->user();
But this change from $user = (); to $user = $this->Auth->user(); throws a fatal error:
Fatal error: Cannot call constructor in /lib/Cake/Controller/CakeErrorController.php on line 46
Below is the content of CakeErrorController.php. I'm told that CakeErrorController.php is a core file so I shouldn't really need to change it?
<?php
/**
* Error Handling Controller
*
* Controller used by ErrorHandler to render error views.
*
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc.
(http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the
LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* #copyright Copyright (c) Cake Software Foundation, Inc.
(http://cakefoundation.org)
* #link http://cakephp.org CakePHP(tm) Project
* #package Cake.Controller
* #since CakePHP(tm) v 2.0
* #license http://www.opensource.org/licenses/mit-license.php MIT
License
*/
App::uses('AppController', 'Controller');
/**
* Error Handling Controller
*
* Controller used by ErrorHandler to render error views.
*
* #package Cake.Controller
*/
class CakeErrorController extends AppController {
/**
* Uses Property
*
* #var array
*/
public $uses = array();
/**
* Constructor
*
* #param CakeRequest $request
* #param CakeResponse $response
*/
public function __construct($request = null, $response = null) {
parent::__construct($request, $response);
$this->constructClasses();
if (count(Router::extensions()) &&
!$this->Components->attached('RequestHandler')
) {
$this->RequestHandler = $this->Components-
>load('RequestHandler');
}
if ($this->Components->enabled('Auth')) {
$this->Components->disable('Auth');
}
if ($this->Components->enabled('Security')) {
$this->Components->disable('Security');
}
$this->_set(array('cacheAction' => false, 'viewPath' => 'Errors'));
}
}
I need help in fixing any issues you notice with the AppController.php file. I'm new at this. Any help will be much appreciated.
Thanks.
First of all, and I don't want to step on anyone's toes, but, that code looks horrible, there's so much wrong with it I don't even know where to start... global usage, accessing superglobals directly, manually starting a session via native calls, code outside of the class definition, public controller methods that aren't actual actions, massive amounts of unrelated code that should be in concrete controllers and/or components, etc... you really need to get that cleaned up.
That being said, your AppController class doesn't extend Controller (which it must do) and has no constructor itself, so there's no constructor to invoke via parent::__construct() in CakeErrorController::__construct(), hence the error.
See also Cookbook > Controllers
Related
so I set up a ticketing system called osticket for our users, unfortunately they do not have an automated workflow feature. Basically what I would like for the ticketing system to do is create an automated child task from a parent ticket. So if someone puts in a software request, then a parent request is created for support team and an approval child task is automatically created and assigned to management. I have no idea where to begin since I do not have a thorough programming background. If someone can point me to the direction of where I can find information about something similar or just provide a guide, that would be great!
Below is the current configured task.php file
<?php
/*********************************************************************
class.task.php
**********************************************************************/
include_once INCLUDE_DIR.'class.role.php';
class TaskModel extends VerySimpleModel {
static $meta = array(
'table' => TASK_TABLE,
'pk' => array('id'),
'joins' => array(
'dept' => array(
'constraint' => array('dept_id' => 'Dept.id'),
),
'lock' => array(
'constraint' => array('lock_id' => 'Lock.lock_id'),
'null' => true,
),
'staff' => array(
'constraint' => array('staff_id' => 'Staff.staff_id'),
'null' => true,
),
'team' => array(
'constraint' => array('team_id' => 'Team.team_id'),
'null' => true,
),
'thread' => array(
'constraint' => array(
'id' => 'TaskThread.object_id',
"'A'" => 'TaskThread.object_type',
),
'list' => false,
'null' => false,
),
'cdata' => array(
'constraint' => array('id' => 'TaskCData.task_id'),
"class.task.php" 1826 lines, 57620 characters
If I can provide any additional information, then please let me know.
Edit
Managed to find this php file, towards the bottom it mentions something about "Create Task", I'm guessing this is where I'll have the ability to set up an automated feature?
<?php
/*********************************************************************
class.thread_actions.php
Actions for thread entries. This serves as a simple repository for
drop-down actions which can be triggered on the ticket-view page for an
object's thread.
Jared Hancock <jared#osticket.com>
Peter Rotich <peter#osticket.com>
Copyright (c) 2006-2014 osTicket
http://www.osticket.com
Released under the GNU General Public License WITHOUT ANY WARRANTY.
See LICENSE.TXT for details.
vim: expandtab sw=4 ts=4 sts=4:
**********************************************************************/
include_once(INCLUDE_DIR.'class.thread.php');
class TEA_ShowEmailRecipients extends ThreadEntryAction {
static $id = 'emailrecipients';
static $name = /* trans */ 'View Email Recipients';
static $icon = 'group';
function isVisible() {
global $thisstaff;
if ($this->entry->getEmailHeader())
return ($thisstaff && $this->entry->getEmailHeader());
elseif ($this->entry->recipients)
return $this->entry->recipients;
}
function getJsStub() {
return sprintf("$.dialog('%s');",
$this->getAjaxUrl()
);
}
function trigger() {
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET' && $this->entry->recipients:
return $this->getRecipients();
case 'GET':
return $this->trigger__get();
}
}
private function trigger__get() {
$hdr = Mail_parse::splitHeaders(
$this->entry->getEmailHeader(), true);
$recipients = array();
foreach (array('To', 'TO', 'Cc', 'CC') as $k) {
if (isset($hdr[$k]) && $hdr[$k] &&
($addresses=Mail_Parse::parseAddressList($hdr[$k]))) {
foreach ($addresses as $addr) {
$email = sprintf('%s#%s', $addr->mailbox, $addr->host);
$name = $addr->personal ?: '';
$recipients[$k][] = sprintf('%s<%s>',
(($name && strcasecmp($name, $email))? "$name ": ''),
$email);
}
}
}
include STAFFINC_DIR . 'templates/thread-email-recipients.tmpl.php';
}
private function getRecipients() {
$recipients = json_decode($this->entry->recipients, true);
include STAFFINC_DIR . 'templates/thread-email-recipients.tmpl.php';
}
}
ThreadEntry::registerAction(/* trans */ 'E-Mail', 'TEA_ShowEmailRecipients');
class TEA_ShowEmailHeaders extends ThreadEntryAction {
static $id = 'view_headers';
static $name = /* trans */ 'View Email Headers';
static $icon = 'envelope';
function isVisible() {
global $thisstaff;
if (!$this->entry->getEmailHeader())
return false;
return $thisstaff && $thisstaff->isAdmin();
}
function getJsStub() {
return sprintf("$.dialog('%s');",
$this->getAjaxUrl()
);
}
function trigger() {
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
return $this->trigger__get();
}
}
private function trigger__get() {
$headers = $this->entry->getEmailHeader();
include STAFFINC_DIR . 'templates/thread-email-headers.tmpl.php';
}
}
ThreadEntry::registerAction(/* trans */ 'E-Mail', 'TEA_ShowEmailHeaders');
class TEA_EditThreadEntry extends ThreadEntryAction {
static $id = 'edit';
static $name = /* trans */ 'Edit';
static $icon = 'pencil';
function isVisible() {
// Can't edit system posts
return ($this->entry->staff_id || $this->entry->user_id)
&& $this->entry->type != 'R' && $this->isEnabled();
}
function isEnabled() {
global $thisstaff;
$T = $this->entry->getThread()->getObject();
// You can edit your own posts or posts by your department members
// if your a manager, or everyone's if your an admin
return $thisstaff && (
$thisstaff->getId() == $this->entry->staff_id
|| ($T instanceof Ticket
&& $T->getDept()->getManagerId() == $thisstaff->getId()
)
|| ($T instanceof Ticket
&& ($role = $thisstaff->getRole($T->getDeptId(), $T->isAssigned($thisstaff)))
&& $role->hasPerm(ThreadEntry::PERM_EDIT)
)
|| ($T instanceof Task
&& $T->getDept()->getManagerId() == $thisstaff->getId()
)
|| ($T instanceof Task
&& ($role = $thisstaff->getRole($T->getDeptId(), $T->isAssigned($thisstaff)))
&& $role->hasPerm(ThreadEntry::PERM_EDIT)
)
);
}
function getJsStub() {
return sprintf(<<<JS
var url = '%s';
$.dialog(url, [201], function(xhr, resp) {
var json = JSON.parse(resp);
if (!json || !json.thread_id)
return;
$('#thread-entry-'+json.thread_id)
.attr('id', 'thread-entry-' + json.new_id)
.html(json.entry)
.find('.thread-body')
.delay(500)
.effect('highlight');
}, {size:'large'});
JS
, $this->getAjaxUrl());
}
function trigger() {
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
return $this->trigger__get();
case 'POST':
return $this->trigger__post();
}
}
protected function trigger__get() {
global $cfg, $thisstaff;
$poster = $this->entry->getStaff();
include STAFFINC_DIR . 'templates/thread-entry-edit.tmpl.php';
}
function updateEntry($guard=false) {
global $thisstaff;
$old = $this->entry;
$new = ThreadEntryBody::fromFormattedText($_POST['body'], $old->format);
if ($new->getClean() == $old->getBody())
// No update was performed
return $old;
$entry = ThreadEntry::create(array(
// Copy most information from the old entry
'poster' => $old->poster,
'userId' => $old->user_id,
'staffId' => $old->staff_id,
'type' => $old->type,
'threadId' => $old->thread_id,
'recipients' => $old->recipients,
// Connect the new entry to be a child of the previous
'pid' => $old->id,
// Add in new stuff
'title' => Format::htmlchars($_POST['title']),
'body' => $new,
'ip_address' => $_SERVER['REMOTE_ADDR'],
));
if (!$entry)
return false;
// Move the attachments to the new entry
$old->attachments->filter(array(
'inline' => false,
))->update(array(
'object_id' => $entry->id
));
// Note, anything that points to the $old entry as PID should remain
// that way for email header lookups and such to remain consistent
if ($old->flags & ThreadEntry::FLAG_EDITED
// If editing another person's edit, make a new entry
and ($old->editor == $thisstaff->getId() && $old->editor_type == 'S')
and !($old->flags & ThreadEntry::FLAG_GUARDED)
) {
// Replace previous edit --------------------------
$original = $old->getParent();
// Link the new entry to the old id
$entry->pid = $old->pid;
// Drop the previous edit, and base this edit off the original
$old->delete();
$old = $original;
}
// Mark the new entry as edited (but not hidden nor guarded)
$entry->flags = ($old->flags & ~(ThreadEntry::FLAG_HIDDEN | ThreadEntry::FLAG_GUARDED))
| ThreadEntry::FLAG_EDITED;
// Guard against deletes on future edit if requested. This is done
// if an email was triggered by the last edit. In such a case, it
// should not be replaced by a subsequent edit.
if ($guard)
$entry->flags |= ThreadEntry::FLAG_GUARDED;
// Log the editor
$entry->editor = $thisstaff->getId();
$entry->editor_type = 'S';
// Sort in the same place in the thread
$entry->created = $old->created;
$entry->updated = SqlFunction::NOW();
$entry->save(true);
// Hide the old entry from the object thread
$old->flags |= ThreadEntry::FLAG_HIDDEN;
$old->save();
return $entry;
}
protected function trigger__post() {
global $thisstaff;
if (!($entry = $this->updateEntry()))
return $this->trigger__get();
ob_start();
include STAFFINC_DIR . 'templates/thread-entry.tmpl.php';
$content = ob_get_clean();
Http::response('201', JsonDataEncoder::encode(array(
'thread_id' => $this->entry->id, # This is the old id!
'new_id' => $entry->id,
'entry' => $content,
)));
}
}
ThreadEntry::registerAction(/* trans */ 'Manage', 'TEA_EditThreadEntry');
class TEA_OrigThreadEntry extends ThreadEntryAction {
static $id = 'previous';
static $name = /* trans */ 'View History';
static $icon = 'copy';
function isVisible() {
// Can't edit system posts
return $this->entry->flags & ThreadEntry::FLAG_EDITED;
}
function getJsStub() {
return sprintf("$.dialog('%s');",
$this->getAjaxUrl()
);
}
function trigger() {
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
return $this->trigger__get();
}
}
private function trigger__get() {
global $thisstaff;
if (!$this->entry->getParent())
Http::response(404, 'No history for this entry');
$entry = $this->entry;
include STAFFINC_DIR . 'templates/thread-entry-view.tmpl.php';
}
}
ThreadEntry::registerAction(/* trans */ 'Manage', 'TEA_OrigThreadEntry');
class TEA_EditAndResendThreadEntry extends TEA_EditThreadEntry {
static $id = 'edit_resend';
static $name = /* trans */ 'Edit and Resend';
static $icon = 'reply-all';
function isVisible() {
// Can only resend replies
return $this->entry->staff_id && $this->entry->type == 'R'
&& $this->isEnabled();
}
protected function trigger__post() {
$resend = #$_POST['commit'] == 'resend';
if (!($entry = $this->updateEntry($resend)))
return $this->trigger__get();
if ($resend)
$this->resend($entry);
ob_start();
include STAFFINC_DIR . 'templates/thread-entry.tmpl.php';
$content = ob_get_clean();
Http::response('201', JsonDataEncoder::encode(array(
'thread_id' => $this->entry->id, # This is the old id!
'new_id' => $entry->id,
'entry' => $content,
)));
}
function resend($response) {
global $cfg, $thisstaff;
if (!($object = $response->getThread()->getObject()))
return false;
$vars = $_POST;
$dept = $object->getDept();
$poster = $response->getStaff();
if ($thisstaff && $vars['signature'] == 'mine')
$signature = $thisstaff->getSignature();
elseif ($poster && $vars['signature'] == 'theirs')
$signature = $poster->getSignature();
elseif ($vars['signature'] == 'dept' && $dept && $dept->isPublic())
$signature = $dept->getSignature();
else
$signature = '';
$variables = array(
'response' => $response,
'signature' => $signature,
'staff' => $response->getStaff(),
'poster' => $response->getStaff());
$options = array('thread' => $response);
// Resend response to collabs
if (($object instanceof Ticket)
&& ($email=$dept->getEmail())
&& ($tpl = $dept->getTemplate())
&& ($msg=$tpl->getReplyMsgTemplate())) {
$recipients = json_decode($response->recipients, true);
$msg = $object->replaceVars($msg->asArray(),
$variables + array('recipient' => $object->getOwner()));
$attachments = $cfg->emailAttachments()
? $response->getAttachments() : array();
$email->send($object->getOwner(), $msg['subj'], $msg['body'],
$attachments, $options, $recipients);
}
// TODO: Add an option to the dialog
if ($object instanceof Task)
$object->notifyCollaborators($response, array('signature' => $signature));
// Log an event that the item was resent
$object->logEvent('resent', array('entry' => $response->id));
$type = array('type' => 'resent');
Signal::send('object.edited', $object, $type);
// Flag the entry as resent
$response->flags |= ThreadEntry::FLAG_RESENT;
$response->save();
}
}
ThreadEntry::registerAction(/* trans */ 'Manage', 'TEA_EditAndResendThreadEntry');
class TEA_ResendThreadEntry extends TEA_EditAndResendThreadEntry {
static $id = 'resend';
static $name = /* trans */ 'Resend';
static $icon = 'reply-all';
function isVisible() {
// Can only resend replies
return $this->entry->staff_id && $this->entry->type == 'R'
&& !parent::isEnabled();
}
function isEnabled() {
return true;
}
protected function trigger__get() {
global $cfg, $thisstaff;
$poster = $this->entry->getStaff();
include STAFFINC_DIR . 'templates/thread-entry-resend.tmpl.php';
}
protected function trigger__post() {
$resend = #$_POST['commit'] == 'resend';
if (#$_POST['commit'] == 'resend')
$this->resend($this->entry);
Http::response('201', 'Okee dokey');
}
}
ThreadEntry::registerAction(/* trans */ 'Manage', 'TEA_ResendThreadEntry');
/* Create a new ticket from thread entry as description */
class TEA_CreateTicket extends ThreadEntryAction {
static $id = 'create_ticket';
static $name = /* trans */ 'Create Ticket';
static $icon = 'plus';
function isVisible() {
global $thisstaff;
return $thisstaff && $thisstaff->hasPerm(Ticket::PERM_CREATE, false);
}
function getJsStub() {
return sprintf(<<<JS
window.location.href = '%s';
JS
, $this->getCreateTicketUrl()
);
}
function trigger() {
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
return $this->trigger__get();
}
}
private function trigger__get() {
Http::redirect($this->getCreateTicketUrl());
}
private function getCreateTicketUrl() {
return sprintf('tickets.php?a=open&tid=%d', $this->entry->getId());
}
}
ThreadEntry::registerAction(/* trans */ 'Manage', 'TEA_CreateTicket');
class TEA_CreateTask extends ThreadEntryAction {
static $id = 'create_task';
static $name = /* trans */ 'Create Task';
static $icon = 'plus';
function isVisible() {
global $thisstaff;
return $thisstaff && $thisstaff->hasPerm(Task::PERM_CREATE, false);
}
function getJsStub() {
return sprintf(<<<JS
var url = '%s';
var redirect = $(this).data('redirect');
$.dialog(url, [201], function(xhr, resp) {
if (!!redirect)
$.pjax({url: redirect, container: '#pjax-container'});
else
$.pjax({url: '%s.php?id=%d#tasks', container: '#pjax-container'});
});
JS
, $this->getAjaxUrl(),
$this->entry->getThread()->getObjectType() == 'T' ? 'tickets' : 'tasks',
$this->entry->getThread()->getObjectId()
);
}
function trigger() {
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
return $this->trigger__get();
case 'POST':
return $this->trigger__post();
}
}
private function trigger__get() {
$vars = array(
'description' => Format::htmlchars($this->entry->getBody()));
if ($_SESSION[':form-data'])
unset($_SESSION[':form-data']);
$_SESSION[':form-data']['tid'] = $this->entry->getThread()->getObJectId();
$_SESSION[':form-data']['eid'] = $this->entry->getId();
$_SESSION[':form-data']['timestamp'] = $this->entry->getCreateDate();
$_SESSION[':form-data']['type'] = $this->entry->getThread()->object_type;
if (($f= TaskForm::getInstance()->getField('description'))) {
$k = 'attach:'.$f->getId();
unset($_SESSION[':form-data'][$k]);
foreach ($this->entry->getAttachments() as $a)
if (!$a->inline && $a->file) {
$_SESSION[':form-data'][$k][$a->file->getId()] = $a->getFilename();
$_SESSION[':uploadedFiles'][$a->file->getId()] = $a->getFilename();
}
}
if ($this->entry->getThread()->getObjectType() == 'T')
return $this->getTicketsAPI()->addTask($this->getObjectId(), $vars);
else
return $this->getTasksAPI()->add($this->getObjectId(), $vars);
}
private function trigger__post() {
if ($this->entry->getThread()->getObjectType() == 'T')
return $this->getTicketsAPI()->addTask($this->getObjectId());
else
return $this->getTasksAPI()->add($this->getObjectId());
}
}
ThreadEntry::registerAction(/* trans */ 'Manage', 'TEA_CreateTask');
This piece of code shows a smll part of the models post.php from October Rainlab Blog plugin. The AfterSave() function is modified, it sends an e-mail when a new blogPost in the backend is saved by the administrator, however, I would like to send it when it is actually Published and make sure it is not sending multiple times. How could I accomplish this?
public function filterFields($fields, $context = null)
{
if (!isset($fields->published, $fields->published_at)) {
return;
}
$user = BackendAuth::getUser();
if (!$user->hasAnyAccess(['rainlab.blog.access_publish'])) {
$fields->published->hidden = true;
$fields->published_at->hidden = true;
}
else {
$fields->published->hidden = false;
$fields->published_at->hidden = false;
}
}
public function afterValidate()
{
if ($this->published && !$this->published_at) {
throw new ValidationException([
'published_at' => Lang::get('rainlab.blog::lang.post.published_validation')
]);
}
}
public function beforeSave()
{
if (empty($this->user)) {
$user = BackendAuth::getUser();
if (!is_null($user)) {
$this->user = $user->id;
}
}
$this->content_html = self::formatHtml($this->content);
}
public function afterSave()
{
$user = BackendAuth::getUser();
if ($user && $user->hasAnyAccess(['rainlab.blog.access_publish'])) {
$susers = Db::select('select * from users where is_activated = ?', [1]);
foreach ($susers as $suser) {
$currentPath = $_SERVER['PHP_SELF'];
$pathInfo = pathinfo($currentPath);
$hostName = $_SERVER['HTTP_HOST'];
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5))=='https'?'https':'http';
$protocol.'://'.$hostName.$pathInfo['dirname']."/";
$spost_url = $protocol.'://'.$hostName.$pathInfo['dirname']."/"."nieuws/".$this->attributes['slug'] ;
$stitle = $this->attributes['title'] ;
$body = '<div> Hallo '.$suser->name.'</br> Er is zojuist een nieuws bericht gepubliceerd voor alle leden van mycompany.nl , je kunt hier het bericht lezen aangaande: '.$stitle.' </div>' ;
//$from = $user->email ;
$from = 'noreply#mycompany.nl';
$headers = "From: $from\r\n";
$headers .= "Content-type: text/html\r\n";
mail($suser->email,'Nieuws van mycompany', $body,$headers);
}
}
}
/**
* Sets the "url" attribute with a URL to this object.
* #param string $pageName
* #param Controller $controller
* #param array $params Override request URL parameters
*
* #return string
*/
public function setUrl($pageName, $controller, $params = [])
{
$params = array_merge([
'id' => $this->id,
'slug' => $this->slug,
], $params);
if (empty($params['category'])) {
$params['category'] = $this->categories->count() ? $this->categories->first()->slug : null;
}
// Expose published year, month and day as URL parameters.
if ($this->published) {
$params['year'] = $this->published_at->format('Y');
$params['month'] = $this->published_at->format('m');
$params['day'] = $this->published_at->format('d');
}
return $this->url = $controller->pageUrl($pageName, $params);
}
/**
* Used to test if a certain user has permission to edit post,
* returns TRUE if the user is the owner or has other posts access.
* #param User $user
* #return bool
*/
public function canEdit(User $user)
{
return ($this->user_id == $user->id) || $user->hasAnyAccess(['rainlab.blog.access_other_posts']);
}
public static function formatHtml($input, $preview = false)
{
$result = Markdown::parse(trim($input));
// Check to see if the HTML should be cleaned from potential XSS
$user = BackendAuth::getUser();
if (!$user || !$user->hasAccess('backend.allow_unsafe_markdown')) {
$result = Html::clean($result);
}
if ($preview) {
$result = str_replace('<pre>', '<pre class="prettyprint">', $result);
}
$result = TagProcessor::instance()->processTags($result, $preview);
return $result;
}
//
// Scopes
//
public function scopeIsPublished($query)
{
return $query
->whereNotNull('published')
->where('published', true)
->whereNotNull('published_at')
->where('published_at', '<', Carbon::now())
;
}
/**
* Lists posts for the frontend
*
* #param $query
* #param array $options Display options
* #return Post
*/
public function scopeListFrontEnd($query, $options)
{
/*
* Default options
*/
extract(array_merge([
'page' => 1,
'perPage' => 30,
'sort' => 'created_at',
'categories' => null,
'exceptCategories' => null,
'category' => null,
'search' => '',
'published' => true,
'exceptPost' => null
], $options));
$searchableFields = ['title', 'slug', 'excerpt', 'content'];
if ($published) {
$query->isPublished();
}
One way to accomplish this would be to extend the Post model.
As an example, you create a new plugin and model with an is_notified field.
You would then add something like this to the boot() method of your new plugin:
PostModel::extend(function ($model) {
$model->hasOne['your_model'] = ['Author\PluginName\Models\YourModel'];
});
PostsController::extendFormFields(function ($form, $model, $context) {
// Checking for Post instance
if (!$model instanceof PostModel) {
return;
}
// without this code you can get an error saying "Call to a member function hasRelation() on null"
if (!$model->your_model) {
$model->your_model = new YourModel;
}
}
You can then use that new model in the afterSave method
public function afterSave()
{
$user = BackendAuth::getUser();
if ($user && $user->hasAnyAccess(['rainlab.blog.access_publish'])) {
$susers = Db::select('select * from users where is_activated = ?', [1]);
foreach ($susers as $suser) {
...
if ($this->your_model->is_notified != true) {
mail($suser->email,'Nieuws van mycompany', $body,$headers);
$this->your_model->is_notified = true;
}
}
}
}
You should also consider using the extend method instead of modifying 3rd party plugin code. This will allow you to update the plugin without losing your edits. Something like this:
PostModel::extend(function ($model) {
$model->hasOne['your_model'] = ['Author\PluginName\Models\YourModel'];
// You can transfer your afterSave code here!
$model->bindEvent('model.afterSave', function () use ($model) {
$user = BackendAuth::getUser();
if ($user && $user->hasAnyAccess(['rainlab.blog.access_publish'])) {
..
}
});
});
Let me know if you have any questions!
I want to create a module which is same as forum but modified as vforum. but i am facing a problem that is of subscribe. when i try to install the vforum, the subscribe module is occur and showing "Membership Packages". i am try to create settings for vforum but something is wrong. url is still changing as subscribe.
here i put my index.class.php code
<?php
/**
* [PHPFOX_HEADER]
*/
defined('PHPFOX') or exit('NO DICE!');
/**
*
*
* #copyright [PHPFOX_COPYRIGHT]
* #author Raymond Benc
* #package Module_Vforum
* #version $Id: index.class.php 5219 2013-01-28 12:15:53Z Miguel_Espinoza $
*/
class Vforum_Component_Controller_Index extends Phpfox_Component
{
/**
* Class process method wnich is used to execute this component.
*/
public function process()
{
if (($sLegacyTitle = $this->request()->get('req2')) && !empty($sLegacyTitle))
{
if (($sLegacyThread = $this->request()->get('req3')) && !empty($sLegacyThread) && !is_numeric($sLegacyTitle))
{
$aLegacyItem = Phpfox::getService('core')->getLegacyItem(array(
'field' => array('thread_id', 'title'),
'table' => 'Vforum_thread',
'redirect' => 'Vforum.thread',
'title' => $sLegacyThread
)
);
}
else
{
$aForumParts = explode('-', $sLegacyTitle);
if (isset($aForumParts[1]))
{
$aLegacyItem = Phpfox::getService('core')->getLegacyItem(array(
'field' => array('Vforum_id', 'name'),
'table' => 'Vforum',
'redirect' => 'Vforum',
'search' => 'Vforum_id',
'title' => $aForumParts[1]
)
);
}
}
}
Phpfox::getUserParam('vforum.can_view_vform', true);
$aParentModule = $this->getParam('aParentModule');
if (Phpfox::getParam('core.phpfox_is_hosted') && empty($aParentModule))
{
$this->url()->send('');
}
else if (empty($aParentModule) && $this->request()->get('view') == 'new')
{
$aDo = explode('/',$this->request()->get('do'));
if ($aDo[0] == 'mobile' || (isset($aDo[1]) && $aDo[1] == 'mobile'))
{
Phpfox::getLib('module')->getComponent('Vforum.Vforum', array('bNoTemplate' => true), 'controller');
return;
}
}
if ($this->request()->get('req2') == 'topics' || $this->request()->get('req2') == 'posts')
{
return Phpfox::getLib('module')->setController('error.404');
}
$this->template()->setBreadcrumb(Phpfox::getPhrase('vforum.vforum'), $this->url()->makeUrl('Vforum'))
->setPhrase(array(
'Vforum.provide_a_reply',
'Vforum.adding_your_reply',
'Vforum.are_you_sure',
'Vforum.post_successfully_deleted',
'Vforum.reply_multi_quoting'
)
)
->setHeader('cache', array(
'Vforum.css' => 'style_css',
'Vforum.js' => 'module_Vforum'
)
);
if ($aParentModule !== null)
{
Phpfox::getLib('module')->getComponent('Vforum.Vforum', array('bNoTemplate' => true), 'controller');
return;
}
if ($this->request()->getInt('req2') > 0)
{
return Phpfox::getLib('module')->setController('Vforum.Vforum');
}
$this->setParam('bIsVforum', true);
Phpfox::getService('Vforum')->buildMenu();
$this->template()->setTitle(Phpfox::getPhrase('vforum.vforum'))
->assign(array(
'aVforums' => Phpfox::getService('Vforum')->live()->getVforums(),
'bHasCategory' => Phpfox::getService('Vforum')->hasCategory(),
'aCallback' => null
)
);
}
/**
* Garbage collector. Is executed after this class has completed
* its job and the template has also been displayed.
*/
public function clean()
{
(($sPlugin = Phpfox_Plugin::get('Vforum.component_controller_index_clean')) ? eval($sPlugin) : false);
}
}
?>
Please help me.
thank you.
I was following this book to install the ZendSearh on the application, I did exactly as it's written and I'm getting a Fatal error: Class 'ZendSearch\Lucene\Lucene' not found in /var/www/CommunicationApp/module/Users/src/Users/Controller/SearchController.php on line 107
<?php
namespace Users\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Http\Headers;
use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Adapter\DbTable as DbTableAuthAdapter;
use Users\Form\RegisterForm;
use Users\Form\RegisterFilter;
use Users\Model\User;
use Users\Model\UserTable;
use Users\Model\Upload;
use Users\Model\ImageUpload;
use Users\Model\ImageUploadTable;
use ZendSearch\Lucene;
use ZendSearch\Lucene\Document;
use ZendSearch\Lucene\Index;
class SearchController extends AbstractActionController
{
protected $storage;
protected $authservice;
public function getAuthService()
{
if (! $this->authservice) {
$this->authservice = $this->getServiceLocator()->get('AuthService');
}
return $this->authservice;
}
public function getIndexLocation()
{
// Fetch Configuration from Module Config
$config = $this->getServiceLocator()->get('config');
if ($config instanceof Traversable) {
$config = ArrayUtils::iteratorToArray($config);
}
if (!empty($config['module_config']['search_index'])) {
return $config['module_config']['search_index'];
} else {
return FALSE;
}
}
public function getFileUploadLocation()
{
// Fetch Configuration from Module Config
$config = $this->getServiceLocator()->get('config');
if ($config instanceof Traversable) {
$config = ArrayUtils::iteratorToArray($config);
}
if (!empty($config['module_config']['upload_location'])) {
return $config['module_config']['upload_location'];
} else {
return FALSE;
}
}
public function indexAction()
{
$request = $this->getRequest();
if ($request->isPost()) {
$queryText = $request->getPost()->get('query');
$searchIndexLocation = $this->getIndexLocation();
$index = Lucene\Lucene::open($searchIndexLocation);
$searchResults = $index->find($queryText);
}
// prepare search form
$form = new \Zend\Form\Form();
$form->add(array(
'name' => 'query',
'attributes' => array(
'type' => 'text',
'id' => 'queryText',
'required' => 'required'
),
'options' => array(
'label' => 'Search String',
),
));
$form->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Search',
'style' => "margin-bottom: 8px; height: 27px;"
),
));
$viewModel = new ViewModel(array('form' => $form, 'searchResults' => $searchResults));
return $viewModel;
}
public function generateIndexAction()
{
$searchIndexLocation = $this->getIndexLocation();
$index = Lucene\Lucene::create($searchIndexLocation); // line 107
$userTable = $this->getServiceLocator()->get('UserTable');
$uploadTable = $this->getServiceLocator()->get('UploadTable');
$allUploads = $uploadTable->fetchAll();
foreach($allUploads as $fileUpload) {
//
$uploadOwner = $userTable->getUser($fileUpload->user_id);
// id field
$fileUploadId= Document\Field::unIndexed('upload_id', $fileUpload->id);
// label field
$label = Document\Field::Text('label', $fileUpload->label);
// owner field
$owner = Document\Field::Text('owner', $uploadOwner->name);
if (substr_compare($fileUpload->filename, ".xlsx", strlen($fileUpload->filename)-strlen(".xlsx"), strlen(".xlsx")) === 0) {
// index excel sheet
$uploadPath = $this->getFileUploadLocation();
$indexDoc = Lucene\Document\Xlsx::loadXlsxFile($uploadPath ."/" . $fileUpload->filename);
} else if (substr_compare($fileUpload->filename, ".docx", strlen($fileUpload->filename)-strlen(".docx"), strlen(".docx")) === 0) {
// index word doc
$uploadPath = $this->getFileUploadLocation();
$indexDoc = Lucene\Document\Docx::loadDocxFile($uploadPath ."/" . $fileUpload->filename);
} else {
$indexDoc = new Lucene\Document();
}
$indexDoc->addField($label);
$indexDoc->addField($owner);
$indexDoc->addField($fileUploadId);
$index->addDocument($indexDoc);
}
$index->commit();
}
}
It has its own repository on github.
https://github.com/zendframework/ZendSearch
You have to load it via composer or just download and put it under vendor folder.
I'm new to drupal and need to create a login form which i've succesfully done. But when i'm logged in i want the form to swtich to another form where you can edit your details.
I'm having trouble finding out how to swtich between the forms.
<?php
/**
* Implements hook_help.
*
* Displays help and module information.
*
* #param path
* Which path of the site we're using to display help
* #param arg
* Array that holds the current path as returned from arg() function
*/
function login_kms_help($path, $arg) {
switch ($path) {
case "admin/help#login":
return '<p>'. t("Creates login module") .'</p>';
break;
}
}
/**
* Implements hook_block_info().
*/
function login_kms_block_info() {
$blocks['login_kms'] = array(
'info' => t('Login KMS'), //The name that will appear in the block list.
'cache' => DRUPAL_CACHE_PER_ROLE, //Default
);
return $blocks;
}
function login_kms_block_view($delta = '') {
$block = array();
if($delta == 'login_kms') {
$block['subject'] = 'Login';
$block['content'] = drupal_render(drupal_get_form('login_kms_form_mode0'));
} else if($delta == 'login_kms'){
$block['subject'] = 'Edit';
$block['content'] = drupal_render(drupal_get_form('login_kms_form_mode1'));
}
return $block;
}
function login_kms_form_mode0() {
$form['username'] = array(
'#type' => 'textfield',
'#title' => t('Username:'),
);
$form['password'] = array(
'#type' => 'password',
'#title' => t('Password:'),
);
$form['Log in'] = array(
'#type' => 'submit',
'#value' => t('Log in'),
);
return $form;
}
function login_kms_form_mode1(){
$form['username'] = array(
'#type' => 'textfield',
'#title' => t('mode1'),
);
}
function login_kms_form_submit($form, &$form_state) {
$mysql_user = $form_state['values']['username'];
$mysql_pass = $form_state['values']['password'];
// drupal_set_message(t($mysql_pass));
// some logic
}
The first approach is using drupal_goto("my_path").
The second, and more "right" is using $form_state['redirect'] or $form['#redirect'], like this;
function login_kms_form_submit($form, &$form_state) {
$mysql_user = $form_state['values']['username'];
$mysql_pass = $form_state['values']['password'];
// drupal_set_message(t($mysql_pass));
// some logic
$form_state['redirect'] = 'user/to_the_new_form';
}
You can simply use drupal_goto() to redirect the logged in user to the other form.
global $user;
if(!empty($user->uid) || $user->uid > 0)
{
drupal_goto("my/new/page");
}
Hope this works... Muhammad.