一月
13
2014

Git: 對於已經track的檔案,本地端忽略的方法

Git中正規的忽略檔案方式是使用.gitignore,但是總會有意外忘記忽略特定的檔案或者是目錄,也或者是就是有特殊需求需要把某些設定檔案進行追蹤,但是這些檔案又要忽略本地端的異動。很多的教學都是教我們使用stop tracking的方式,但是一旦使用stop tracking,那麼git中的這些檔案就會被刪除。

如果要將這些特定的檔案進行本地端地忽略,那麼只要使用下面的指令就可以

git update-index --assume-unchanged 要忽略的檔名

這樣就可以達到我們的需求了,如果開發團隊中每個都需要忽略本地端相同的檔案,那麼可以把上面的指令寫成一個檔案,這樣大家一來也可以把本地要忽略的檔案進行管理。另外記得這個檔案要透過.htaccess的方式來進行讀取的限制,免得讓大家都發現這個意外的驚喜。

十月
7
2013

GroceryCRUD密碼欄位的處理

當我們使用GroceryCRUD的時候,最簡單的設定密碼欄位方式

$crud->field_type('user_pass', 'password');

只要使用field_type進行設定,這個欄位就會變成密碼的樣式,但是卻會發生一個問題,就是進入到編輯頁面的時候,密碼欄位都會重新送出寫進資料庫,除非你的密碼沒有加密,直接使用明碼存放在資料庫裡面,不然就會發生密碼一直被修改,使用者會無法登入的慘劇。對了,如果你的密碼是明碼直接存放於資料庫,歡迎在下面留言,讓大家都知道,然後讓大家觀摩朝聖一下 😀

為了避免上述的慘劇發生,我使用下面的方法來處理

1. 我使用另外一種方式來表達密碼欄位,不使用原本的field_type的方式

$crud->callback_add_field('user_pass',array($this,'setPasswordToEmpty'));
$crud->callback_edit_field('user_pass',array($this,'setPasswordToEmpty'));

2. setPasswordToEmpty的內容

function setPasswordToEmpty() {
	return "<input type='password' name='user_pass' value='' />";
}

3. 我建立下面兩個callback來處理密碼欄位

$crud->callback_before_insert(array($this, 'userPassProcess'));
$crud->callback_before_update(array($this, 'userPassProcess'));

4. 現在開始寫userPassProcess的內容

function userPassProcess($postArray, $primaryKey=null)
{
	// 如果密碼欄位不等於空白
	if(!empty($postArray['user_pass']))
	{
		$postArray['user_pass'] = $this->_encryptPass($postArray['user_pass']);
	}
	// 如果密碼欄位是空白
	else if(empty($postArray['user_pass']))
	{
		// 如果沒有把密碼欄位從要傳送的array中移除,會發生密碼欄位被更新為空值的情況
		unset($postArray['user_pass']);
	}
	return $postArray;
}

5. 最後把必填欄位也順手處理一下

if($crud->getState() == 'add')
{
	$crud->required_fields('user_acct','user_pass');
}
else
{
	$crud->required_fields('user_acct');
}
十月
6
2013

GroceryCRUD中檢查表單欄位輸入的值是否重複

我們在設計表單的時候,有些欄位例如使用者帳號,我們會希望是唯一不重複的。GroceryCRUD其實有提供一個很簡單的方式達成我們這樣的需求,但是文件卻沒有寫,我原本想要自己寫一個,結果在讀原始碼的時候,發現作者早就做好這個功能了,下面跟大家分享一下怎麼使用。

首先,我們先把要檢查是否唯一不可重複的欄位設定為unique,這個使用phpMyAdmin來做應該不用另外教吧??
接下在controller裡面加上下面這行程式

$crud->unique_fields('user_account');

這樣就完成了,是不是相當的簡單呢?
如果要修改錯誤訊息的提示文字,請修改 $CI根目錄/application/language/$你的語系檔目錄/form_validation_lang.php 的$lang[‘is_unique’]就可以了

九月
27
2013

強化GroceryCRUD的join功能

grocerycrud是一個可以快速建立CRUD頁面和功能的一個好工具,但是他的join寫的實在有點死板板,不過好在我們還是可以有一些方法可以解決掉這個問題
首先建立一個model $codeigniterRoot/application/models/$modelName_model.php,下面是程式的內容

<?php
class Crud_classes_students_join extends grocery_CRUD_Model
{
	function get_list()
	{
		if($this->table_name === null)
			return false;

		$select = "{$this->table_name}.*";

		// 在這裡加入我們要額外select的欄位
		// $select .= ", user_log.created_date, user_log.update_date";

		if(!empty($this->relation))
			foreach($this->relation as $relation)
			{
				list($field_name , $related_table , $related_field_title) = $relation;
				$unique_join_name = $this->_unique_join_name($field_name);
				$unique_field_name = $this->_unique_field_name($field_name);

				if(strstr($related_field_title,'{'))
					$select .= ", CONCAT('".str_replace(array('{','}'),array("',COALESCE({$unique_join_name}.",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $unique_field_name";
				else
					$select .= ", $unique_join_name.$related_field_title as $unique_field_name";

				if($this->field_exists($related_field_title))
					$select .= ", {$this->table_name}.$related_field_title as '{$this->table_name}.$related_field_title'";
			}

		$this->db->select($select, false);

		// 這裡寫上我們需要的join語法
		$teacherID = $this->session->userdata('userID');
		$this->db->join('teacher_student',"users.user_id=teacher_student.student_id and teacher_student.teacher_id=$teacherID");
		$obj = $this->db->get($this->table_name);
		$results = $obj->result();

		return $results;
	}
}

接下來在$codeigniterRoot/application/controllers/$controllerName

$crud = new grocery_CRUD();
$crud->set_model($modelName); // 這裡就是把我們剛剛建立的model載入進來
$crud->set_theme('datatables');
$crud->set_table('users');
$crud->set_subject('student');

這樣就可以讓GroceryCRUD根據我們特殊需求去做join,不會再受限於原本的架構了

八月
26
2013

AWS EC2 Micro instance ErrorException: proc_open(): fork failed – Cannot allocate memory in phar的解決方法

今天在AWS EC2 micro上面執行composer update的時候跳出了下面的錯誤訊息

PHP Fatal error:  Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/S
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 990, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(990): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(832): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(797): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(731): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php on line 990

Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/Symfon
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 990, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(990): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Conso
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Conso
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Conso
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/co

google了一下,很多人都說AWS EC2 micro instance遇到這個問題是無解必須把等級往上升一等才能解決,我不信邪,一樣在micro的機器上面做以下的修改

vi /etc/php.ini
把原本的 memory_limit=128M 改成 memory_limit=256M

然後重新啟動apache,再執行一次composer update就可以正常了,到目前為止composer都運作的很順利沒有遇到任何的問題

頁次:«123456789...279»