最近我探索了一些图书馆,我可以在这里看到Neo4j的图形,但是没有一个人可以选择的清晰视图,所以我有一些想法我想分享.
我的要求和愿望 - 在通过REST API搜索cypher查询后,可视化包含所有关系,节点的图形.结果使交互 - 能够拖放...显示其他节点/依赖点击的机会.通过json数据导入节点,并能够快速显示至少400个元素.
所以我或多或少地探索了更多的库:
Three.js - 主要用于3D.(如果我不需要3D,那么最好不要选择这个)
Arbor.js - 绘图留给你,主要是布局库
VivaGraphJS - 易于使用,但几乎没有文档:(
D3.js - 看起来很好,但使用SVG
Cytoscape.js - 看起来不错,但我读到我不能将它与Neo4j一起使用. D3.js是Neo4j Graph DB数据实时可视化的正确选择 吗?
Processing.js - 拥有与Java类似的语言.我还没有那种类似Java语言的东西.
我有几个问题:
1)您的经历是什么 - 图书馆的好处和弱点?
2)我想我想使用SVG的画布?(屏幕上有很多小元素).
3)Arbor是布局的专用库,但是其他没有布局算法或者什么?
我会感激任何意见!:-)
如果我在db中有2个字段 - 概率和影响,我需要在GridView中使用这两个字段相乘的列.我设法在那里添加它:
[
'attribute' => 'priority',
'format' => 'raw',
'value' => function ($model) {
return $model->influence * $model->probability;
},
],
Run Code Online (Sandbox Code Playgroud)
但是无法处理排序,因为该列不在db中,并且向$ query添加过滤器只会导致错误.
$query = Risks::find();
$query->select(`probability*influence AS priority`);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
Run Code Online (Sandbox Code Playgroud)
更新(使用Asc和Desc但不使用过滤器)
public function search($params)
{
$query = Risks::find();
$query->joinWith(['author', 'proj']);
$query->select('*, (probability * influence) as priority');
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'attributes' => [
// 'id',
'probability',
'risks',
'influence',
'del' => [
'asc' => ['risks.del' => SORT_ASC],
'desc' => …
Run Code Online (Sandbox Code Playgroud) 我使用访问控制过滤器进行访问管理,但无法完成一件事 - 例如,我如何才能让项目经理更新项目并禁止其他人?我通过matchCallback尝试了它,但在这种情况下,所有项目经理都可以更新任何项目,因为返回了TRUE.
类似的更常用的规则 - 如何允许用户使用ACF更新/删除他是作者的帖子?
'access' => [
'class' => AccessControl::className(),
'only' => ['index', 'view', 'create', 'update', 'delete'],
'rules' => [
[
'actions' => ['update'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->getProjectParticipants()
->one()->isManager(Yii::$app->user->identity->id);
}
],
],
],
Run Code Online (Sandbox Code Playgroud) 我在一个模态窗口中有两个ActiveForms,在提交第一个表单后,我需要更新第二个表单并保持模态.
据我所知,pjax可以处理,但无法让它正常工作.
在_form.php中,我有ActiveForm的widget应该更新:
<?php $form = ActiveForm::begin([
'id'=>'form',
'enableAjaxValidation'=>true,
]); ?>
<?= Html::activeHiddenInput($riskModel, 'id', ['value' => $riskModel->id]) ?>
<?php Pjax::begin([
'id' => 'solutionItems',
]) ?>
//need to update this widget
<?= $form->field($riskModel, 'solutions_order')->widget(SortableInput::classname(), [
'items' => $riskModel->getSolutionList(),
'hideInput' => false,
'options' => ['class'=>'form-control', 'readonly'=>false]
]); ?>
<?php Pjax::end() ?>
<div class="form-group">
<?= Html::submitButton($riskModel->isNewRecord ? 'Create' : 'Update', ['class' => $riskModel->isNewRecord ? 'btn btn-success' : 'btn btn-primary', 'onclick' => 'return isConnected()']) ?>
</div>
<?php ActiveForm::end(); ?>
Run Code Online (Sandbox Code Playgroud)
然后我有Ajax请求,如果创建了新的解决方案,它将返回成功:
$.ajax({
url: form.attr('action'),
type: …
Run Code Online (Sandbox Code Playgroud) 当 GridView 中有 2 个模型并且在一行中插入了来自第二个模型的 1 个以上的记录时,我遇到了分页问题。
DataProvider 看起来像:
$query = Risks::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => array('pageSize' => 5),
]);
$query->joinWith(['solutions']);
Run Code Online (Sandbox Code Playgroud)
Ins第二个模型我有功能:
public function getSolutionValues (){
......
$content ='';
foreach ($order as $o){
$model = Solutions::findOne($o);
$content.= '<p>'.Html::encode($model->solution).'</p>';
}
return $content;
}
Run Code Online (Sandbox Code Playgroud)
在 GridView 我调用这个函数:
[
'attribute' => 'solutions',
'format' => 'raw',
'value' => function ($model) {
return $model->getSolutionValues();
},
],
Run Code Online (Sandbox Code Playgroud)
例如,这里只有前 3 条记录(而不是 5 条)可见,因为第一行插入了来自不同模型的 3 个条目。(如果插入一个解决方案,那么一切都可以)
如果我从列表中删除一个解决方案,分页不会改变,我必须从数据库中删除解决方案,然后只有分页不计入该条目。
php ×4
yii2 ×4
gridview ×2
active-form ×1
ajax ×1
cypher ×1
dataprovider ×1
graph ×1
libraries ×1
neo4j ×1
pagination ×1
pjax ×1
role ×1
yii2-user ×1