protected function renderAvailableAttributesContent() { $modelClassName = $this->model->getModelClassName(); $model = new $modelClassName(false); $adapter = new ModelNumberOrCurrencyAttributesAdapter($model); $attributeData = $adapter->getAttributes(); $title = Zurmo::t('DesignerModule', 'Create a math formula that is calculated from other fields.' . ' Use the Formula Name from the Available Fields grid below to create your formula.' . ' Example formula (field1 * field2) / field3'); $spanContent = '<span id="formula-tooltip" class="tooltip" title="' . $title . '">?</span>'; if (count($attributeData) > 0) { $content = '<strong>' . Zurmo::t('DesignerModule', 'Available Fields:') . '</strong> ' . $spanContent; $content .= '<table id="available-fields">'; $content .= '<tr><th>' . Zurmo::t('DesignerModule', 'Field Name') . '</th>'; $content .= '<th>' . Zurmo::t('DesignerModule', 'Formula Name') . '</th></tr>'; foreach ($attributeData as $attributeName => $data) { $content .= '<tr><td>' . $data['attributeLabel'] . '</td><td>' . $attributeName . '</td></tr>'; } $content .= '</table>'; } else { $content = '<span class="error">' . Zurmo::t('DesignerModule', 'There are no fields in this module to be used in a formula.'); $content .= '</span>'; } $qtip = new ZurmoTip(); $qtip->addQTip("#formula-tooltip"); return $content; }
public function testGetAttributes() { $adapter = new ModelNumberOrCurrencyAttributesAdapter(new TestOperatorTypeModel()); $attributes = $adapter->getAttributes(); $this->assertEquals(2, count($attributes)); $this->assertTrue(isset($attributes['integerStandard'])); $this->assertTrue(isset($attributes['floatStandard'])); $adapter = new ModelNumberOrCurrencyAttributesAdapter(new CurrencyValueTestItem()); $attributes = $adapter->getAttributes(); $compareData = array(); $this->assertEquals(1, count($attributes)); $this->assertTrue(isset($attributes['amount'])); }
protected function renderAvailableAttributesContent() { $modelClassName = $this->model->getModelClassName(); $model = new $modelClassName(false); $adapter = new ModelNumberOrCurrencyAttributesAdapter($model); $attributeDataNumerOrCurrency = $adapter->getAttributes(); $title = Zurmo::t('DesignerModule', 'Create a formula that is evaluated based on other fields. ' . 'The formula can be a math expression calculated from number ' . 'fields, for example, you can use an expression like ' . '(field1 * field2) / field3. The formula can also include an if ' . 'statement, use the IF(condition;trueValue;falseValue) syntax. ' . 'Within the condition and values you can use strings, string fields, ' . 'number fields or math expressions. Strings should be surrounded by ' . '\'. In the condition you can ' . 'use the operators <, >, ==, !=, <= and >=. An example of an if ' . 'statement is IF(field1 == field4;field2/365;0)'); // Not Coding Standard $spanContent = '<span id="formula-tooltip" class="tooltip" title="' . $title . '">?</span>'; $content = null; $adapter = new ModelAttributesAdapter($model); $attributeData = $adapter->getAttributes(); if (count($attributeData) > 0) { $content .= '<strong>' . Zurmo::t('DesignerModule', 'Available Fields For Formula:') . '</strong> '; $content .= $spanContent; $content .= '<table id="available-fields">'; $content .= '<tr><th>' . Zurmo::t('DesignerModule', 'Field Name') . '</th>'; $content .= '<th>' . Zurmo::t('DesignerModule', 'Formula Name') . '</th>'; $content .= '<th>' . Zurmo::t('DesignerModule', 'Can be used in math expression') . '</th></tr>'; foreach ($attributeData as $attributeName => $data) { $content .= '<tr><td>' . $data['attributeLabel'] . '</td>'; $content .= '<td>' . $attributeName . '</td>'; $canBeUsedInMathExpression = Zurmo::t('DesignerModule', 'No'); if (in_array($attributeName, array_keys($attributeDataNumerOrCurrency))) { $canBeUsedInMathExpression = Zurmo::t('DesignerModule', 'Yes'); } $content .= '<td>' . $canBeUsedInMathExpression . '</td></tr>'; } $content .= '</table>'; } else { $content .= '<span class="error">' . Zurmo::t('DesignerModule', 'There are no fields in this module to be used in an expression.'); $content .= '</span>'; } $qtip = new ZurmoTip(); $qtip->addQTip("#formula-tooltip"); return ZurmoHtml::tag('div', array('class' => 'field-instructions'), $content); }
protected static function isExpressionValid($expression, $modelClassName) { assert('is_string($expression)'); if (strpos($expression, '"') !== false) { return false; } $expression = trim($expression); if (static::isString($expression)) { return true; } if (static::isAttribute($expression, $modelClassName)) { return true; } $model = new $modelClassName(false); $adapter = new ModelNumberOrCurrencyAttributesAdapter($model); $patterns = array(); foreach ($adapter->getAttributes() as $attribute => $data) { $patterns[] = '/\\b' . $attribute . '\\b/'; } $expression = preg_replace($patterns, '1', $expression); if ($expression != strtoupper($expression) || $expression != strtolower($expression)) { return false; } if (static::mathEval($expression) === false) { return false; } return true; }
/** * Given a formula string and a model, determine if the formula is correctly formed and is using valid * attributes from the given model. * @param $formula * @param ModelNumberOrCurrencyAttributesAdapter $adapter * @return bool */ public static function isFormulaValid($formula, ModelNumberOrCurrencyAttributesAdapter $adapter) { assert('is_string($formula)'); foreach ($adapter->getAttributes() as $attribute => $data) { $formula = str_replace($attribute, 1, $formula); } if ($formula != strtoupper($formula) || $formula != strtolower($formula)) { return false; } if (static::mathEval($formula) === false) { return false; } return true; }