zend framework2 + Doctrine 中文乱码问题

终于成功在项目中安装 Doctrine 了,不过,却发现用 Doctrine 入库的中文都是乱码,虽然用 Doctrine 再次取出恢复正常,但是中感觉缺点什么。
检查数据表、文件都已经是 UTF8了,唯一可能出现问题的就是 Doctrine 连接的问题,找到 DoctrineDBALDriverPDOMySqlDriver 源代码(这是类路径,要搜索一下),发现:

    /**
     * Constructs the MySql PDO DSN.
     *
     * @param array $params
     *
     * @return string The DSN.
     */
    protected function constructPdoDsn(array $params)
    {
        $dsn = 'mysql:';
        if (isset($params['host']) && $params['host'] != '') {
            $dsn .= 'host=' . $params['host'] . ';';
        }
        if (isset($params['port'])) {
            $dsn .= 'port=' . $params['port'] . ';';
        }
        if (isset($params['dbname'])) {
            $dsn .= 'dbname=' . $params['dbname'] . ';';
        }
        if (isset($params['unix_socket'])) {
            $dsn .= 'unix_socket=' . $params['unix_socket'] . ';';
        }
        if (isset($params['charset'])) {
            $dsn .= 'charset=' . $params['charset'] . ';';
        }

        return $dsn;
    }

关键是:

$dsn .= 'charset=' . $params['charset'] . ';';

于是,到文件 doctrine.local.php 添加内容为:

<?php
return array(
    'doctrine' => array(
        'connection' => array(
            'orm_default' => array(
                'driverClass' => 'DoctrineDBALDriverPDOMySqlDriver',
                'params' => array(
                    'host' => 'localhost',
                    'port' => '',
                    'user' => 'yourusername',
                    'password' => 'yourpassword',
                    'dbname' => 'yourdbname',
                    'charset' => 'UTF8'
                )
            )
        )
    )
);

问题解决

解决 ZendFramework2 Doctrine 出现 MySql 不支持 enum 类型问题的方法

最近项目用 zendFramework 2 + Doctrine,composer 安装完毕后使用 vendor/bin/doctrine-module orm:validate-schema
命令出现以下错误:

  [DoctrineDBALDBALException]
  Unknown database type enum requested, DoctrineDBALPlatformsMySqlPlatform may not support i
  t.

网上找了很多都是解决在 Symfony 下的,没有发现在 zf2下如何解决,红杏(fanqiang)后终于找到一老外找到了解决办法:
在 Application 模块(默认模块)的 Module.php 文件添加以下内容:

class Module {
        public function onBootstrap(MvcEvent $e) {

......

        $em = $e->getApplication()->getServiceManager()->get('DoctrineORMEntityManager');
        $dbPlatform = $em->getConnection()->getDatabasePlatform();
        $dbPlatform->registerDoctrineTypeMapping('enum', 'string');


.....

}
}

原帖地址:http://foobar.lu/wp/2013/01/24/getting-enum-datatype-to-work-with-doctrine-2-in-zend-framework-2/

在unity3d中回调android的activity

在unity3d中返回android的原生activity,按照网上的许多教程,互相调用方法基本都没什么问题了,但是在返回android的原生activity的时候,整个程序都会关闭,最后在 manifest 配置文件中加入线程名解决。先罗列代码:
第一步在unity3d 的c#中回调外壳activity的方法:

public void onBackClick(){
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    jo.Call("back","返回android");
}

第二部在外壳activiti中处理(我是新建了一个继承UnityPlayerNativeActivity的类)


public class WeivaUPNActivity extends UnityPlayerNativeActivity {

    public void back(String arg){
        Intent intent = new Intent();
        intent.setClass(WeivaUPNActivity.this, LoginOkActivity.class);
        startActivity(intent);
        WeivaUPNActivity.this.finish();

    }
}

视乎看起来没什么问题,但是UnityPlayer 被finish()后会把整个程序给exit,导致无法返回 LoginOkActivity 。如果不对UnityPlayer进行finish,可以返回LoginOkActivity,但是这程序无法退出,因为在退出的时候又会再次打开UnityPlayer。
谷歌了很多帖子,视乎很复杂,也考虑过回调时不finishi,而是把WeivaUPNActivity实例静态化后,在退出时在静态退出,但是感觉很麻烦。最后在一片老外的帖子发现一条线索,可以在manifest配置文件中设置不同的进程名,从而避免UnityPlayer finish时关闭整个程序:

            <activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:name="com.weiva.WeivaUPNActivity"<font color="#ff0000"> android:process=":Unity3D"</font>>
              <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
              <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
            </activity>

原帖地址:http://answers.unity3d.com/questions/587979/how-do-i-stop-munityplayerquit-closing-the-entire.html

zend framework 2 学习笔记:定义自己的日志,记录到数据库中

需求:定制自己的日志系统,本例假定指定存储到Mysql数据库当中。

通常的web我们可以 echo,或者IDE的debuger调试程序,但是有些特殊情况,例如php与android、unity3d等前端通讯时,传统方式并不方便,所以,需要把日志输出到其他地方便于查看。
* zf2中可以通过指定不同的 Zend/Log/Writer 来使用不同的日志记录方式。

下面开始动手了
为了便于在系统中重复使用,我将Logger放到 App 的 Service 中,以后只要在需要的时候,从 Service 中取出就可以用,如果完全没使用,也不会对速度有影响。

在文件 module/Application/Module.php 中:
头部引用包:

use ZendLogLogger;
use ZendLogWriterDb as WriterDb;

在 Module 类中,加入自定义 Service:

public function getServiceConfig(){
        return array(
            'factories'=>array(
                'WLogger' => function($sm){
                    $dbAdapter = $sm->get ( 'ZendDbAdapterAdapter' ); //需要指定你自己的数据库适配器
                    //对接数据表字段
                    $mapping = array(
                        'timestamp' => 'time',
                        'priority'  => 'type',
                        'message'   => 'message'
                    );
                    $writer = new WriterDb($dbAdapter, 'log_table', $mapping); // log_table 是你自己的日志数据表
                    //$writer = new ZendLogWriterDb($dbAdapter, 'log_table', $mapping); //这样会报错
                    $logger = new Logger();
                    $logger->addWriter($writer);
                    return $logger;
                }
            )
        );
    }

添加日志表到你的数据库中:

--
-- 表的结构 `log_table`
--

CREATE TABLE IF NOT EXISTS `log_table` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `type` varchar(255) DEFAULT NULL,
  `message` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='日志库' AUTO_INCREMENT=1 ;

如何使用?:

$logger = $this->getServiceLocator()->get('WLogger');
$logger->info('记录一条日志');

JQuery取得标签的 src 的相对路径和绝对路径

今天遇上一个怪异的问题,本来想通过JQuery改变图片地址的,但是老是取得Dom处理后的绝对路径地址,不利于处理,研究了半天,终于知道怎么处理了:

 $("img").each(function(i){
 alert("1:" + $(this).attr("src"));  //这种方式可以取得 html 中的 src 属性
 alert("2:" + this.src);                 //这种方式取得的是经过 Dom 补完的绝对路径
 });

可恶的Dom