2012年6月29日 星期五

wordpress 不同頁面顯示不同側欄

繼前一篇文章 wordpress 兩欄式改為三欄式 的這個鄉民又發問了,他需要在不同頁面顯示不同的側欄,後來我 google 了一下,大約 10 分鐘就能完成。請大家不要笑他。




1

首先,安裝一個外掛 「Widget logic」。

2

安裝完成並啟用後,每一個模組下方都會出現 Widget Logic 的區塊:

在這個區塊有一些語法可以使用:
  • is_home() - 主頁
  • is_single() - 文章頁
  • is_page() - 頁面
  • is_category() - 文章分類頁
  • is_tag() - 文章標籤頁
  • is_archive() - 文章歸檔頁
  • is_404() - 404頁面
  • is_search() - 搜尋頁面
  • is_feed() - 訂閱頁

當然,也可以用一些「和、或、否」的邏輯判斷來調整,例如:

|| 表示或,&& 表示和,! 表示否。
  • is_home() - 僅主頁顯示
  • !is_home() - 除主頁以外的頁面顯示
  • !is_category(5) - 僅在ID非5的分類顯示
  • is_home() || is_category('baked-goods') - 在主頁或名稱為baked-goods的分類顯示
  • is_page('about') 僅在關於頁顯示


引用 & 參考:
Widget Logic – 让 WordPress 不同页面显示不一样的侧边栏

回首頁

2012年6月28日 星期四

wordpress 兩欄式改為三欄式

昨天有一個鄉民碰到 wordpress 的問題蠻有創意的,就是要將預設主題佈景的欄位配置改為自訂的欄位配置,苦於對 wordpress 不了解,所以就將這個問題問我。

而剛升級為 wordpress 中學等級的我,要教幼稚園等級的他可以順便練練功 ( 不要笑他 )。

回歸主題,要將 wordpress 佈景主題兩欄式改為三欄式的每個動作雖然簡單,但必須要去了解這個動作會影響到哪一塊,不然網站掛掉就不要哭哭,所以在要動哪一個檔案前,先將那個檔案備份起來,這樣比較保險。

要改 wordpress 之前先拍一張正面照:

接下來依照以下的步驟做修改,但還是要依照各佈景主題配置的程式碼做調整。

1

在「後台」,外觀 > 主題編輯器,找尋 function.php ( 佈景函式庫 ) 做編輯,在這個檔案內,搜尋「register_sidebar」字樣,此時必須要針對側欄區做判斷,因為要將側欄區複製一塊再做版面配置。搜尋到側欄區的程式碼如下:
register_sidebar( array(
    'name' => __( 'Main Sidebar', 'twentyeleven' ),
    'id' => 'sidebar-1',
    'before_widget' => '<aside id="%1$s" class="widget %2$s">',
    'after_widget' => "</aside>",
    'before_title' => '<h3 class="widget-title">',
    'after_title' => '</h3>',
) );
把這一段程式碼複製後貼在後面,將 id 改為唯一值,由於版面已經用到 sidebar-5,所以我將新區塊 id 命名為 sidebar-6,命名為 "次主邊欄"。
register_sidebar( array(
    'name' => __( '次主邊欄', 'twentyeleven' ),
    'id' => 'sidebar-6',
    'before_widget' => '<aside id="%1$s" class="widget %2$s">',
    'after_widget' => "</aside>",
    'before_title' => '<h3 class="widget-title">hi',
    'after_title' => '</h3>',
) );
到 外觀 > 模組就會看到 "次主邊欄" 的區塊,並且可以拖曳模組進去,但於頁面上並無太大更動。

2

要讓你所新增的區塊 "次主邊欄" 在頁面上顯示,就要在 外觀 > 主題編輯器 找尋 sidebar.php ( 邊欄 ) 做編輯,其實檔案裡面已經很明顯地說明這一區塊在做 id 為 sidebar-1 的區塊內容,而動作只需要將它的程式碼在複製一份貼在後面,然後 id 命名為 sidebar-6:
<?php
/**
 * The Sidebar containing the main widget area.
 *
 * @package WordPress
 * @subpackage Twenty_Eleven
 * @since Twenty Eleven 1.0
 */

$options = twentyeleven_get_theme_options();
$current_layout = $options['theme_layout'];

if ( 'content' != $current_layout ) :
?>
  <div id="secondary" class="widget-area" role="complementary">
   <?php if ( ! dynamic_sidebar( 'sidebar-1' ) ) : ?>

    <aside id="archives" class="widget">
     <h3 class="widget-title"><?php _e( 'Archives', 'twentyeleven' ); ?></h3>
     <ul>
      <?php wp_get_archives( array( 'type' => 'monthly' ) ); ?>
     </ul>
    </aside>

    <aside id="meta" class="widget">
     <h3 class="widget-title"><?php _e( 'Meta', 'twentyeleven' ); ?></h3>
     <ul>
      <?php wp_register(); ?>
      <li><?php wp_loginout(); ?></li>
      <?php wp_meta(); ?>
     </ul>
    </aside>

   <?php endif; // end sidebar widget area ?>
  </div><!-- #secondary .widget-area -->
<?php endif; ?>
<?php
if ( 'content' != $current_layout ) :
?>
  <div id="third" class="widget-area" role="complementary">
   <?php if ( ! dynamic_sidebar( 'sidebar-6' ) ) : ?>

    <aside id="archives" class="widget">
     <h3 class="widget-title"><?php _e( 'Archives', 'twentyeleven' ); ?></h3>
     <ul>
      <?php wp_get_archives( array( 'type' => 'monthly' ) ); ?>
     </ul>
    </aside>

    <aside id="meta" class="widget">
     <h3 class="widget-title"><?php _e( 'Meta', 'twentyeleven' ); ?></h3>
     <ul>
      <?php wp_register(); ?>
      <li><?php wp_loginout(); ?></li>
      <?php wp_meta(); ?>
     </ul>
    </aside>

   <?php endif; // end sidebar widget area ?>
  </div><!-- #secondary .widget-area -->
<?php endif; ?>

3

最後只需要在 外觀 > 主題編輯器 中,去針對你這幾個區塊的 css 做更動,調整成想要的版型配置,就完成了。


展示一下最後完成的結果:



參考:
wordpress由两栏变三栏


回首頁

2012年6月22日 星期五

Ajax 於 ASP.NET 即時更新資料

瀏覽網頁通常都不喜歡頻繁的頁面刷新,我個人就是。

所以我用 Ajax 來做更新頁面的動作,讓他即時的在頁面上顯示資料,隨手建立兩個 aspx 檔案 ( Default.aspx、ReadData.aspx )。

Default.aspx : 鍵入資料並同時傳送資料給 ReadData.aspx ,接收 ReadData.aspx 傳回之資料,即時顯示於此頁面上。

ReadData.aspx : 依照傳遞參數顯示資料。

註:範例資料庫為北風 ( northwind ) 資料庫。

以下為原始碼:

ReadData.aspx - 將多餘程式碼都拿掉,否則另一頁面接收資料會顯示不出來。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ReadData.aspx.cs" Inherits="ReadData" %>


    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="gvData" runat="server">
            
        </asp:GridView>
    </div>
    </form>

ReadData.aspx.cs - 讀取資料庫資料並讓 GridView 接收顯示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;
using System.Data.SqlClient;

public partial class ReadData : System.Web.UI.Page
{
    string strConn = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True";
    string strQuery;
    string strID;
    SqlConnection connection;
    SqlCommand command;
    SqlDataAdapter adapter;
    DataTable dt;

    protected void Page_Load(object sender, EventArgs e)
    {
        if ( ( strID = Request.QueryString["ID"]) != null )
        {
            try
            {
                connection = new SqlConnection(strConn);
                command = new SqlCommand();

                strQuery = "SELECT EmployeeID [Employee ID], FirstName + ' ' + LastName [Full Name] FROM Employees WHERE EmployeeID=" + strID;

                command.CommandText = strQuery;
                command.Connection = connection;

                adapter = new SqlDataAdapter(command);
                dt = new DataTable();

                adapter.Fill(dt);

                gvData.DataSource = dt;
                gvData.DataBind();
            }
            catch (Exception ex) { }
        }

    }
}

Default.aspx - 利用 ajax 來讀取網址包含參數索回傳的網頁內容 ( 當然用 XML 最好 ),定時執行 javascript 來即時更新頁面內容 ( 以下為 2 秒更新一次 )。
<%@ Page Title="首頁" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" MaintainScrollPositionOnPostback="true" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    
    <script language="javascript" type="text/javascript">
        function cretateXMLHttpRequest() {
            
            if (window.XMLHttpRequest) { // 如果是 Mozilla, Safari,...
                http_request = new XMLHttpRequest();
            }
            else if (window.ActiveXObject) { // 如果是 IE
                try {
                    // IE 又分成新版和舊版的,其處理方式也不同
                    // 新版的 IE,目前 IE 9 OK
                    http_request = new ActiveXObject("Msxml2.XMLHTTP");
                }
                catch (e) {
                    try {
                        // 舊版的 IE
                        http_request = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    catch (e) { }
                }
            }


        }

        function doStart() {
            cretateXMLHttpRequest();

            var id = document.getElementById('<%= txtID.ClientID %>').value;

            if (id != "") {

                var url = "ReadData.aspx?ID=" + id;
                http_request.open("GET", url, false);
                http_request.send(null);

                var show = document.getElementById('show');
                show.innerHTML = http_request.responseText;
                

            }
            setTimeout(doStart, 2000);

            // alert(id);
        }
    </script>


</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    

    <asp:TextBox ID="txtID" runat="server"></asp:TextBox>

    <div id="show"></div>
    
    <script language="javascript" type="text/javascript">
        doStart();
    </script>
</asp:Content>

執行結果如下圖:


引用 & 參考:
AJAX 入門:第一個範例
AJAX核心-XMLHttpRequest[筆記]

回aspnet目錄
回首頁


2012年6月15日 星期五

wordpress 修改語言檔

wordpress 和 blogger 一樣都是屬於 CMS 類的系統,如果是在 wordpress 官網申請一個空間使用這套系統,那我會覺得它會比 blogger 還不好用,因為它有些功能是需要付費的;但如果是用自己的空間架設 wordpress 的話,那就大不相同了,因為 wordpress 的自製化以及擴充模組和佈景主題實在是太好用了,雖然我曾經有安裝過一個佈景主題把整個網站弄掛,我不清楚是我使用上的問題還是系統的問題,但我相信只要使用者認為正確使用,所有的問題都可以推究系統 ( 似乎好像在很多地方都是這樣 )。

以下圖片是各大 CMS 在美國的使用程度:

圖片來源:WordPress completely dominates top 100 blogs

果然是自己空間架設 wordpress 佔絕大多數,反而是 blogger 只有 2%,也就是說,現在 wordpress 除了方便使用之外,也有很多人在開發方便使用的模組。

我在使用 wordpress 時,碰到一些預設的文字無法在後台修改,就要找 wordpress 的預設語言檔,路徑如以下圖片所示:


內有四個檔案,ms-zh_TW.po、ms-zh_TW.mo、zh_TW.po、zh_TW.mo,我們先要有一個概念,po 檔案等於原始碼,mo 檔案等於編譯過後的執行檔,為一個二進位檔,也就是說,系統語言檔只需要讀取 mo 檔。

編輯 po 有一個方便的軟體可以使用「poedit」,可以到poedit 網站下載,po 檔就會變成以下圖示:


假設要將首頁的連結文字由「首頁」換成「Home」:


可以將 zh_TW.po 檔開啟找尋「首頁」:


接著在此行點擊右鍵再點擊「將原文內容複製到譯文欄位去」



就會將文字「首頁」換成「Home」,然後儲存,它會自動產生一個 mo 檔案,接著再將這兩個檔案覆蓋回去再重新整理網頁,就會如以下圖所示:


回首頁




2012年6月14日 星期四

SQL excel 檔案查詢以及定序問題的解決

今天 User 給我一個 excel,要求我不但將實體檔案做更名,連同資料庫紀錄的路徑也一起更新。

此時就必須做到 excel 檔案與實體資料表的查詢。

我利用 OPENROWSET 語法將 excel 資料轉成資料表,例如以下程式碼:

SELECT *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=檔案位置;HDR=YES;IMEX=1','SELECT * FROM [Sheet1$]') AS O
INNER JOIN Product P ON P.ID  = O.ID  

利用實體檔案 ( excel ) 與檔案資料表 ( *.xls ) 的關聯欄位做合併查詢 ( INNER JOIN ),然後就出現以下錯誤訊息:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_Taiwan_Stroke_CI_AS" in the equal to operation.

後來 google 一下才知道這是定序的問題。

最後只需要在欄位後面加上 collate Chinese_Taiwan_Stroke_CI_AS,對應到另一個資料表的定序即可。



2012/06/18 AM 10:28 KaiYai 補充:


下面KaiYai也來提供一下最近遇到的excel與資料庫問題

問題:從excel篩選出所需資料,做一些運算後Insert到資料庫
解法:
首先先做篩選與運算
我們將excel當成一個資料庫來使用(產生ConnectionString)
對其下SQL語法篩選資料
以下提供一個class

public class ReadExcel
{
    /// <summary>
    /// 讀取Excel資料
    /// </summary>
    /// <param name="File">Excel完整路徑</param>
    /// <param name="strCommand">SQL語法</param>
    public DataTable ReadExcelFile(string File, string strCommand)
    {
        DataTable dt = new DataTable();
        string sConnectionString = "";
        if (File.Substring(File.Length - 4, 4) == "xlsx")
        {
            sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + File + ";Persist Security Info=False;Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
        }
        if (File.Substring(File.Length - 3, 3) == "xls")
        {
            sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + File + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
        }

        if (sConnectionString != "")
        {
            OleDbConnection objConn = new OleDbConnection(sConnectionString);
            objConn.Open();
            OleDbCommand objCmdSelect = new OleDbCommand(strCommand, objConn);
            OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();

            objAdapter1.SelectCommand = objCmdSelect;
            DataSet objDataset1 = new DataSet();

            try
            {
                objAdapter1.Fill(objDataset1, "myExcel");
                dt = objDataset1.Tables["myExcel"];
            }
            catch
            {
            }
            finally
            {
                objConn.Close();
            }
        }
        return dt;
    }
}

接著要將資料傳到SQL SERVER
這邊我們使用預存類型與預存程序

預存類型:
USE [DataBase]
GO
CREATE TYPE [teb] AS TABLE(
 [No] [int],
 [Name] [nvarchar](20),
 [Address] [nvarchar](max),
 [Age] [int]
)
GO

預存程序:
USE [DataBase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [DataTableUpload]
@table teb READONLY  --宣告一個teb,後面一定要有READONLY
AS
insert into Member([No],[Name],[Address],[Age])
select [No],[Name],[Address],[Age]
from @table
GO

在使用上面,我是習慣用SQLObject
SQLObject obj = new SQLObject(ConfigurationManager.ConnectionStrings["Con"].ConnectionString);
SqlParameter[] pm = new SqlParameter[1];
pm[0] = new SqlParameter("@table", dt);
obj.ExeProcNon("DataTableUpload", pm);

這樣就大功告成了


回sql目錄
回首頁




2012年6月8日 星期五

SQL資料轉行

最近遇到SQL SERVER篩選資料時

需要將資料做列轉行(行轉列)的動作

問題:
篩選出每個人在指定 年/月 的每天工作時數

下圖中
上面的是原始資料儲存方式
下面是要秀出來的畫面


試了很多方式

最後找到SQL SERVER 2005以上才有支援的功能

SQL語法:



select 姓名,(case [1]when [1] then [1] else 0 end) as[1],
  (case [2]when [2] then [2] else 0 end) as[2],...
    --顯是最後結果
    --因為會有休假日,所以當該天為NULL則顯示
    from(
        select 姓名,day(日期) as 日期,工作時數
        --原始資料顯示為年-月-日,只顯示一個月的每天工作時數,所以只取日
        from 工作時數紀錄
        where year(日期) = 年and month(日期) = 月
    ) as t
    PIVOT
    (
        sum(工作時數)  --這邊是要顯示的資料,不能直接指定欄位名稱,可以用SUM或MAX等等來做
        for 日期in([1],[2],...)  --指定轉換的欄位名稱
    ) as p

先將資料篩選出來

再利用PIVOT去將資料做轉換

最後將轉換後資料顯示為結果

很輕鬆的就完成轉換的動作


注意:
for 欄位 in (欄位名稱1,欄位名稱2,欄位名稱3,....)
這邊括號內設定的欄位名稱要等於篩選出來的所有資料指定欄位內容一樣
如果不同就會顯示NULL
沒有設定到又不會顯示
所以當資料是很隨機的時候
就需要將語法轉成字串
並且在設定欄位的時候將隨機值指定為要顯示的欄位
然後再執行該字串

改天有空再補充進來

回sql目錄
回首頁



2012年6月1日 星期五

Mysql 出現亂碼的處理方式

最近在製作一隻 PHP 系統,遇到資料庫中文出現亂碼,但是在頁面上正常顯示,寫入更新都是亂碼。

由於 php.ini 內的預設編碼為 default_charset = "iso-8859-1",所以只要修改成與資料庫編碼相同的編碼即可,而我則改為 UTF-8。

另一種方法,就是在連結資料庫後加上 mysql_query('SET NAMES utf8'); 讓編碼成為 UTF-8 即可。

回 PHP 目錄
回首頁