晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/modules/Settings/Picklist/models/ |
Upload File : |
<?php
/*+**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
************************************************************************************/
class Settings_Picklist_Module_Model extends Vtiger_Module_Model {
public function getPickListTableName($fieldName) {
return 'vtiger_'.$fieldName;
}
public function getFieldsByType($type) {
$presence = array('0','2');
$fieldModels = parent::getFieldsByType($type);
$fields = array();
foreach($fieldModels as $fieldName=>$fieldModel) {
if(($fieldModel->get('displaytype') != '1' && $fieldName != 'salutationtype') || !in_array($fieldModel->get('presence'),$presence)) {
continue;
}
$fields[$fieldName] = Settings_Picklist_Field_Model::getInstanceFromFieldObject($fieldModel);
}
return $fields;
}
public function addPickListValues($fieldModel, $newValue, $rolesSelected = array(), $color = '') {
$db = PearDatabase::getInstance();
$pickListFieldName = $fieldModel->getName();
$id = $db->getUniqueID("vtiger_$pickListFieldName");
vimport('~~/include/ComboUtil.php');
$picklist_valueid = getUniquePicklistID();
$tableName = 'vtiger_'.$pickListFieldName;
$maxSeqQuery = 'SELECT max(sortorderid) as maxsequence FROM '.$tableName;
$result = $db->pquery($maxSeqQuery, array());
$sequence = $db->query_result($result,0,'maxsequence');
if($fieldModel->isRoleBased()) {
$sql = 'INSERT INTO '.$tableName.' VALUES (?,?,?,?,?,?)';
$db->pquery($sql, array($id, $newValue, 1, $picklist_valueid, ++$sequence, $color));
}else{
$sql = 'INSERT INTO '.$tableName.' VALUES (?,?,?,?,?)';
$db->pquery($sql, array($id, $newValue, ++$sequence, 1, $color));
}
if($fieldModel->isRoleBased() && !empty($rolesSelected)) {
$sql = "select picklistid from vtiger_picklist where name=?";
$result = $db->pquery($sql, array($pickListFieldName));
$picklistid = $db->query_result($result,0,"picklistid");
//add the picklist values to the selected roles
for($j=0;$j<count($rolesSelected);$j++){
$roleid = $rolesSelected[$j];
Vtiger_Cache::delete('PicklistRoleBasedValues',$pickListFieldName.$roleid);
$sql ="SELECT max(sortid)+1 as sortid
FROM vtiger_role2picklist left join vtiger_$pickListFieldName
on vtiger_$pickListFieldName.picklist_valueid=vtiger_role2picklist.picklistvalueid
WHERE roleid=? and picklistid=?";
$sortid = $db->query_result($db->pquery($sql, array($roleid, $picklistid)),0,'sortid');
$sql = "insert into vtiger_role2picklist values(?,?,?,?)";
$db->pquery($sql, array($roleid, $picklist_valueid, $picklistid, $sortid));
}
}
// we should clear cache to update with latest values
Vtiger_Cache::flushPicklistCache($pickListFieldName);
return array('picklistValueId' => $picklist_valueid, 'id' => $id);
}
public function renamePickListValues($pickListFieldName, $oldValue, $newValue, $moduleName, $id, $rolesList = false, $color = '') {
$db = PearDatabase::getInstance();
$query = 'SELECT tablename, fieldid, columnname FROM vtiger_field WHERE fieldname=? and presence IN (0,2)';
$result = $db->pquery($query, array($pickListFieldName));
$num_rows = $db->num_rows($result);
//As older look utf8 characters are pushed as html-entities,and in new utf8 characters are pushed to database
//so we are checking for both the values
$primaryKey = Vtiger_Util_Helper::getPickListId($pickListFieldName);
if(!empty($color)) {
$query = 'UPDATE ' . $this->getPickListTableName($pickListFieldName) . ' SET ' . $pickListFieldName . '= ?, color = ? WHERE '.$primaryKey.' = ?';
$db->pquery($query, array($newValue, $color, $id));
} else {
$query = 'UPDATE ' . $this->getPickListTableName($pickListFieldName) . ' SET ' . $pickListFieldName . '=? WHERE '.$primaryKey.' = ?';
$db->pquery($query, array($newValue, $id));
}
for ($i = 0; $i < $num_rows; $i++) {
$row = $db->query_result_rowdata($result, $i);
$tableName = $row['tablename'];
$columnName = $row['columnname'];
$query = 'UPDATE ' . $tableName . ' SET ' . $columnName . '=? WHERE ' . $columnName . '=?';
$db->pquery($query, array($newValue, $oldValue));
}
$query = "UPDATE vtiger_field SET defaultvalue=? WHERE defaultvalue=? AND columnname=?";
$db->pquery($query, array($newValue, $oldValue, $columnName));
vimport('~~/include/utils/CommonUtils.php');
$query = "UPDATE vtiger_picklist_dependency SET sourcevalue=? WHERE sourcevalue=? AND sourcefield=?";
$db->pquery($query, array($newValue, $oldValue, $pickListFieldName));
//To update column name for Metric Picklist and Recalculate Transition Map
$moduleInstance = Vtiger_Module_Model::getInstance($moduleName);
$fieldModel = Vtiger_Field_Model::getInstance($pickListFieldName, $moduleInstance);
Vtiger_Cache::flushPicklistCache($pickListFieldName, $rolesList);
$em = new VTEventsManager($db);
$data = array();
$data['fieldId'] = $db->query_result($result, 0, 'fieldid');
$data['fieldname'] = $pickListFieldName;
$data['oldvalue'] = $oldValue;
$data['newvalue'] = $newValue;
$data['module'] = $moduleName;
$em->triggerEvent('vtiger.picklist.afterrename', $data);
return true;
}
public function remove($pickListFieldName , $valueToDeleteId, $replaceValueId , $moduleName) {
$db = PearDatabase::getInstance();
if(!is_array($valueToDeleteId)) {
$valueToDeleteId = array($valueToDeleteId);
}
$primaryKey = Vtiger_Util_Helper::getPickListId($pickListFieldName);
$pickListValues = array();
$valuesOfDeleteIds = "SELECT $pickListFieldName FROM ".$this->getPickListTableName($pickListFieldName)." WHERE $primaryKey IN (".generateQuestionMarks($valueToDeleteId).")";
$pickListValuesResult = $db->pquery($valuesOfDeleteIds,array($valueToDeleteId));
$num_rows = $db->num_rows($pickListValuesResult);
for($i=0;$i<$num_rows;$i++) {
$pickListValues[] = decode_html($db->query_result($pickListValuesResult,$i,$pickListFieldName));
}
$replaceValueQuery = $db->pquery("SELECT $pickListFieldName FROM ".$this->getPickListTableName($pickListFieldName)." WHERE $primaryKey IN (".generateQuestionMarks($replaceValueId).")",array($replaceValueId));
$replaceValue = decode_html($db->query_result($replaceValueQuery,0,$pickListFieldName));
//As older look utf8 characters are pushed as html-entities,and in new utf8 characters are pushed to database
//so we are checking for both the values
$encodedValueToDelete = array();
foreach ($pickListValues as $key => $value) {
$encodedValueToDelete[$key] = Vtiger_Util_Helper::toSafeHTML($value);
}
$mergedValuesToDelete = array_merge($pickListValues, $encodedValueToDelete);
$fieldModel = Settings_Picklist_Field_Model::getInstance($pickListFieldName,$this);
//if role based then we need to delete all the values in role based picklist
if($fieldModel->isRoleBased()) {
$picklistValueIdToDelete = array();
$query = 'SELECT DISTINCT picklist_valueid,roleid FROM '.$this->getPickListTableName($pickListFieldName).
' AS picklisttable LEFT JOIN vtiger_role2picklist AS roletable ON roletable.picklistvalueid = picklisttable.picklist_valueid
WHERE '.$primaryKey.' IN ('.generateQuestionMarks($valueToDeleteId).')';
$result = $db->pquery($query,$valueToDeleteId);
$num_rows = $db->num_rows($result);
for($i=0;$i<$num_rows;$i++) {
$picklistValueId = $db->query_result($result,$i,'picklist_valueid');
$roleId = $db->query_result($result,$i,'roleid');
// clear cache to update with lates values
Vtiger_Cache::delete('PicklistRoleBasedValues', $pickListFieldName.$roleId);
$picklistValueIdToDelete[$picklistValueId] = $picklistValueId;
}
$query = 'DELETE FROM vtiger_role2picklist WHERE picklistvalueid IN ('.generateQuestionMarks($picklistValueIdToDelete).')';
$db->pquery($query,$picklistValueIdToDelete);
}
// we should clear cache to update with latest values
Vtiger_Cache::flushPicklistCache($pickListFieldName);
$query = 'DELETE FROM '. $this->getPickListTableName($pickListFieldName).
' WHERE '.$primaryKey.' IN ('. generateQuestionMarks($valueToDeleteId).')';
$db->pquery($query,$valueToDeleteId);
vimport('~~/include/utils/CommonUtils.php');
$tabId = getTabId($moduleName);
$query = 'DELETE FROM vtiger_picklist_dependency WHERE sourcevalue IN ('. generateQuestionMarks($pickListValues) .')'.
' AND sourcefield=?';
$params = array();
array_push($params, $pickListValues);
array_push($params, $pickListFieldName);
$db->pquery($query, $params);
$query='SELECT tablename,columnname FROM vtiger_field WHERE fieldname=? AND presence in (0,2)';
$result = $db->pquery($query, array($pickListFieldName));
$num_row = $db->num_rows($result);
for($i=0; $i<$num_row; $i++) {
$row = $db->query_result_rowdata($result, $i);
$tableName = $row['tablename'];
$columnName = $row['columnname'];
$query = 'UPDATE '.$tableName.' SET '.$columnName.'=? WHERE '.$columnName.' IN ('. generateQuestionMarks($pickListValues).')';
$params = array($replaceValue);
array_push($params, $pickListValues);
$db->pquery($query, $params);
}
$query = 'UPDATE vtiger_field SET defaultvalue=? WHERE defaultvalue IN ('. generateQuestionMarks($pickListValues) .') AND columnname=?';
$params = array($replaceValue);
array_push($params, $pickListValues);
array_push($params, $columnName);
$db->pquery($query, $params);
$em = new VTEventsManager($db);
$data = array();
$data['fieldId'] = $fieldModel->id;
$data['fieldname'] = $pickListFieldName;
$data['valuetodelete'] = $pickListValues;
$data['replacevalue'] = $replaceValue;
$data['module'] = $moduleName;
$em->triggerEvent('vtiger.picklist.afterdelete', $data);
return true;
}
public function enableOrDisableValuesForRole($picklistFieldName, $valuesToEnables, $valuesToDisable, $roleIdList) {
$db = PearDatabase::getInstance();
//To disable die On error since we will be doing insert without chekcing
$dieOnErrorOldValue = $db->dieOnError;
$db->dieOnError = false;
$sql = "select picklistid from vtiger_picklist where name=?";
$result = $db->pquery($sql, array($picklistFieldName));
$picklistid = $db->query_result($result,0,"picklistid");
$primaryKey = Vtiger_Util_Helper::getPickListId($picklistFieldName);
$pickListValueList = array_merge($valuesToEnables,$valuesToDisable);
$pickListValueDetails = array();
$query = 'SELECT picklist_valueid,'. $picklistFieldName.', '.$primaryKey.
' FROM '.$this->getPickListTableName($picklistFieldName).
' WHERE '.$primaryKey .' IN ('. generateQuestionMarks($pickListValueList).')';
$params = array();
array_push($params, $pickListValueList);
$result = $db->pquery($query, $params);
$num_rows = $db->num_rows($result);
for($i=0; $i<$num_rows; $i++) {
$row = $db->query_result_rowdata($result,$i);
$pickListValueDetails[decode_html($row[$primaryKey])] =array('picklistvalueid'=>$row['picklist_valueid'],
'picklistid'=>$picklistid);
}
$insertValueList = array();
$deleteValueList = array();
foreach($roleIdList as $roleId) {
// clearing cache to update with latest values
Vtiger_Cache::delete('PicklistRoleBasedValues',$picklistFieldName.$roleId);
foreach($valuesToEnables as $picklistValue) {
$valueDetail = $pickListValueDetails[$picklistValue];
if(empty($valueDetail)){
$valueDetail = $pickListValueDetails[Vtiger_Util_Helper::toSafeHTML($picklistValue)];
}
$pickListValueId = $valueDetail['picklistvalueid'];
$picklistId = $valueDetail['picklistid'];
$insertValueList[] = '("'.$roleId.'","'.$pickListValueId.'","'.$picklistId.'")';
}
foreach($valuesToDisable as $picklistValue) {
$valueDetail = $pickListValueDetails[$picklistValue];
if(empty($valueDetail)){
$valueDetail = $pickListValueDetails[Vtiger_Util_Helper::toSafeHTML($picklistValue)];
}
$pickListValueId = $valueDetail['picklistvalueid'];
$picklistId = $valueDetail['picklistid'];
$deleteValueList[] = ' ( roleid = "'.$roleId.'" AND '.'picklistvalueid = "'.$pickListValueId.'") ';
}
}
$query = 'INSERT IGNORE INTO vtiger_role2picklist (roleid,picklistvalueid,picklistid) VALUES '.implode(',',$insertValueList);
$result = $db->pquery($query,array());
$deleteQuery = 'DELETE FROM vtiger_role2picklist WHERE '.implode(' OR ',$deleteValueList);
$result = $db->pquery($deleteQuery,array());
//retaining to older value
$db->dieOnError = $dieOnErrorOldValue;
}
public function updateSequence($pickListFieldName , $picklistValues, $rolesList = false) {
$db = PearDatabase::getInstance();
$primaryKey = Vtiger_Util_Helper::getPickListId($pickListFieldName);
$query = 'UPDATE '.$this->getPickListTableName($pickListFieldName).' SET sortorderid = CASE ';
foreach($picklistValues as $values => $sequence) {
$query .= ' WHEN '.$primaryKey.'="'.$values.'" THEN "'.$sequence.'"';
}
$query .= ' END';
$db->pquery($query, array());
Vtiger_Cache::flushPicklistCache($pickListFieldName, $rolesList);
}
public static function getPicklistSupportedModules() {
$db = PearDatabase::getInstance();
$unsupportedModuleIds = array(getTabId('Users'), getTabId('Emails'));
$query = "SELECT distinct vtiger_tab.tablabel, vtiger_tab.name as tabname
FROM vtiger_tab
inner join vtiger_field on vtiger_tab.tabid=vtiger_field.tabid
WHERE uitype IN (15,33,16,114) and vtiger_field.tabid NOT IN (". implode(',', $unsupportedModuleIds) .") and vtiger_tab.presence != 1 and vtiger_field.presence in (0,2)
ORDER BY vtiger_tab.tabid ASC";
$result = $db->pquery($query, array());
$modulesModelsList = array();
while($row = $db->fetch_array($result)){
$moduleLabel = $row['tablabel'];
$moduleName = $row['tabname'];
$instance = new self();
$instance->name = $moduleName;
$instance->label = $moduleLabel;
$modulesModelsList[] = $instance;
}
return $modulesModelsList;
}
/**
* Static Function to get the instance of Vtiger Module Model for the given id or name
* @param mixed id or name of the module
*/
public static function getInstance($value) {
//TODO : add caching
$instance = false;
$moduleObject = parent::getInstance($value);
if($moduleObject) {
$instance = self::getInstanceFromModuleObject($moduleObject);
}
return $instance;
}
/**
* Function to get the instance of Vtiger Module Model from a given Vtiger_Module object
* @param Vtiger_Module $moduleObj
* @return Vtiger_Module_Model instance
*/
public static function getInstanceFromModuleObject(Vtiger_Module $moduleObj){
$objectProperties = get_object_vars($moduleObj);
$moduleModel = new self();
foreach($objectProperties as $properName=>$propertyValue){
$moduleModel->$properName = $propertyValue;
}
return $moduleModel;
}
public function handleLabels($moduleName, $newValues, $oldValues, $mode) {
if (!is_array($newValues)) {
$newValues = array($newValues);
}
if (!is_array($oldValues)) {
$oldValues = array($oldValues);
}
$allLang = Vtiger_Language_Handler::getAllLanguages();
foreach ($allLang as $langKey => $langName) {
$langDir = 'languages/' . $langKey . '/custom/';
if (!file_exists($langDir)) {
mkdir($langDir);
mkdir($langDir . '/Settings');
}
$fileName = $langDir . $moduleName . '.php';
if (file_exists($fileName)) {
require $fileName;
}
if (!isset($languageStrings)) {
$languageStrings = array();
}
//If mode is delete and $languageStrings is empty then no need of creating file.
if ($mode == 'delete' && empty($languageStrings)) {
continue;
}
if (!empty($newValues)) {
foreach ($newValues as $newValue) {
$newValue = decode_html($newValue);
if (!isset($languageStrings[$newValue])) {
$languageStrings[$newValue] = $newValue;
}
}
}
if ($mode == 'rename' || $mode == 'delete' && !empty($oldValues)) {
foreach ($oldValues as $oldValue) {
$oldValue = decode_html($oldValue);
unset($languageStrings[$oldValue]);
}
}
//Write file
$fp = fopen($fileName, "w");
if ($languageStrings) {
fwrite($fp, "<?php\n\$languageStrings = array(\n");
foreach ($languageStrings as $key => $value) {
$key = addslashes($key);
$value = addslashes($value);
fwrite($fp, "'$key'\t=>\t'$value',\n");
}
fwrite($fp, ");");
}
if ($jsLanguageStrings) {
fwrite($fp, "\n\$jsLanguageStrings = array(\n");
foreach ($jsLanguageStrings as $key => $value) {
$key = addslashes($key);
$value = addslashes($value);
fwrite($fp, "'$key'\t=>\t'$value',\n");
}
fwrite($fp, ");");
}
fclose($fp);
unset($languageStrings);
unset($jsLanguageStrings);
}
}
function getActualPicklistValues($valueToDelete, $pickListFieldName) {
$db = PearDatabase::getInstance();
if (!is_array($valueToDelete)) {
$valueToDeleteID = array($valueToDelete);
} else {
$valueToDeleteID = $valueToDelete;
}
$primaryKey = Vtiger_Util_Helper::getPickListId($pickListFieldName);
$pickListDeleteValue = array();
$getPickListValueQuery = "SELECT $pickListFieldName FROM " . $this->getPickListTableName($pickListFieldName) . " WHERE $primaryKey IN (" . generateQuestionMarks($valueToDeleteID) . ")";
$result = $db->pquery($getPickListValueQuery, array($valueToDeleteID));
$num_rows = $db->num_rows($result);
for ($i = 0; $i < $num_rows; $i++) {
$pickListDeleteValue[] = decode_html($db->query_result($result, $i, $pickListFieldName));
}
return $pickListDeleteValue;
}
/**
* Function to get the picklist value color
* @param <string> $pickListFieldName
* @param <integer> $pickListId
* @return <string> $color
*/
public static function getPicklistColor($pickListFieldName, $pickListId) {
$db = PearDatabase::getInstance();
$primaryKey = Vtiger_Util_Helper::getPickListId($pickListFieldName);
$colums = $db->getColumnNames("vtiger_$pickListFieldName");
if(in_array('color',$colums)) {
$query = 'SELECT color FROM vtiger_'.$pickListFieldName . ' WHERE '.$primaryKey.' = ?';
$result = $db->pquery($query, array($pickListId));
if($db->num_rows($result) > 0){
$color = $db->query_result($result, 0, 'color');
}
}
return $color;
}
/**
* Function to get the accesable picklist values for current user
* @param <string> $name - picklist field name
* @return <array> $picklistValues
*/
public static function getAccessiblePicklistValues($name) {
$currentUser = Users_Record_Model::getCurrentUserModel();
$db = PearDatabase::getInstance();
$picklistValues = array();
if (vtws_isRoleBasedPicklist($name)) {
$picklistValues = getAssignedPicklistValues($name, $currentUser->roleid, $db);
}
return $picklistValues;
}
/**
* Function to get the picklist color map of all the picklist values for a field
* @param <string> $fieldName - Picklist field name
* @param <boolean> $key - to change key of the array
* @return <array> $pickListColorMap
*/
public static function getPicklistColorMap($fieldName, $key = false) {
$db = PearDatabase::getInstance();
$primaryKey = Vtiger_Util_Helper::getPickListId($fieldName);
$colums = $db->getColumnNames("vtiger_$fieldName");
if(in_array('color',$colums)) {
$query = 'SELECT '.$primaryKey.',color,'.$fieldName.' FROM vtiger_'.$fieldName;
$result = $db->pquery($query);
$pickListColorMap = array();
$isRoleBasedPicklist = vtws_isRoleBasedPicklist($fieldName);
$accessablePicklistValues = self::getAccessiblePicklistValues($fieldName);
if($db->num_rows($result) > 0){
for($i=0; $i<$db->num_rows($result); $i++) {
$pickListId = $db->query_result($result, $i, $primaryKey);
$color = $db->query_result($result, $i, 'color');
$picklistNameRaw = $db->query_result($result, $i, $fieldName);
$picklistName = decode_html($picklistNameRaw);
// show color only for accesable picklist values
if($isRoleBasedPicklist && !isset($accessablePicklistValues[$picklistNameRaw])) {
$color = '';
}
if(!empty($color)) {
if($key) {
$pickListColorMap[$picklistName] = $color;
} else {
$pickListColorMap[$pickListId] = $color;
}
}
}
}
}
return $pickListColorMap;
}
/**
* Function to get the picklist color for a picklist value
* @param <string> $fieldName - picklist field name
* @param <string> $fieldValue - picklist value
* @return <string> $color
*/
public static function getPicklistColorByValue($fieldName, $fieldValue) {
$db = PearDatabase::getInstance();
$tableName = "vtiger_$fieldName";
if(Vtiger_Utils::CheckTable($tableName)) {
$colums = $db->getColumnNames($tableName);
$fieldValue = decode_html($fieldValue);
if(in_array('color',$colums)) {
$query = 'SELECT color FROM '.$tableName.' WHERE '.$fieldName.' = ?';
$result = $db->pquery($query, array($fieldValue));
if($db->num_rows($result) > 0){
$color = $db->query_result($result, 0, 'color');
}
}
}
return $color;
}
public static function getTextColor($hexcolor) {
$hexcolor = str_replace('#', '', $hexcolor);
$r = intval(substr($hexcolor,0,2), 16);
$g = intval(substr($hexcolor,2,2), 16);
$b = intval(substr($hexcolor,4,2), 16);
$yiq = (($r*299)+($g*587)+($b*114))/1000;
return ($yiq >= 128) ? 'black' : 'white';
}
public function updatePicklistColor($pickListFieldName, $id, $color = '') {
$db = PearDatabase::getInstance();
//As older look utf8 characters are pushed as html-entities,and in new utf8 characters are pushed to database
//so we are checking for both the values
$primaryKey = Vtiger_Util_Helper::getPickListId($pickListFieldName);
if(!empty($color)) {
$query = 'UPDATE ' . $this->getPickListTableName($pickListFieldName) . ' SET color = ? WHERE '.$primaryKey.' = ?';
$db->pquery($query, array($color, $id));
}
return true;
}
}