0

我通常将itens状态保存在代码中(让我们保存我有表格:学生,为了保存学生状态,我使用字段(students.status))。

但是,每次我列出用户时,我都不会显示状态代码(例如 1 或 0)。我需要显示:已注册或已取消。

我可以在列出时简单地检查它,但是,假设我需要做很多次。有什么可以帮助我做到的吗?将节省大量工作,我将列出用户的每一页,甚至当我添加/编辑他或这些项目应附带的下拉菜单时。

我已经检查了模型关联,但是如果我有另一个保存了用户状态的表(我真的不想创建它),我找到的解决方案就可以工作。

谢谢。

4

4 回答 4

1

如果可以注册或取消状态,那么您可以在表模式中使用枚举数据类型。

您可以从枚举数据类型中获取状态列表,以便像这样填充下拉列表。

$status = $this->Model->getEnumValues('status');

在此之前,您需要在 appModel.php 中添加以下代码

function getEnumValues($columnName=null)
{
    if ($columnName==null) { return array(); } //no field specified

    //Get the name of the table
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $tableName = $db->fullTableName($this, false);

    //Get the values for the specified column (database and version specific, needs testing)
    $result = $this->query("SHOW COLUMNS FROM {$tableName} LIKE '{$columnName}'");

    //figure out where in the result our Types are (this varies between mysql versions)
    $types = null;
    if     ( isset( $result[0]['COLUMNS']['Type'] ) ) { $types = $result[0]['COLUMNS']['Type']; } //MySQL 5
    elseif ( isset( $result[0][0]['Type'] ) )         { $types = $result[0][0]['Type'];         } //MySQL 4
    else   { return array(); } //types return not accounted for

    //Get the values
    $values = explode("','", preg_replace("/(enum)\('(.+?)'\)/","\\2", $types) );

    //explode doesn't do assoc arrays, but cake needs an assoc to assign values
    $assoc_values = array();
    foreach ( $values as $value ) {
        //leave the call to humanize if you want it to look pretty
        $assoc_values[$value] = Inflector::humanize($value);
    }
    return $assoc_values;
}

我希望这对你有用。谢谢

于 2013-10-16T00:25:53.917 回答
1

这描述了如何做你想做的事:http: //www.dereuromark.de/2010/06/24/static-enums-or-semihardcoded-attributes/

于 2013-10-15T23:35:11.290 回答
0

我最终为此创建了一个 Helper 函数(不确定是否是最好的方法,它工作正常)

我的助手.php

class MyHelper extends AppHelper {

        public $helpers = array();

        public $list = array(0 => 'Cancelled', 1 => 'Registered');
        public function __construct(View $View, $settings = array()) {
                parent::__construct($View, $settings);
        }

        public function beforeRender($viewFile) {

        }

        public function afterRender($viewFile) {

        }

        public function beforeLayout($viewLayout) {

        }

        public function afterLayout($viewLayout) {

        }

        public function translate($id){
                return $this->list[$id];
        }

}

在 view.ctp 中,我没有显示项目 ID,而是调用 translate 函数,返回正确的名称。要创建下拉菜单,只需在选择选项中调用数组列表。

<?php
echo "User Status: " . $this->My->translate($this->User->status);

echo $this->Form->input('tipo', array('type' => 'select', 'options' => $this->My->list));
?>

我想我也应该使用枚举,并且使用指定的函数,我也会成功。感谢您的帮助。

于 2013-10-16T20:33:37.897 回答
0

您可能想查看模型关联。在您的情况下,我将有一个students表和一个student_statuses包含 ID 和状态名称的表。然后,在查找学生时,您还可以包括他们相应的StudentStatus行。

这种关系如下所示:

<?php
class Student extends AppModel {
    public $belongsTo = array('StudentStatus');
}

<?php
class StudentStatus extends AppModel {
    public $hasMany = array('Student');
}

那么在找学生的时候……</p>

<?php
class StudentsController extends AppController {
    public function index() {
        $this->set('students', $this->Student->find('all'));
    }
}

你会得到这样的结果:

Array
(
    [0] => Array
        (
            [Student] => Array
                (
                    [id] => 1
                    [name] => Martin Bean
                    [student_status_id] => 1
                    [created] => 2013-09-29 21:12:42
                    [modified] => 2013-09-29 21:12:42
                )

            [StudentStatus] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => Approved
                            [created] => 2013-09-23 18:26:06
                            [modified] => 2013-10-01 18:53:16
                        )

                )

        )

)

因此,您可以在视图中打印学生的状态,如下所示:

<?php foreach ($students as $student): ?>
<p>
  <?php echo h($student['Student']['name']); ?>
  (<?php echo h($student['StudentStatus']['name']); ?>)
</p>
<?php endforeach; ?>

您说您不想为状态创建表,但您遇到问题的原因是因为它是关系数据库的工作方式以及约定。这样做可以省去很多麻烦,而且如果您决定将来需要添加其他状态,它也是可扩展的。你可能认为你现在不会,但相信我:有一天你会的。

于 2013-10-17T12:40:55.960 回答