【问题标题】:How to pass node id for each node clicked in kartik treeview?如何为在kartik treeview中单击的每个节点传递节点ID?
【发布时间】:2020-06-24 17:10:14
【问题描述】:

我有多个节点。我想在每个节点单击时显示不同的视图。为此,我必须传递节点 ID。下面是我试图解释整个场景的代码

`<?=
    TreeView::widget([
        'query' => \common\models\MdcNode::find()->addOrderBy('root, lft'),
        'headingOptions' => ['label' => 'Root'],
        'rootOptions' => ['label'=>'<span class="text-primary">Root</span>'],
        'topRootAsHeading' => true, // this will override the headingOptions
        //'displayValue' => 1,        // initial display value
        'isAdmin' => false,
        'fontAwesome' => true,
        //'nodeView' => '',
        //show => none removes the iconType etc setting under details
        'iconEditSettings'=>['show'=>'none'],

        'toolbar' =>
            [
            TreeView::BTN_REFRESH => false,
            TreeView::BTN_CREATE => false,
            TreeView::BTN_CREATE_ROOT => false,
            TreeView::BTN_REMOVE => false,
            TreeView::BTN_SEPARATOR => false,
            TreeView::BTN_MOVE_UP => false,
            TreeView::BTN_MOVE_DOWN => false,
            TreeView::BTN_MOVE_LEFT => false,
            TreeView::BTN_MOVE_RIGHT => false,
        ],

        'showIDAttribute' => false,
        'showTooltips' => false,

        'showNameAttribute' => false,
        'softDelete' => false,
        'cacheSettings' => ['enableCache' => true],
        //removing the detail below removes the second column of view(s) 1 - 5. Section 5 is being used to render the extra data. See frontend\config\main.php later.
        'mainTemplate'=>'<div class="row">
                        <div class="col-sm-3">
                            {wrapper}
                        </div>
                        <div class="col-sm-9">
                            {detail}
                        </div>
                     </div>',
        'nodeAddlViews' => [
            Module::VIEW_PART_1 => '',
            Module::VIEW_PART_2 => '',
            Module::VIEW_PART_3 => '',
            Module::VIEW_PART_4 => '',
            Module::VIEW_PART_5 => '@backend/views/api/index',
        ]

    ]);
    ?>`

控制器

public function actionIndex() { echo "{Index}"; }

查看

<?PHP
  /* @var $this yii\web\View */
  ?>
  

  <p>
    You may change the content of this page by modifying
    the file <code><?= __FILE__; ?></code>.
  </p>

用户界面

当我单击每个节点时,如何将每个节点 ID 传递给我的视图? 任何帮助将不胜感激。

【问题讨论】:

    标签: yii2 treeview yii2-advanced-app kartik-v


    【解决方案1】:

    Using this answer for support 在您的节点视图中,即。 nodeAddlView 位于变量 nodeAddlView 下的 Treeview 小部件或 TreeViewSettings 数组中,nodeAddlView 位于 config/main.php 中,您有一个别名,例如。 @app 这是高级应用程序的默认设置,即。未在 common/config/bootstrap.php 下列出,例如。

    <?php
    Yii::setAlias('@common', dirname(__DIR__));
    Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
    Yii::setAlias('@bower', dirname(dirname(__DIR__)) . '/vendor/bower-asset');
    Yii::setAlias('@migrations', dirname(dirname(__DIR__)) . '/frontend/migrations');
    Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
    

    并且未在此处的 frontend/config/main.php 下与“别名”设置一起列出:

    'aliases'=>[
          '@bower'=>'@vendor/bower-asset',
          '@npm'=>'@vendor/npm-asset',
        ],
    

    此别名与路径连接或连接。这个组合位于 前端/config/main.php 中的模块。例如。

    'treemanager' =>  [
            'class' => 'kartik\tree\Module',
            'treeViewSettings'=> [
                'nodeView' => '@kvtree/views/_form',    
                'nodeAddlViews' => [
                    1 => '',
                    2 => '',
                    3 => '',
                    4 => '',
                    5 => '@app/views/krajeeproducttree/product',
            ]]    
           ],
    

    或在 Treeview::widget 参数中,例如。

    <?php  
        echo TreeView::widget([
            // single query fetch to render the tree
            'query' => KrajeeProductTree::find()->addOrderBy('root, lft'),
            'nodeView' => '@kvtree/views/_form',    
            'nodeAddlViews' => [
                1 => '',
                2 => '',
                3 => '',
                4 => '',
                5 => '@app/views/krajeeproducttree/product',
             ],  
            'headingOptions' => ['label' => 'Categories'],
            'fontAwesome' => true,      // optional
            'isAdmin' => false,         // optional (toggle to enable admin mode)
            'displayValue' => 1,        // initial display value
            'softDelete' => true,       // defaults to true
            'cacheSettings' => [        
                'enableCache' => true   // defaults to true
            ],
            'hideTopRoot'=>true,
            'treeOptions' => ['style' => 'height:1000px width:900px' ],
            //more detail can be added to the node here eg. $node->id but
            //for security better adding it to the bottom of your
            // view file listed here 
            // eg.   5 => '@app/views/krajeeproducttree/product', 
            // since it automatically carries and is passed the $node variable.
            'nodeLabel' => function($node) {
                                 return $node->name . " ". $node->id;
                           },
            //disable the toolbar completely                       
            'toolbar'           => [
                    TreeView::BTN_REFRESH => false,
                    TreeView::BTN_CREATE => false,
                    TreeView::BTN_CREATE_ROOT => false,
                    TreeView::BTN_REMOVE => false,
                    TreeView::BTN_SEPARATOR => false,
                    TreeView::BTN_MOVE_UP => false,
                    TreeView::BTN_MOVE_DOWN => false,
                    TreeView::BTN_MOVE_LEFT => false,
                    TreeView::BTN_MOVE_RIGHT => false,
                ],                 
            'showIDAttribute' => false,
            'showTooltips' => false,
            'showNameAttribute' => false,
            'softDelete' => false,
            'cacheSettings' => ['enableCache' => true],
            //show => none removes the iconType etc setting under details                       
            'iconEditSettings'=>['show'=>'none'],
            //
            'showFormButtons'=>false,
            'breadcrumbs'=>[//'depth'=>null,
                            'glue'=>'&raquo;',
                            'activeCss'=>'kv-crumb-active',
                            'untitled'=>'Untitled'
                           ],
            //removing header below removes the search button and header                       
            //'wrapperTemplate'=>'{header}{tree}{footer}',         
            'wrapperTemplate'=>'{tree}',
            //removing the detail below removes the second column of view(s) 1 - 5
            'mainTemplate'=>'<div class="row">
                                <div class="col-sm-3">
                                    {wrapper}
                                </div>
                                <div class="col-sm-9">
                                    {detail}
                                </div>
                             </div>'                       
        ]); 
    ?>
    

    实际节点的 id,或者如果我理解正确,扩展 TreeView 模型的自动增量 id 可以简单地通过以下方式检索:

    echo "Node id: ". $node->id;
    

    在您创建的视图文件的底部。这是中的 id:

    CREATE TABLE tbl_product (
        id            INT(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
        root          INT(11)               DEFAULT NULL,
        lft           INT(11)      NOT NULL,
        rgt           INT(11)      NOT NULL,
        lvl           SMALLINT(5)  NOT NULL,
        name          VARCHAR(60)  NOT NULL,
        icon          VARCHAR(255)          DEFAULT NULL,
        icon_type     TINYINT(1)   NOT NULL DEFAULT '1',
        active        TINYINT(1)   NOT NULL DEFAULT TRUE,
        selected      TINYINT(1)   NOT NULL DEFAULT FALSE,
        disabled      TINYINT(1)   NOT NULL DEFAULT FALSE,
        readonly      TINYINT(1)   NOT NULL DEFAULT FALSE,
        visible       TINYINT(1)   NOT NULL DEFAULT TRUE,
        collapsed     TINYINT(1)   NOT NULL DEFAULT FALSE,
        movable_u     TINYINT(1)   NOT NULL DEFAULT TRUE,
        movable_d     TINYINT(1)   NOT NULL DEFAULT TRUE,
        movable_l     TINYINT(1)   NOT NULL DEFAULT TRUE,
        movable_r     TINYINT(1)   NOT NULL DEFAULT TRUE,
        removable     TINYINT(1)   NOT NULL DEFAULT TRUE,
        removable_all TINYINT(1)   NOT NULL DEFAULT FALSE,
        child_allowed TINYINT(1)   NOT NULL DEFAULT FALSE,
        KEY tbl_product_NK1 (root),
        KEY tbl_product_NK2 (lft),
        KEY tbl_product_NK3 (rgt),
        KEY tbl_product_NK4 (lvl),
        KEY tbl_product_NK5 (active)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;
    

    但是这个id实际上没有任何意义,因为如果你刷新数据库ie。删除以前的记录,自动增量将从最新开始 价值。

    如果您指的是构成三个不同级别的 3 个单独表中的每一个的 id,那么您必须将这些不同的 id 字段插入到树模型中,即。在 childallowed 字段之后,以便您可以使用来自不同表之一的实际 id 填充这些字段。这是在您的控制器中完成的,如上面的上一个示例所示。当您单击一个节点时,将仅填充 3 个附加 id 字段中的一个,即。另外两个将为空,例如。

    然后,您可以通过在包含信息的表的 url 中使用此 id 来访问每个节点所需的信息。例如。

    <?php
       use Yii;
       use yii\helpers\Url;
       use yii\helpers\Html;
    ?>
    <div class="krajeeproducttree-product">
        <br>
            <?php
              if ($node->product_id > 0){
                echo Html::a('<h4>View House Details: ' .$node->name. '</h4>',Url::toRoute(['/product/view','id'=>$node->product_id]));
              }         
              if ($node->productsubcategory_id > 0){
                echo Html::a('<h4>View Street Details: ' .$node->name. '</h4>',Url::toRoute(['/productsubcategory/view','id'=>$node->productsubcategory_id]));
              }         
              if ($node->productcategory_id > 0){
                echo Html::a('<h4>View Postcode Details: ' .$node->name. '</h4>',Url::toRoute(['/productcategory/view','id'=>$node->productcategory_id]));
              }
              echo "Node id: ". $node->id;           
            ?>
        <br>
    </div>
    

    Krajee 在Tree Model -> Model Attributes 下提到了这一点

    您可以将自定义字段添加到树模型的数据库表中,并在扩展的树模型中设置这些属性。但是请注意,如果您需要通过表单读取和保存自定义属性数据,则必须正确设置模型属性。这些属性必须在您的模型规则中标记为安全,否则它们将无法通过 $model->load 方法保存以进行大规模分配。

    【讨论】:

    • 因为我没有使用任何外键。我正在通过小部件添加节点。
    • 我只是想通过&lt;?php echo "Node id: ". $node-&gt;id; exit(); ?&gt;获取节点->id(是的表的自动递增id)我得到Undefined variable: node
    • 好的,所以您正在通过小部件添加节点。因此,您的数据库将是永久的,不会定期刷新。
    • 是的,只有在我插入新记录或更新记录时才会更新。
    • 您的 Treeview 设置是否在 nodeView 下有一个别名 _form 并且在 5. ... 下有一个额外的正确别名视图以显示额外的细节?
    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多