views notwithstanding

22
Views Notwithstanding A Programmer’s guide to working with MySQL Tables in Drupal using PHP and SQL -- Srikanth Bangalore. [email protected] Drupal ID: bangalos

Upload: srikanth-bangalore

Post on 20-Aug-2015

487 views

Category:

Technology


1 download

TRANSCRIPT

Views Notwithstanding

A Programmer’s guide to working with MySQL Tables in Drupal using PHP and SQL

-- Srikanth [email protected]

Drupal ID: bangalos

Drupal APIs (in PHP) for:

• Creating a table• During installation of your custom module• Post installation of your custom module

• Inserting into table• Querying the table and iterating over rows• Creating a “Block”• Creating an Admin “menu” (form)• Creating a form

Creating a Table (during installation of custom module)

• hotornot.info• name = Hot Or Not• description = Builds A Hot Or Not Block, And Lets

Users Rate Images In A Folder.• package = Hot Or Not• core = 6.x

• hotornot.module (to be populated later)• hotornot.install (see next slide)

Hotornot.install• <?php• function hotornot_install() {• switch ($GLOBALS['db_type']) {• case 'mysql':• case 'mysqli':• // the {tablename} syntax is so multisite installs can add a prefix to the table name as set

in the settings.php file• db_query("CREATE TABLE {hotornot_filelist} (• file_id int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,• file_path varchar(256) NOT NULL DEFAULT './.',• present_or_not smallint unsigned NOT NULL DEFAULT 1,• title varchar(256),• description text• ) /*!40100 DEFAULT CHARACTER SET utf8 */;");• break;• }• }

Adding Another Table later• function hotornot_update_1() {• switch ($GLOBALS['db_type']) {• case 'mysql':• case 'mysqli':• db_query ("CREATE TABLE {hotornot_userchoice} (• file_id int unsigned NOT NULL DEFAULT 0,• uid int unsigned NOT NULL DEFAULT 0,• hot_or_not smallint unsigned NOT NULL DEFAULT 0,• PRIMARY KEY (file_id, uid)• ) /*!40100 DEFAULT CHARACTER SET utf8 */;");• break;• }• }

Things To Remember …

• db_query function accepts an SQL statement as input, and executes it.

• function hotornot_repopulate() {• $path_to_files = realpath('.') . variable_get('hotornot_folder', '/sites/default/files/hotornot');• $output = "";• $isql = "UPDATE {hotornot_filelist} SET present_or_not = 0 WHERE file_id>0";• $iresult = db_query($isql);• if ($handle = opendir($path_to_files)) {• while (false !== ($file = readdir($handle))) {• if ($file != "." && $file != "..") {• $output .= "$file\n";• $query = "SELECT COUNT(*) FROM {hotornot_filelist} WHERE file_path = '$file'";• $num = db_result(db_query($query));• if($num) {• $isql = "UPDATE {hotornot_filelist} SET present_or_not=1 WHERE file_path = '$file'";• $iresult = db_query($isql, $file);• } else {• $isql = "INSERT INTO {hotornot_filelist} (file_path, present_or_not) VALUES ('%s', 1)";• $iresult = db_query($isql, $file);• }• }• }• closedir($handle);• }• drupal_set_message($output);• }

Things To Remember …

• db_query function accepts an SQL statement as input, and executes it.

• db_result(db_query($sql)) extracts the SINGLE value of the db_query result.

• variable_get function is used to get the value of a programmer-defined variable. (see later).

hotornot.module – part 1: adding the admin menu (a)

• <?php• function hotornot_menu() {• $items = array();• $items['admin/settings/hotornot'] = array(• 'title' => t('Hot Or Not'),• 'description' => t('Select The Hot Or Not Image Folder'),• 'page callback' => 'drupal_get_form',• 'page arguments' => array('hotornot_admin_settings'),• 'access arguments' => array('administer site configuration'),• );• return $items;• }

• ….(see next slide)

hotornot.module – part 1: adding the admin menu (b)

• function hotornot_admin_settings() {• $form = array();

• $form['hotornot_folder'] = array(• '#type' => 'textfield',• '#title' => t('The folder where all the images for the Hot Or Not are Stored'),• '#default_value' => variable_get('hotornot_folder', 'sites/default/files/hotornot'),• );• $form['hotornot_repopulate'] = array(• '#type' => 'submit',• '#value' => 'Repopulate',• );• $form['#submit'][] = 'hotornot_admin_settings_submit_handler';• return system_settings_form($form);• }• function hotornot_admin_settings_submit_handler(&$form, &$form_state) {• if ($form_state['clicked_button']['#id'] == 'edit-hotornot-repopulate') {• hotornot_repopulate();• }• }

Things to remember …

• Use drupal forms api to build the forms, even the Admin forms.

• 3 steps to having your own module’s admin settings form:– Define path + form_builder_function in

hook_menu();– Build your form using the forms API. Remember to

wrap your form with “system_settings_form”– Do your “stuff” in the submit handler.

hotornot.module – part 2adding the block (a)

• function hotornot_block($op = 'list', $delta = 0, $edit = array()) {• switch ($op) {• case 'list':• $blocks[0]['info'] = t('Rate this!');• return $blocks;• case 'view':• if ($delta == 0 ) { • $block[0]['subject'] = t("Do you like ...");• $block[0]['content'] = drupal_get_form('hotornot_hotornotform');• }• return $block[$delta];• }• }

hotornot.module – part 2adding the block (b)

• function hotornot_hotornotform(&$form_state) {• $form = array(); global $user;

• $sql = "SELECT filelist.file_path AS filename, filelist.file_id AS file_id, filelist.title AS file_title FROM {hotornot_filelist} as filelist WHERE filelist.present_or_not > 0 AND (filelist.file_id not in (SELECT file_id FROM {hotornot_userchoice} WHERE uid=%d)) ORDER BY RAND() LIMIT 1";

• $result = db_query($sql, $user->uid);• • $atleastoneexists = FALSE;• while ($row = db_fetch_array($result)) {• $atleastoneexists = TRUE;• $form['my_fileid'] = array(• '#type' => 'hidden',• '#value' => $row['file_id']• );

hotornot.module – part 2adding the block (c)

• $form['picture'] = array(• '#type' => 'markup',• '#value' => '<img width="100%" src="' . base_path() . variable_get('hotornot_folder', '/sites/default/files/hotornot') . '/' .

$row['filename'] . '"/><br/><strong>...'. $row['file_title'] . ' ?</strong><br/>',• );• break;• }• if ($atleastoneexists) {• $form['ishot'] = array(• '#type' => 'submit',• '#value' => t('Yes')• );• $form['isnot'] = array(• '#type' => 'submit',• '#value' => t('No')• );• } else {• $form['picture'] = array(• '#type' => 'markup',• '#value' => '<p>Currently, you have seen all the items. Thank you.</p>', • );• }• return $form;• }

hotornot.module – part 2adding the block (d)

• function hotornot_hotornotform_submit(&$form, &$form_state) {• global $user;• if ($form_state['clicked_button']['#id'] == 'edit-ishot') {• $ishot = 1;• } else {• $ishot = 0;• }• $fileid = $form_state['clicked_button']['#post']['my_fileid'];• $isql = "REPLACE INTO {hotornot_userchoice} (file_id, uid,

hot_or_not) VALUES (%d, %d, %d)";• $iresult = db_query($isql, $fileid, $user->uid, $ishot);• }

Things To Remember …

• db_query function accepts an SQL statement as input, and executes it.

• db_result(db_query($sql)) extracts the SINGLE value of the db_query result.

• To get the rows of the query result in an iterator.• $result = db_query($sql); • while ($row = db_fetch_array($result)) {• $val = $row[‘column_name’]• }

hotornot.module – part 3adding a page to enter title/desc (a)

• function hotornot_menu() {• $items = array();• // ...code...• $items['hotornot/administer'] = array(• 'title' => t('Hot Or Not Administration'),• 'description' => t('Add Or Edit Title And Descriptions to Hot Or Not Items'),• 'page callback' => 'local_hotornot_administer_description_form',• 'access arguments' => array('access content'),• 'type' => MENU_CALLBACK,• );• // ...code...• return $items;• }• function local_hotornot_administer_description_form() {• return drupal_get_form('hotornot_administer_description_form');• }

hotornot.module – part 3adding a page to enter title/desc (b)

• function hotornot_administer_description_form(&$form_state) {• $form = array();• global $user;

• $form['blurb'] = array (• '#type' => 'markup',• '#value' => '<p>You will be shown one picture at a time that does not have any title or

description. You just have to enter a title and description and hit submit.</p>' ,• );

• $sql = "SELECT filelist.file_path AS filename, filelist.file_id AS file_id, filelist.title AS title FROM {hotornot_filelist} as filelist WHERE filelist.present_or_not > 0 AND filelist.title is NULL LIMIT 1";

• $result = db_query($sql);• $atleastoneexists = FALSE;• while ($row = db_fetch_array($result)) {

hotornot.module – part 3adding a page to enter title/desc (c)

• $atleastoneexists = TRUE;• $form['fileid'] = array(• '#type' => 'hidden',• '#value' => $row['file_id']• );• $form['picture'] = array(• '#type' => 'markup',• '#value' => '<img src="' . base_path() . variable_get('hotornot_folder', '/sites/default/files/hotornot') . '/' .

$row['filename'] . '"/>',• );• $form['title'] = array(• '#type' => 'textfield',• '#title' => 'Title',• '#default_value' => $row['title'],• );• }• if ($atleastoneexists) {• $form['submit'] = array(• '#type' => 'submit',• '#value' => 'Submit',• );

hotornot.module – part 3adding a page to enter title/desc (d)

• } else {• $form['picture'] = array(• '#type' => 'markup',• '#value' => '<p>Currently, you have seen all the items. Thank you.</p>',• );• }• return $form;• }

• function hotornot_administer_description_form_submit(&$form, &$form_state) {• $fileid = $form_state['values']['fileid'];• $title = $form_state['values']['title'];• $isql = "UPDATE {hotornot_filelist} SET title='%s' WHERE file_id=%d";• $iresult = db_query($isql, $title, $fileid);• }

Summary

• We learnt how to create a new table at the time of installing our module

• How to use db_query, db_result, db_fetch_array

• How to create user blocks and user pages• How to create Admin menus and define new

variables• How to use Forms API

Drupal 7 changes

• Switch(db_type) does not work!• Db_result() is replaced with ->fetchField();• Db_query (“adb=%d,%s”, $a, $b) is replaced with

• Db_query(“abd=:a,:b”, array(‘:a’=>$a, ‘:b’=>$b));