yii2无限分类实例-非数据库递归

来源:互联网 发布:更换淘宝店铺负责人 编辑:程序博客网 时间:2024/06/07 03:49


基于yii2.0给大家做一个无限分类的实例,废话不多说:

    1、设计数据表,很简单就三个字段

        CREATE TABLE `category` (          `id` int(11) unsigned NOT NULL AUTO_INCREMENT,          `cate_name` varchar(255) DEFAULT NULL,          `pid` int(11) unsigned NOT NULL DEFAULT '0',          PRIMARY KEY (`id`)        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

   2、model层代码如下:

<?phpnamespace common\models;use Yii;use yii\helpers\ArrayHelper;/** * This is the model class for table "{{%category}}". * * @property string $id * @property string $cate_name * @property string $pid */class Category extends \yii\db\ActiveRecord{    /**     * @inheritdoc     */    public static function tableName()    {        return '{{%category}}';    }    /**     * @inheritdoc     */    public function rules()    {        return [            [['pid'], 'integer'],            [['cate_name'], 'string', 'max' => 255],        ];    }    /**     * @inheritdoc     */    public function attributeLabels()    {        return [            'id' => 'ID',            'cate_name' => '分类名称',            'pid' => '父级分类',        ];    }    /**     * 获取所有的分类     */    public function getCategories()    {        $data = self::find()->all();        $data = ArrayHelper::toArray($data);        return $data;    }    /**     *遍历出各个子类 获得树状结构的数组     */    public static function getTree($data,$pid = 0,$lev = 1)    {        $tree = [];        foreach($data as $value){            if($value['pid'] == $pid){                $value['cate_name'] = str_repeat('|___',$lev).$value['cate_name'];                $tree[] = $value;                $tree = array_merge($tree,self::getTree($data,$value['id'],$lev+1));            }        }        return $tree;    }    /**     * 得到相应  id  对应的  分类名  数组     */    public function getOptions()    {        $data = $this->getCategories();        $tree = $this->getTree($data);        $list = ['添加顶级分类'];        foreach($tree as $value){            $list[$value['id']] = $value['cate_name'];        }        return $list;    }}

    3、控制器层声明这样一个方法

   public function actionCreate()    {        $model = new Category();        $list = $model->getOptions();        if ($model->load(Yii::$app->request->post()) && $model->save()) {            return $this->redirect(['view', 'id' => $model->id]);        } else {            return $this->render('create', [                'model' => $model,                'list' => $list            ]);        }    }

    4、视图层代码

<?phpuse yii\helpers\Html;use yii\widgets\ActiveForm;/* @var $this yii\web\View *//* @var $model common\models\Category *//* @var $form yii\widgets\ActiveForm */?><div class="category-form">    <?php $form = ActiveForm::begin(); ?>    <?= $form->field($model, 'cate_name')->textInput(['maxlength' => true]) ?>    <?= $form->field($model,'pid')->dropDownList($list)?>    <div class="form-group">        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>    </div>    <?php ActiveForm::end(); ?></div>

   5、效果图如下




0 0
原创粉丝点击