/** * Save associated criterion objects for a dynamic list * * Takes data from the dynamic list criteria designer form and turns them * into {@link X2ListCriterion} records. */ public function processCriteria() { X2ListCriterion::model()->deleteAllByAttributes(array('listId' => $this->id)); // delete old criteria foreach (array('attribute', 'comparison', 'value') as $property) { // My lazy refactor: bring properties into the current scope as // temporary variables with their names pluralized ${"{$property}s"} = $this->criteriaInput[$property]; } $comparisonList = self::getComparisonList(); $contactModel = Contacts::model(); $fields = $contactModel->getFields(true); for ($i = 0; $i < count($attributes); $i++) { // create new criteria if ((array_key_exists($attributes[$i], $contactModel->attributeLabels()) || $attributes[$i] == 'tags') && array_key_exists($comparisons[$i], $comparisonList)) { $fieldRef = isset($fields[$attributes[$i]]) ? $fields[$attributes[$i]] : null; if ($fieldRef instanceof Fields && $fieldRef->type == 'link') { $nameList = explode(',', $values[$i]); $namesParams = AuxLib::bindArray($nameList); $namesIn = AuxLib::arrToStrList(array_keys($namesParams)); $lookupModel = X2Model::model(ucfirst($fieldRef->linkType)); $lookupModels = $lookupModel->findAllBySql('SELECT * FROM `' . $lookupModel->tableName() . '` ' . 'WHERE `name` IN ' . $namesIn, $namesParams); if (!empty($lookupModels)) { $values[$i] = implode(',', array_map(function ($m) { return $m->nameId; }, $lookupModels)); //$lookup->nameId; } } $criterion = new X2ListCriterion(); $criterion->listId = $this->id; $criterion->type = 'attribute'; $criterion->attribute = $attributes[$i]; $criterion->comparison = $comparisons[$i]; $criterion->value = $values[$i]; $criterion->save(); } } }
public function actionUpdateList($id) { $list = X2List::model()->findByPk($id); if (!isset($list)) { throw new CHttpException(400, Yii::t('app', 'This list cannot be found.')); } if (!$this->checkPermissions($list, 'edit')) { throw new CHttpException(403, Yii::t('app', 'You do not have permission to modify this list.')); } $contactModel = new Contacts(); $comparisonList = X2List::getComparisonList(); $fields = $contactModel->getFields(true); if ($list->type == 'dynamic') { $criteriaModels = X2ListCriterion::model()->findAllByAttributes(array('listId' => $list->id), new CDbCriteria(array('order' => 'id ASC'))); if (isset($_POST['X2List'], $_POST['X2List']['attribute'], $_POST['X2List']['comparison'], $_POST['X2List']['value'])) { $attributes =& $_POST['X2List']['attribute']; $comparisons =& $_POST['X2List']['comparison']; $values =& $_POST['X2List']['value']; if (count($attributes) > 0 && count($attributes) == count($comparisons) && count($comparisons) == count($values)) { $list->attributes = $_POST['X2List']; $list->modelName = 'Contacts'; $list->lastUpdated = time(); if ($list->save()) { $this->redirect(array('/contacts/contacts/list', 'id' => $list->id)); } } } } else { //static or campaign lists if (isset($_POST['X2List'])) { $list->attributes = $_POST['X2List']; $list->modelName = 'Contacts'; $list->lastUpdated = time(); $list->save(); $this->redirect(array('/contacts/contacts/list', 'id' => $list->id)); } } if (empty($criteriaModels)) { $default = new X2ListCriterion(); $default->value = ''; $default->attribute = ''; $default->comparison = 'contains'; $criteriaModels[] = $default; } else { if ($list->type = 'dynamic') { foreach ($criteriaModels as $criM) { if (isset($fields[$criM->attribute])) { if ($fields[$criM->attribute]->type == 'link') { $criM->value = implode(',', array_map(function ($c) { list($name, $id) = Fields::nameAndId($c); return $name; }, explode(',', $criM->value))); } } } } } $this->render('updateList', array('model' => $list, 'criteriaModels' => $criteriaModels, 'users' => User::getNames(), 'comparisonList' => $comparisonList, 'listTypes' => array('dynamic' => Yii::t('contacts', 'Dynamic'), 'static' => Yii::t('contacts', 'Static')), 'itemModel' => $contactModel)); }
/** * Returns a CDbCriteria to retrieve all models in the list */ public function dbCriteria() { if ($this->type == 'dynamic') { $logicMode = $this->logicType; $search = new CDbCriteria(array()); $criteria = X2ListCriterion::model()->findAllByAttributes(array('listId' => $this->id, 'type' => 'attribute')); foreach ($criteria as $criterion) { //for each field in a model, make sure the criterion is in the same format foreach (CActiveRecord::model($this->modelName)->fields as $field) { if ($field->fieldName == $criterion->attribute) { switch ($field->type) { case 'date': if (!ctype_digit($criterion->value)) { $criterion->value = strtotime($criterion->value); } break; case 'link': if (!ctype_digit($criterion->value)) { $criterion->value = Fields::getLinkId($field->linkType, $criterion->value); } break; case 'boolean': $criterion->value = in_array(strtolower($criterion->value), array('1', 'yes', 'y', 't', 'true')) ? 1 : 0; break; } break; } } if ($criterion->attribute == 'tags') { $tags = explode(',', preg_replace('/\\s?,\\s?/', ',', trim($criterion->value))); //remove any spaces around commas, then explode to array for ($i = 0; $i < count($tags); $i++) { if (empty($tags[$i])) { unset($tags[$i]); $i--; continue; } else { if ($tags[$i][0] != '#') { $tags[$i] = '#' . $tags[$i]; } $tags[$i] = 'x2_tags.tag = "' . $tags[$i] . '"'; } } $tagConditions = implode(' OR ', $tags); $search->distinct = true; $search->join = 'JOIN x2_tags ON (x2_tags.itemId=t.id AND x2_tags.type="' . $this->modelName . '" AND (' . $tagConditions . '))'; } else { switch ($criterion->comparison) { case '=': $search->compare($criterion->attribute, $criterion->value, false, $logicMode); break; case '>': $search->compare($criterion->attribute, '>=' . $criterion->value, true, $logicMode); break; case '<': $search->compare($criterion->attribute, '<=' . $criterion->value, true, $logicMode); break; case '<>': // must test for != OR is null, because both mysql and yii are stupid $search->addCondition('(' . $criterion->attribute . ' IS NULL OR ' . $criterion->attribute . '!=' . CDbCriteria::PARAM_PREFIX . CDbCriteria::$paramCount . ')', $logicMode); $search->params[CDbCriteria::PARAM_PREFIX . CDbCriteria::$paramCount++] = $criterion->value; break; case 'notEmpty': $search->addCondition($criterion->attribute . ' IS NOT NULL AND ' . $criterion->attribute . '!=""', $logicMode); break; case 'empty': $search->addCondition('(' . $criterion->attribute . '="" OR ' . $criterion->attribute . ' IS NULL)', $logicMode); break; case 'list': $search->addInCondition($criterion->attribute, explode(',', $criterion->value), $logicMode); break; case 'contains': default: $search->compare($criterion->attribute, $criterion->value, true, $logicMode); } } } } else { $search = new CDbCriteria(array('join' => 'JOIN x2_list_items ON t.id = x2_list_items.contactId', 'condition' => 'x2_list_items.listId=' . $this->id . ' AND (t.visibility=1 OR t.assignedTo="' . Yii::app()->user->getName() . '")')); } return $search; }
public function actionUpdateList($id) { $list = X2List::model()->findByPk($id); if (!isset($list)) { throw new CHttpException(400, Yii::t('app', 'This list cannot be found.')); } if (!$this->editPermissions($list)) { throw new CHttpException(403, Yii::t('app', 'You do not have permission to modify this list.')); } $contactModel = new Contacts(); $comparisonList = array('=' => '=', '>' => '>', '<' => '<', '<>' => '<>', 'contains' => Yii::t('contacts', 'contains'), 'empty' => Yii::t('empty', 'empty'), 'notEmpty' => Yii::t('contacts', 'not empty'), 'list' => Yii::t('contacts', 'in list')); if ($list->type == 'dynamic') { $criteriaModels = X2ListCriterion::model()->findAllByAttributes(array('listId' => $list->id), new CDbCriteria(array('order' => 'id ASC'))); } if (isset($_POST['X2List'], $_POST['X2List']['attribute'], $_POST['X2List']['comparison'], $_POST['X2List']['value'])) { $attributes =& $_POST['X2List']['attribute']; $comparisons =& $_POST['X2List']['comparison']; $values =& $_POST['X2List']['value']; if (count($attributes) > 0 && count($attributes) == count($comparisons) && count($comparisons) == count($values)) { $list->attributes = $_POST['X2List']; $list->modelName = 'Contacts'; $list->lastUpdated = time(); if ($list->save()) { X2ListCriterion::model()->deleteAllByAttributes(array('listId' => $list->id)); // delete old criteria for ($i = 0; $i < count($attributes); $i++) { // create new criteria if ((array_key_exists($attributes[$i], $contactModel->attributeLabels()) || $attributes[$i] == 'tags') && array_key_exists($comparisons[$i], $comparisonList)) { //&& $values[$i] != '' $criterion = new X2ListCriterion(); $criterion->listId = $list->id; $criterion->type = 'attribute'; $criterion->attribute = $attributes[$i]; $criterion->comparison = $comparisons[$i]; $criterion->value = $values[$i]; $criterion->save(); } } $this->redirect(array('/contacts/list/' . $list->id)); } } } if (empty($criteriaModels)) { $default = new X2ListCriterion(); $default->value = ''; $default->attribute = ''; $default->comparison = 'contains'; $criteriaModels[] = $default; } $this->render('updateList', array('model' => $list, 'criteriaModels' => $criteriaModels, 'users' => User::getNames(), 'comparisonList' => $comparisonList, 'listTypes' => array('dynamic' => Yii::t('contacts', 'Dynamic'), 'static' => Yii::t('contacts', 'Static')), 'itemModel' => $contactModel)); }
Yii::import('application.components.util.*'); Yii::import('application.components.permissions.*'); Yii::import('application.modules.media.models.Media'); Yii::import('application.modules.groups.models.Groups'); Yii::import('application.extensions.gallerymanager.models.*'); $arr = array(); $modulePath = implode(DIRECTORY_SEPARATOR, array(Yii::app()->basePath, 'modules')); foreach (scandir($modulePath) as $module) { $regScript = implode(DIRECTORY_SEPARATOR, array($modulePath, $module, 'register.php')); if (file_exists($regScript)) { $arr[$module] = ucfirst($module); Yii::import("application.modules.{$module}.models.*"); } } /** * @file 1395878402-list-criterion-update.php * * Update and fix dynamic list criterion. */ $listCriterionUpdate = function () { // Step 1: get all link-type fields of the contacts model: $attributes = Yii::app()->db->createCommand()->select('fieldName,linkType')->from(Fields::model()->tableName())->where("modelName='Contacts' AND type='link'")->queryAll(); foreach ($attributes as $attribute) { if ($model = X2Model::model($attribute['linkType'])) { $params[':attr'] = $attribute['fieldName']; $sql = 'UPDATE ' . X2ListCriterion::model()->tableName() . ' lc INNER JOIN ' . $model->tableName() . ' c' . ' ON lc.value=c.id SET lc.value=c.nameId WHERE lc.type="attribute" AND lc.attribute=:attr'; Yii::app()->db->createCommand($sql)->execute($params); } } }; $listCriterionUpdate();