使用PHP构建启动程序:收集和管理用户报告和反馈

最终产品图片
您将要创造的

本教程是Envato Tuts +上的“ 使用PHP构建启动”系列的一部分。 在本系列文章中,我将以我的Meeting Planner应用程序作为真实示例,指导您完成从概念到现实的启动。 在此过程的每一步中,我都会将Meeting Planner代码作为开放源代码示例发布,您可以从中学习。 我还将解决与启动相关的业务问题。

在本教程中,我将指导您快速经济地启动该应用程序的支持系统和知识库以及我考虑的一些问题和替代方法。

如果您尚未尝试使用会议计划器,请继续并安排您的第一次会议 。 我确实参与了下面的评论主题,所以请告诉我您的想法! 如果您想为以后的教程提供新的建议功能或主题,我特别感兴趣。

提醒一下,Meeting Planner的所有代码都是在PHP的Yii2框架中编写的。 如果您想了解有关Yii2的更多信息,请查看我们的平行系列“ 使用Yii2编程”

客户支持和知识库

会议计划者支持-提供者经常在其网站上使用儿童

许多初创公司将其客户支持外包,随后又有许多初创公司推出以满足其兄弟和各种公司的需求。 他们似乎在孩子们在网站上的可爱程度上竞争。

Zendesk通常被使用,但是作为用户,我一直有令人讨厌的经历。 还有GrooveLiveAgentFreshdesk等。

当我为Knight Foundation开发Community Starter (以前称为NewsCloud )时,我们使用了TenderApp 。 对我们来说效果很好。 但是,当我去检查该服务时,几年来似乎变化不大,他们博客上最后一篇文章还只有一岁

Freshdesk

会议计划者支持-Fresh Desk主页

我决定选择Freshdesk,因为它不仅为小型公司提供了终身免费帐户,而且还包含此级别的知识库功能。 为人们提供可用的,组织良好的知识库非常重要。 如果我是根据孩子们在竞争对手网站上的可爱程度来选择的,那我一定会喜欢LiveAgent(我们需要鼓励更多的女性从事技术领域)。

关于Freshdesk的警告

将文章转交给Envato Tuts +之后,我的Freshdesk帐户突然被暂停,没有任何警告。 所有免费帐户都会发生这种情况,人们通常会感到惊讶:

Fresh Desk经常暂停帐户

在与他们签约并映射了我的域名30天后,他们暂停了我的帐户,并让我打电话更改为免费级别。 当您切换到免费级别时,他们会删除所有配置信息,包括您的域映射。

他们没有将您的帐户迁移到30天后的免费级别,而是暂停了您的帐户并让您打电话与销售人员交谈。 只是“您的帐户已被暂停”而不是“您的试用期已过期”这样的语言是如此无意地敌对。 请记住这一点,并谨慎使用Freshdesk。 同样,替代方案包括ZendeskGrooveLiveAgent

值得称赞的是,Freshdesk的一位高级支持经理亲自打电话给我,对我的经历表示歉意,并表示他们正在努力进行各种改进,以使该过程更加透明和清晰,尤其是要验证在暂停之前发送警告电子邮件。

我尚未确定我将为Meeting Planner alpha版本使用哪种服务的最终决定。 Fresh Desk在没有警告的情况下暂停的时间延迟了我的释放。

定价水平

这是Freshdesk增量定价级别的快照:

会议计划者支持-FreshDesk定价

注册和配置

注册很容易:

会议计划者支持-FreshDesk注册

他们提供了一个四步向导来启动您的支持站点。 首先,您需要设置传入的支持电子邮件以转发到他们分配给您的邮箱:

Meeting Planner支持-Fresh Desk支持配置向导

正如我在前一集有关Mailgun路由的文章中所述,很容易重新配置支持电子邮件的目的地:

Meeting Planner支持-支持邮箱的Mailgun路由

然后,您邀请您的第一个代理商:

会议计划者支持-新鲜的办公桌邀请代理

仪表板

最初,Freshdesk通过一个免费帐户为您提供30天的高级功能,因此下面的仪表板发生了很多事情。 他们还提供了有益的欢迎参观:

会议筹办者支持-新鲜的办公桌仪表板和介绍性游览

这是发送到新帐户的测试支持请求:

会议计划者支持-样本故障单和客户支持控制界面

上部菜单和右侧栏均提供了许多用于管理票证的功能。

自定义域

为了允许用户访问http://support.meetingplanner.io而不是http://meetingplanner.freshdesk.com ,我只需要在域注册商处映射CNAME并更新设置:

Meeting Planner支持-将我们的支持域CNAME映射到Fresh Desk

公共支持站点

Voilà,这是最初面向公众的支持站点。 我们稍后将开始对其进行定制。

会议计划者支持-面向公众的初始总部
构建知识库

您的知识库按可配置类别进行组织。 目前,我们将继续使用入门和常见问题解答:

会议计划者支持-新鲜的办公桌知识库类别

解释器的创作系统简单明了,功能丰富:

Meeting Planner支持-新的Desk知识库编辑

最终,这是Meeting Planner的用户出现在支持总部时将看到的内容:

会议计划者支持-最终支持主页

实时搜索答案:

Meeting Planner支持-实时问题和主题搜索

而且帮助页面易于阅读:

会议计划者支持-可读的解释器

他们还可以选择提交票证:

会议计划者支持-提交故障单

使用服务比尝试自己构建类似的东西更有意义。

更新我们的代码

基本上,我只需要更新从联系表单到新的Freshdesk支持页面的链接,将我们的应用程序链接到他们的链接就很容易了:

<footer class="footer">
        <div class="container">
          <p class="pull-left">
          <?php
          if (!Yii::$app->user->isGuest) {
            echo Html::a(Yii::t('frontend','Support'),Url::to('http://support.meetingplanner.io')).' | ';
            echo Html::a(Yii::t('frontend','About'),Url::to(['/site/about']));
          }
           ?>
        <p class="pull-right">
        <?= Html::a(Yii::t('frontend','Follow').' @meetingio','https://twitter.com/intent/user?screen_name=meetingio') ?><?php
        if (!Yii::$app->user->isGuest) {
          echo '&nbsp;|&nbsp;'.Html::a('&copy; Lookahead '.date('Y'),'http://lookahead.io').'';
        }
        ?>
        </p>
        </div>
    </footer>

其他注意事项

我们将看到Freshdesk的工作原理。 当前我们的规模很小,我认为它将为我们提供足够的功能。 但是,将来可能会需要其他功能或更高的容量。

我喜欢TenderApp的原因之一是,它很容易链接到Lighthouse App (一个问题和错误跟踪系统)。 但是,当我开始使用正式的问题跟踪器时,我可能会选择Asana (这是他们的错误跟踪视频解释器 )。 但是,我稍后可能会做更多研究。

我也喜欢UserVoice的众包功能请求。 他们曾经提供免费计划,但现在价格昂贵。 这是我将来可能会感兴趣的有用服务。

下一步是什么?

在过去的几个月中, Meeting Planner取得了巨大的进步。 希望您喜欢这个情节。 在我们的“ 用PHP构建您的启动”系列中观看即将发布的教程,其中还有很多改进工作和其他一些重要功能。

如果您还没有尝试,请尝试安排会议 ,然后根据今天的教程中的内容进行阅读,请将任何问题或反馈报告给我们的支持页面

我们也在探索众筹,并将在以后的节目中介绍他。 如果您有兴趣成为第一个了解我们工作的人,请务必在WeFunder关注我们

请随时在下面添加您的问题和评论; 我通常会参与讨论。 您也可以直接通过Twitter @reifman与联系

相关链接

翻译自: https://code.tutsplus.com/tutorials/building-your-startup-with-php-collecting-and-managing-user-reports-and-feedback--cms-23356

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<?php define('IN_SITE', true); require(dirname(__FILE__) . '/includes/init.php'); if(trim($_GET['ac']) == 'del') { deletetable('bug', "id='$_GET[bug_id]'"); goto($_SESSION['php_self']); } $_SESSION['php_self'] = geturl(); //echo $_SESSION['php_self']; $pro_id = empty($_GET['pro_id'])?'':intval($_GET['pro_id']); $bug_id = empty($_GET['bug_id'])?'':intval($_GET['bug_id']); $types = set_supetype($_SESSION['supe_type']); $sql = "SELECT * FROM ".tname('project')." WHERE `father` = '$pro_id'"; $pro_list = $db->getAll($sql); $sql = "SELECT pro_name, father, pro_id FROM ".tname('project')." WHERE `pro_id` = '$pro_id'"; $pro_info = $db->getRow($sql); if(!($_SESSION['supe_username'] and (($_SESSION['supe_project']!=$pro_info['pro_id'] ? $_SESSION['supe_project']==$pro_info['father'] : 1) or $_SESSION['supe_type']==-1))) { goto("login.php?pro_id=$pro_id"); } $sql = "SELECT pro_name FROM ".tname('project')." WHERE `pro_id` = '$pro_id'"; $pro_name = $db->getOne($sql); if($bug_id) { $sql = "select * from ".tname('bug')." where id='$bug_id'"; $bug = $db->getRow($sql); } if($_POST['submit']) { if($_POST['bug_id']) { if($_POST['pro_id']) { $pro_id = $_POST['pro_id']; } $sqlarr = array( 'pro_id' => $pro_id, 'title' => $_POST['title'], 'quick' => $_POST['quick'], 'bug' => $_POST['bug'] ); updatetable('bug', $sqlarr, "id='$_POST[bug_id]'"); } else { if($_POST['pro_id']) { $pro_id = $_POST['pro_id']; } $sqlarr = array( 'pro_id' => $pro_id, 'name' => $_SESSION['supe_username'], 'title' => $_POST['title'], 'quick' => $_POST['quick'], 'bug' => $_POST['bug'], 'dateline' => NOW ); inserttable('bug', $sqlarr); } goto("bug_list.php?pro_id=$pro_id"); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=<?=SITE_CHARSET?>" /> <meta name="keywords" content="" /> <meta name="description" content="" /> <title><?=$_CFG['site_name']?></title> <link href="css/style.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" charset="utf-8" src="includes/editer/kindeditor.js"></script> <script language="javascript"> KE.show({ id : 'bug', cssPath : './css/editer.css', items : [ 'undo', 'redo', 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold', 'italic', 'underline', 'removeformat', 'justifyleft', 'justifycenter', 'justifyright', 'insertorderedlist', 'insertunorderedlist', 'image', 'source'] }); function checkuser(frm) { with(frm) { if (title.value.length < 1) { alert('标题不能为空'); title.focus(); return false; } } } </script> </head> <body> <div class="block"> <div class="header"> <div style="height:50px; padding:3px 10px; background:#006CC5; color:#ffffff;"> <div><?=$_SESSION["supe_username"]?>,欢迎您! 用户组:<span class="org"><?=$types['name_type']?></span> <a href="index.php?ac=loginout">退出</a></div> <div class="pro_name"><?=$pro_name?></div> </div> <div class="line_gray white"> <a href="index.php">首页</a> >> <a href="bug_list.php?pro_id=<?=$_GET['pro_id']?>"><?=$pro_name?></a> >> 发布问题 </div> </div> <form name="reg" action="bug.php?pro_id=<?=$pro_id?>" method="post" onsubmit="return checkuser(this);"> <table width="100%" cellpadding="0" cellspacing="0" border="0"> <tr> <td width="80" height="30" align="right">发布人:</td> <td><?php if($bug_id) {echo $bug['name'];} else { echo $_SESSION['supe_username'];}?></td> </tr> <?php if($pro_list) {?> <tr> <td height="30" align="right">项目选择:</td> <td> <select name="pro_id"> <option value="<?=$pro_info['pro_id']?>" <?php if($pro_info['pro_id']==$bug['pro_id']) { echo "selected";}?>><?=$pro_info['pro_name']?></option> <?php if(is_array($pro_list)) { foreach($pro_list as $value) { ?> <option value="<?=$value['pro_id']?>" <?php if($value['pro_id']==$bug['pro_id']) { echo "selected";}?>><?=$value['pro_name']?></option> <?php }}?> </select> </td> </tr> <?php }?> <tr> <td height="30" align="right">标题:</td> <td><input type="text" name="title" id="title" class="mid_input" value="<?=$bug['title']?>"/></td> </tr> <tr> <td height="30" align="right">迫切度:</td> <td> <select name="quick"> <option value="严重" <?php if($bug['quick']=='严重') echo "selected";?>>严重</option> <option value="较急" <?php if($bug['quick']=='较急') echo "selected";?>>较急</option> <option value="一般" <?php if($bug['quick']=='一般') echo "selected";?>>一般</option> </select> </td> </tr> <tr> <td align="right">问题:</td> <td><textarea name="bug" id="bug" style="width:500px; height:230px;"><?=$bug['bug']?></textarea></td> </tr> <tr> <td height="30" height="30"></td> <td> <input type="hidden" name="bug_id" value="<?=$bug_id?>"/> <input type="submit" name="submit" class="submit" value="提交"/> </td> </tr> </table> </form> </div> </body> </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值