【TP5】根據數據庫字段註釋使用同一模板進行增刪查

author:咔咔php

wechat:fangkangfkhtml

 

有沒有在添加跟修改的時候很煩,須要寫不少頁面,修改還須要追加數據,很煩,很煩mysql

 

下來就解決這樣的問題,全部模塊的添加,修改,查看,都使用同一個模板

首先從數據庫設計開始sql

註釋解釋:數據庫

域名地址:這個在添加或者修改時在lable標籤裏邊寫的ubuntu

add=text:這個最終會以這個判斷這個字段是什麼類型,而且顯示不一樣的標籤markdown

這裏放一個寫的比較全的 數據結構

 

 

下來我們先寫一個獲取數據庫註釋的方法app

第一個方法是獲取數據庫註釋,第二個方法是對註釋進行業務需求的組裝dom

/**
     * author:咔咔
     *
     * 獲取字段註釋類型
     * @param $table  表名
     * @param bool $includePrimary
     * @return array
     */
    public function getFileCommon($table, $includePrimary = false)
    {
        $prefix = config('database.prefix');
        $data = Db::query('SHOW FULL COLUMNS FROM '.$prefix.$table);

        foreach($data as $row){
            if ($row['Comment']) {
                $row = array_merge($row, $this->_parse_comments($row['Comment']));
            }else {
                $row['DisplayName'] = $row['Field'];
            }

            $type = $row['Type'];
            if (preg_match('/^varchar/i', $type)) {
                $type = str_replace('varchar', '字符串', $type);
            } else if (preg_match('/^int/i', $type)) {
                $type = str_replace('int', '數字', $type);
            } else if (preg_match('/^tinyint/i', $type)) {
                $type = str_replace('tinyint', '數字', $type);
                preg_match('/\((\d+)\)/i', $type, $matches);
                $length = $matches[1];
            } else if (preg_match('/^text/i', $type)) {
                $type = str_replace('text', '文本', $type);
            } else if (preg_match('/^datetime/i', $type)) {
                $type = str_replace('datetime', '時間:YYY-MM-DD HH:II:SS', $type);
            }
            $row['DisplayType'] = $type;

            if ($includePrimary) {
                $fields[] = $row;
            } else {
                if ($row['Key'] != 'PRI') {
                    $fields[] = $row;
                }
            }
        }

        // 整理:以name爲key
        $new_fields = array();
        foreach ($fields as $value) {
            $name = $value['Field'];
            $new_fields[$name] = $value;
        }
        return $new_fields;
    }


    /**
     * author:咔咔
     *
     * 提取字段註釋跟顯示類型
     * @param $comments  註釋
     * @return array
     */
    protected function _parse_comments($comments)
    {
        $parts = explode("|", $comments);

        $comment = $parts[0];
        $params_string = $parts[1];

        if ($params_string) {
            parse_str($params_string, $params);
            foreach ($params as $key => $value) {
                if ($value == 'true') {
                    $value = true;
                }

                if ($value == 'false') {
                    $value = false;
                }

                $params[$key] = $value;
            }
        } else {
            $params = array();
        }

        $result = array('DisplayName' => $comment, 'Params' => $params);
        return $result;
    }

 

怎麼使用?

個人domain控制器繼承了base控制器,上面倆個方法在base控制器

 

咱們來看看數據

 

這個時候是否是納悶了,怎麼就一個數據,那個ID哪去了。咱們能夠看看第一個方法,下圖我框出來的這塊

 

 

別納悶PRi是mysql約束主鍵的意思,因此只有一個數據 

 

下來我們準備寫一下模板

最終添加模板就這樣

咱們還須要寫公共模板,這裏我就粘貼已經寫好的一份

{include file="../../../application/admin/view/public/head" /}

<?php foreach ($fields as $info):?>

<?php
            $type = $info['Params']['add'];
            $validateClass = "validate[required]";
        ?>

<?php if ($info['Params']['add'] == 'ignore'): ?>
<?php continue; ?>
<?php endif; ?>

<?php if ($info['Params']['add'] == 'hidden'): ?>
<input name="<?php echo $info['Field'];?>" type="hidden" value="<?php echo htmlspecialchars($info['Value']); ?>" />
<?php continue; ?>
<?php endif; ?>
<tr>

    <td>
        <?php if ($type == 'text'): ?>

        <div class="layui-form-item">
            <label class="layui-form-label"><?php echo $info['DisplayName'];?></label>
            <div class="layui-input-block">
                <input id="id_<?php echo $info['Field'];?>" lay-verify="name" class="layui-input" name="<?php echo $info['Field'];?>">
            </div>
        </div>

        <?php elseif ($type == 'bool'): ?>

        <label class="radio">
            <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="1" checked>
            是
        </label>
        <label class="radio">
            <input type="radio" name="<?php echo $info['Field'];?>" class="<?php echo $validateClass; ?>" value="2">
            否
        </label>


        <?php elseif ($type == 'radio'): ?>
        <div class="layui-form-item">
        <label class="layui-form-label">類型</label>
        <div class="layui-input-block">

        <?php $items = explode(",", $info['Params']['items']); ?>

        <?php foreach ($items as $value): ?>
        <?php
                $parts = explode('#', $value, 2);
                $displayText = $parts[0];
                if (count($parts) == 2) {
                    $displayValue = $parts[1];
                } else {
                    $displayValue = $parts[0];
                }
                ?>

        <label class="radio">
            <input type="radio" name="<?php echo $info['Field'];?>" value="<?php echo $displayValue; ?>" class="<?php echo $validateClass; ?>" checked> <?php echo $displayText; ?>
        </label>


        <?php endforeach; ?>
        </div>
        </div>

        <?php elseif ($type == 'checkbox'): ?>

        <?php $items = explode(",", $info['Params']['items']); ?>

        <?php foreach ($items as $value): ?>
        <?php
                $parts = explode('#', $value, 2);
                $displayText = $parts[0];
                if (count($parts) == 2) {
                    $displayValue = $parts[1];
                } else {
                    $displayValue = $parts[0];
                }

                ?>
        <label class="checkbox">
            <input type="checkbox" name="<?php echo $info['Field'];?>[]" value="<?php echo $displayValue;?>" class="<?php echo $validateClass; ?>"> <?php echo $displayText;?>
        </label>
        <?php endforeach; ?>

        <?php elseif ($type == 'textarea'): ?>

        <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>

        <?php elseif ($type == 'textarea_html'): ?>

        <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>

        <?php elseif ($type == 'label'): ?>

        <?php echo htmlspecialchars($info['Default']);?>

        <?php elseif ($type == 'datetime'): ?>

        <?php continue; ?>

        <?php elseif ($type == 'image_upload'): ?>

        <input name="<?php echo $info['Field'];?>" type="file" class="<?php echo $validateClass; ?>" />

        <?php elseif ($type == 'file_upload'): ?>

        <input name="<?php echo $info['Field'];?>" type="file" class="<?php echo $validateClass; ?>" />

        <?php else: ?>

        <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>

        <?php endif; ?>
    </td>
</tr>
<?php endforeach;?>

 

在公共模板的頂部咱們將字段自定義類型定義了一個變量

 

咱們的這個dn_info自定義類型是text,因此就會將這個input輸出 ,無論修改仍是添加都是須要name值的,因此name值也會是動態的,咱們組裝的數據裏邊也有

 

 

這個就是最終效果

 

 

上面這個是關於添加的,咱們還須要作個修改的,修改是裏邊是有值得

跟添加的原理同樣,只不過須要將字段值組裝

 

看一下數據結構

 

在來一個修改的模板

{include file="../../../application/admin/view/public/head" /}
        <?php foreach ($fields as $info):?>

        <?php
            $type = $info['Params']['edit'];
            $validateClass = "validate[required]";
        ?>

        <?php if ($info['Params']['edit'] == 'ignore'): ?>
            <?php continue; ?>
        <?php endif; ?>

        <?php if ($info['Params']['edit'] == 'hidden'): ?>
            <input name="<?php echo $info['Field'];?>" type="hidden" value="<?php echo htmlspecialchars($info['Value']); ?>" />
            <?php continue; ?>
        <?php endif; ?>

        <tr>
            <td>
            <?php if ($type == 'text'): ?>

                <div class="layui-form-item">
                    <label class="layui-form-label"><?php echo $info['DisplayName'];?></label>
                    <div class="layui-input-block">
                        <input id="id_<?php echo $info['Field'];?>" lay-verify="name" class="layui-input" name="<?php echo $info['Field'];?>" value="<?php echo $info['Value'] ?>">
                    </div>
                </div>

            <?php elseif ($type == 'bool'): ?>

                <label class="radio">
                    <input type="radio" name="<?php echo $info['Field'];?>" value="1" class="<?php echo $validateClass; ?>" <?php if ($info[Value] == 1) echo 'checked'; ?>>
                    是
                </label>
                <label class="radio">
                    <input type="radio" name="<?php echo $info['Field'];?>" value="2" class="<?php echo $validateClass; ?>" <?php if ($info[Value] == 2) echo 'checked'; ?>>
                    否
                </label>

            <?php elseif ($type == 'radio'): ?>

                <?php $items = explode(",", $info['Params']['items']); ?>

                <?php foreach ($items as $value): ?>
                <?php
                $parts = explode('#', $value, 2);
                $displayText = $parts[0];
                if (count($parts) == 2) {
                    $displayValue = $parts[1];
                } else {
                    $displayValue = $parts[0];
                }
                ?>
                <label class="radio">
                    <input type="radio" name="<?php echo $info['Field'];?>" value="<?php echo $displayValue; ?>" class="<?php echo $validateClass; ?>" <?php if ($displayValue == $info['Value']) echo 'checked'; ?>>
                    <?php echo $displayText; ?>
                </label>
                <?php endforeach; ?>

            <?php elseif ($type == 'checkbox'): ?>

                <?php
                $items = explode(",", $info['Params']['items']);
                $currentItems = explode(' ', $info['Value']);
                ?>

                <?php foreach ($items as $value): ?>
                <?php
                $parts = explode('#', $value, 2);
                $displayText = $parts[0];
                if (count($parts) == 2) {
                    $displayValue = $parts[1];
                } else {
                    $displayValue = $parts[0];
                }
                ?>
                <label class="checkbox">
                    <input type="checkbox" name="<?php echo $info['Field'];?>[]" value="<?php echo $displayValue;?>" class="<?php echo $validateClass; ?>" <?php if (in_array($value, $currentItems)) echo 'checked'; ?>> <?php echo $displayText;?>
                </label>
                <?php endforeach; ?>

            <?php elseif ($type == 'textarea'): ?>

                <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>

            <?php elseif ($type == 'textarea_markdown'): ?>

            <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" data-provide="markdown" id='markdownArea'  class="input-xxlarge md-input <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>

            <br /><a href='http://wowubuntu.com/markdown/' target='_blank'>Markdown 語法說明</a>

            <?php elseif ($type == 'textarea_html'): ?>

                <textarea name="<?php echo $info['Field'];?>" rows="20" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>

            <?php elseif ($type == 'label'): ?>

                <?php echo htmlspecialchars($info['Value']);?>

            <?php elseif ($type == 'datetime'): ?>

                <input name="<?php echo $info['Field'];?>" class="input-xxlarge <?php echo $validateClass; ?>" value="<?php echo $info['Value']; ?>" />

            <?php elseif ($type == 'image_upload'): ?>

                <img src="<?php echo '/image/view/' . $info['Params']['storage'] . '/' . $info['Value'] . '/small'; ?>" data-src="holder.js/200x200" alt="" style="max-height:200px;" />
                <input name="<?php echo $info['Field'];?>" type="file" />

            <?php elseif ($type == 'file_upload'): ?>

                <input name="<?php echo $info['Field'];?>" type="file" />

            <?php else: ?>

                <textarea name="<?php echo $info['Field'];?>" rows="10" cols="100" class="input-xxlarge <?php echo $validateClass; ?>"><?php echo htmlspecialchars($info['Value']); ?></textarea>

            <?php endif; ?>

            </td>
        </tr>
        <?php endforeach;?>

 

修改跟添加的模板就差一個value值

相關文章
相關標籤/搜索