
This question has been answered by Bruno17. See the first response.
<?xml version="1.0" encoding="UTF-8"?>
<model package="artvoting" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM">
<object class="artItem" table="artvoting_items" extends="xPDOSimpleObject">
<field key="name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
<field key="artist" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
<field key="filename" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="description" dbtype="text" phptype="string" />
<field key="url" dbtype="text" phptype="string" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="true" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="false" default="0" index="index" />
<aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="artAlbum" table="artvoting_albums" extends="xPDOSimpleObject">
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="year" dbtype="varchar" precision="255" phptype="string" />
<field key="description" dbtype="text" phptype="string" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="true" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="false" default="0" index="index" />
<field key="active" dbtype="tinyint" precision="1" phptype="integer" attributes="unsigned" null="false" default="0" />
<field key="cover_filename" dbtype="varchar" precision="255" phptype="string" null="false" default=""/>
<aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="artVotes" table="artvoting_votes" extends="xPDOSimpleObject">
<field key="item" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
<field key="userid" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
<field key="value" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
<field key="ip" dbtype="varchar" precision="40" phptype="string" null="false" default="" index="index" />
<field key="date" dbtype="int" precision="11" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
<composite alias="Item" class="artItem" local="item" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<model package="artvoting" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM">
<object class="artItem" table="artvoting_items" extends="xPDOSimpleObject">
<field key="name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
<field key="artist" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
<field key="filename" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="description" dbtype="text" phptype="string" />
<field key="url" dbtype="text" phptype="string" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="true" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="false" default="0" index="index" />
<field key="votes" dbtype="int" precision="10" phptype="integer" null="false" default="0" index="index" />
<aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign" />
<composite alias="Votes" class="artVotes" local="id" foreign="item_id" cardinality="many" owner="local" />
</object>
<object class="artAlbum" table="artvoting_albums" extends="xPDOSimpleObject">
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="year" dbtype="varchar" precision="255" phptype="string" />
<field key="description" dbtype="text" phptype="string" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="true" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="false" default="0" index="index" />
<field key="active" dbtype="tinyint" precision="1" phptype="integer" attributes="unsigned" null="false" default="0" />
<field key="cover_filename" dbtype="varchar" precision="255" phptype="string" null="false" default=""/>
<aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="artVotes" table="artvoting_votes" extends="xPDOSimpleObject">
<field key="item_id" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
<field key="user_id" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
<field key="value" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
<field key="ip" dbtype="varchar" precision="40" phptype="string" null="false" default="" index="index" />
<field key="date" dbtype="datetime" phptype="datetime" null="true" index="index" />
<aggregate alias="Item" class="artItem" local="item_id" foreign="id" cardinality="one" owner="foreign" />
<aggregate alias="User" class="modUser" local="user_id" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>
<?php
$gridcontextmenus['voteImage']['code'] = "
if (n.Vote_id == null) {
m.push('-');
m.push({
className : 'vote'
,text: 'vote'
,handler: 'this.voteImage'
});
}
";
$gridcontextmenus['voteImage']['handler'] = 'this.voteImage';
$gridfunctions['this.voteImage'] = "
voteImage: function() {
MODx.Ajax.request({
url: this.config.url
,params: {
action: 'mgr/migxdb/process'
,processaction: 'voteimage'
,object_id: this.menu.record.id
,configs: '[[+config.configs]]'
}
,listeners: {
'success': {fn:this.refresh,scope:this}
}
});
}
";
<?php
$user_id = $this->modx->getLoginUserId('mgr');
$this->customconfigs['joins'] = '[{"alias":"Vote","classname":"artVotes","on":"user_id='.$user_id.' and item_id=artItem.id"}]';
<?php
if (empty($scriptProperties['object_id'])) {
return $modx->error->failure('missing object_id');
}
$config = $modx->migx->customconfigs;
$prefix = $config['prefix'];
$packageName = $config['packageName'];
$packagepath = $modx->getOption('core_path') . 'components/' . $packageName . '/';
$modelpath = $packagepath . 'model/';
$modx->addPackage($packageName, $modelpath, $prefix);
$classname = 'artVotes';
if ($modx->lexicon) {
$modx->lexicon->load($packageName . ':default');
}
$user_id = $modx->getLoginUserId('mgr');
if ($object = $modx->getObject($classname, array('user_id' => $user_id, 'item_id' => $scriptProperties['object_id']))) {
//vote exists allready, do nothing
} else {
$object = $modx->newObject($classname);
$object->set('user_id', $user_id);
$object->set('item_id', $scriptProperties['object_id']);
$object->set('date', strftime('%Y-%m-%d %H:%M:%S'));
if ($object->save()) {
if ($itemObject = $object->getOne('Item')){
$itemObject->set('votes',$itemObject->get('votes')+1);
$itemObject->save();
}
}
}
//clear cache for all contexts
$collection = $modx->getCollection('modContext');
foreach ($collection as $context) {
$contexts[] = $context->get('key');
}
$modx->cacheManager->refresh(array(
'db' => array(),
'auto_publish' => array('contexts' => $contexts),
'context_settings' => array('contexts' => $contexts),
'resource' => array('contexts' => $contexts),
));
return $modx->error->success();
?>
[{"MIGX_id":"1","header":"ID","dataIndex":"id","width":"","sortable":"false","show_in_grid":"1","renderer":"","clickaction":"","selectorconfig":"","renderchunktpl":"","renderoptions":"[]"},{"MIGX_id":"2","header":"Name","dataIndex":"name","width":"","sortable":"false","show_in_grid":"1","renderer":"this.renderRowActions","clickaction":"","selectorconfig":"","renderchunktpl":"","renderoptions":"[]"},{"MIGX_id":"3","header":"Artist","dataIndex":"artist","width":"","sortable":"false","show_in_grid":"1","renderer":"","clickaction":"","selectorconfig":"","renderchunktpl":"","renderoptions":"[]"},{"MIGX_id":"4","header":"","dataIndex":"Vote_id","width":"","sortable":"false","show_in_grid":"0","renderer":"","clickaction":"","selectorconfig":"","renderchunktpl":"","renderoptions":"[]"}]