Esempio n. 1
0
 /**
  * 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();
         }
     }
 }
Esempio n. 2
0
 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));
 }
Esempio n. 3
0
 /**
  * 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();