Skip to main content

· 4 min read
Tien
  1. Cài đặt virtualbox trên host. Ở đây mình dùng Ubuntu Desktop 13.04. Sau khi cài xong virtualbox, bạn vào File -> Preferences -> Network -> Add Host-only network. Bạn sẽ có một card mạng ảo trên host với dhcp đã được cấu hình sẵn với đường mạng 192.168.56.1/255.255.255.0.

  2. Cài guest. Ở đây mình dùng Ubuntu Server 13.04. Tạo mới một Virtual Machine với 1 card mạng eth0, Attached to Host-only adapter, Name là card mạng ảo bên host, một shared folder để chia sẻ dữ liệu giữa host và guest dễ hơn. Lúc cài bạn nên chọn ở màn hình cài phần mềm là OpenSSH server, LAMP server, Mail server. Sau khi reboot guest, bạn đăng nhập vào và gõ lệnh sudo nano /etc/network/interfaces và để card mạng eth0 ở chế độ automatic ip: auto eth0 iface eth0 inet dhcp chạy lệnh sudo /etc/init.d/networking restart để khởi động lại networking service sau khi thay đổi thông số ip. Từ host và guest bạn ping lẫn nhau để đảm bảo guest và host thông nhau.

  3. Để guest có thể vào internet được thì ta cần 2 card mạng ở guest. Card mạng eth0 ở chế độ NAT, card eth1 ở chế độ Host-only. Trong guest khi ta chạy lệnh ifconfig chỉ thấy card mạng eth0, nhưng vẫn ping được với host, và vào internet được.  Nhưng ở host ping guest (ping 192.168.56.101) không được, lý do là vì ta vì eth1 chưa có địa chỉ ip, ta cần edit lại /etc/network/interfaces (thêm vào eth1 có cấu hình như của eth0, tức là dhcp). Chú ý sau khi edit ta cần khởi động lại service networking (sudo /etc/init.d/networking restart). Để chắc chắn, ở guest chúng ta chạy lệnh ifconfig -a để xem cấu hình của tất cả các card mạng. nếu muốn xài ip tĩnh ở eth1 thì thêm những dòng:

auto eth1
iface eth1 inet static
address 192.168.56.104
network 192.168.56.0
broadcast 192.168.56.255
netmask 255.255.255.0
# gateway 192.168.56.1
  1. Cài VBoxGuestAdditionsbạn vào Click Devices / CD/DVD Devices / Choose a virtual CD/DVD disk file, chọn file VBoxGuestAdditions.iso có trong /usr/share/virtualbox/, sau đó chạy các lệnh sau: sudo apt-get install hwinfo sudo mount /dev/cdrom /media/cdrom cd /media/cdrom sudo ./VBoxLinuxAdditions.run sudo reboot

  2. Khi bạn chọn auto mount thư mục shared giữa host và guest, bạn sẽ thấy trong /media có thư mục sf_Share, tuy nhiên nếu bạn dùng lệnh ls /media/sf_Share thì bị báo lỗi permission. bạn phải chạy 2 lệnh sau: sudo usermod -aG vboxsf group_cua_username_hien_tai sudo usermod -aG vboxsf www-data

  3. Thực hiện các lệnh sau để install drupal lên server:

wget  http://ftp.drupal.org/files/projects/drupal-7.22.tar.gz
tar xfvz drupal-7.22.tar.gz
sudo mv drupal-7.22/ /var/www/
cd /var/www/drupal-7.22
cp sites/default/default.settings.php sites/default/settings.php
chmod a+w sites/default/settings.php
chmod a+w sites/default
mysql -u root -p
CREATE DATABASE drupal;
CREATE USER druser@localhost;
SET PASSWORD FOR druser@localhost= PASSWORD("drupass");
GRANT ALL PRIVILEGES ON drupal.* TO druser@localhost IDENTIFIED BY 'drupass';
FLUSH PRIVILEGES;
exit

sudo apt-get install php5-gd
  1. Đổi tên server thay vì ở host ta phải đánh địa chỉ 192.168.56.102 dài, ta có thể thay đổi tên thành server.com ngắn gọn hơn. Để làm điều này ở host (và ở guest nếu cần) ta thêm dòng 192.168.56.102 server.com vào /etc/hosts

  2. Cài đặt ở host ta nhập địa chỉ server.com/drupal-7.22 và bắt đầu cài đặt drupal. Chú ý database là drupal, user name mysql là druser, pass mysql là drupass. Khi cài các bạn nhớ user và pass của drupal (admin user của drupal) để đăng nhập lần sau :)

  3. SSH các bạn vào đây đọc, rất hay, quá đầy đủ cho một newbie (http://support.suso.com/supki/SSH_Tutorial_for_Linux) có 2 lệnh chủ yếu là: ssh-keygen -t dsa và scp ~/.ssh/id_dsa.pub username@arvo.suso.org:.ssh/authorized_keys ssh-copy-id user@host

· One min read
Tien

Solution: In the view, add the field for content:path. Display it or don't display it. Rearrange the fields so that path field is above the trimmed content. Go back to the trimmed field. Replacement patterns now has a path. Use it as the (duh) path.

Original post

· One min read
Tien
if (!field_info_field('field_chatroom')) {
$field = array( 'field_name' => 'field_chatroom', 'type' => 'chatroom', );
field_create_field($field);

// Create the instance on the bundle.
$instance = array( 'field_name' => 'field_chatroom', 'entity_type' => 'node', 'label' => 'ChatRoom', 'bundle' => 'project', 'required' => TRUE, 'widget' => array( 'type' => 'chatroom_chatroom', ), );


field_create_instance($instance);
}

· One min read
Tien

Đây là api của hook_field_update. Hàm này nhận 6 tham số, trong đó có 2 tham số khó hiểu là $field và $instance. Thực ra $field và $instance là kết quả trả về của hàm field_info_field và field_info_instance.

$field = field\_info\_field();

$instance = field\_info\_instance();

Đây là cấu trúc chi tiết của $field và $instance.

· One min read
Tien
/**
* @Assert\\NotBlank()
*/

/**
* @Assert\\Choice(
*     choices = { "male", "female" },
*     message = "Choose a valid gender."
* )
*/

/**
* @Assert\\Choice({"male", "female"})
*/

/**
* @Assert\\NotBlank()
* @Assert\\Length(min = "3")
*/

/**
* @Assert\\True(message = "The password cannot match your first name")
*/
public function isPasswordLegal() { // return true or false }

/**
* @Assert\\Email(groups={"registration"})
*/
private $email;

/**
* @Assert\\NotBlank(groups={"registration"})
* @Assert\\Length(min=7, groups={"registration"})
*/
private $password;

/**
* @Assert\\Length(min = "2")
*/
private $city;

· One min read
Tien
    • Copy doctrine-fixtures, doctrine-fixtures-bundle, doctrine-migrations, doctrine-migrations-bundle to folder ./vender/doctrine/
    • Copy knp-menu, knp-menu-bundle to folder ./vender/knp/
  1. Registry bundle in AppKernel

$bundles = array( new Knp\\Bundle\\MenuBundle\\KnpMenuBundle(), );

if (in_array($this->getEnvironment(), array('dev', 'test'))) {
$bundles[] = new Doctrine\\Bundle\\FixturesBundle\\DoctrineFixturesBundle();
$bundles[] = new Doctrine\\Bundle\\MigrationsBundle\\DoctrineMigrationsBundle();
}
return $bundles;
  1. Update namespace (file ./vender/composer/autoload_namespaces.php)
'Doctrine\\\\DBAL' => $vendorDir . '/doctrine/dbal/lib/', add =>    'Doctrine\\\\Common\\\\DataFixtures'    => $vendorDir . '/doctrine/doctrine-fixtures/lib', add =>    'Doctrine\\\\DBAL\\\\Migrations'    => $vendorDir . '/doctrine/doctrine-migrations/lib', 'Doctrine\\\\Common' => $vendorDir . '/doctrine/common/lib/', add =>    'Doctrine\\\\Bundle\\\\FixturesBundle' => $vendorDir . '/doctrine/doctrine-fixtures-bundle/', add =>   'Doctrine\\\\Bundle\\\\MigrationsBundle' => $vendorDir . '/doctrine/doctrine-migrations-bundle/', 'Doctrine\\\\Bundle\\\\DoctrineBundle' => $vendorDir . '/doctrine/doctrine-bundle/', ... add =>   'Knp\\Menu'   => $vendorDir . '/knp/knp-menu/src', add =>   'Knp\\\\Bundle\\\\MenuBundle' => $vendorDir . '/knp/knp-menu-bundle/', '' => $baseDir . '/src/',
  1. Use
php app/console doctrine:fixtures:load
php app/console doctrine:migrations:diff
php app/console doctrine:migrations:migrate
  1. Config menu (options) file /app/config.yml
knp_menu: twig:
# use "twig: false" to disable the Twig extension and the TwigRenderer template: knp_menu.html.twig templating: false
# if true, enables the helper for PHP templates default_renderer: twig
# The renderer to use, list is also available by default_renderer
  1. link download bundles https://drive.google.com/folderview?id=0B44zRG-ekXoMRVpVNXFDSVh1WUU&usp=sharing

· One min read
Tien
  1. Một số expression:
$date = new DateTime('now');

// This week:
$date = new DateTime('last Monday');
$date = new DateTime('next Sunday');

// This time tomorrow:
$date = new DateTime('now +1 day');

// (This time) first day of This month:
$date = new DateTime('first day of this month');

// (This time) last day of This month:
$date = new DateTime('last day of this month');

// In this month:
$firstDayThisMonth = new DateTime('first day of this month');
$firstDayThisMonth->setTime(0, 0, 0);
$firstDayNextMonth = new DateTime('first day of next month');
$firstDayNextMonth->setTime(0, 0, 0);

$firstDayThisMonth->format('Y-m-d H:i:s');
$firstDayNextMonth->format('Y-m-d H:i:s');

// First day of this month, no time:
date('Y-m-01', time());

// Last day of this month, no time:
date('Y-m-t', time());

$first_minute = mktime(0, 0, 0, date("n"), 1);
$last_minute = mktime(23, 59, 0, date("n"), date("t"));
  1. Modifier
$time = strtotime('modify', $timestamp);
// e.g.
$time = strtotime('+2 days', 12345567);
$time = strtotime("-1 week");
  1. Time Zone php.ini:
timezone="Asia/SaiGon"

or

$date = new \\DateTime("", new \\DateTimeZone("Asia/Saigon")) ;
  1. Format $date_time = $date->format('Y-m-d H:i:sP');

  2. Notes // Never use math like 60*60*24*7 to add/subtract days (because of daylight time saving)

· One min read
Tien
{% set value = value|default('now +1 day'|datetimelocal()) %}