Skip to content

Commit 4b85668

Browse files
committed
init repository
0 parents  commit 4b85668

26 files changed

+4858
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
build/*
2+
node_modules/*

Gruntfile.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
module.exports = function(grunt) {
2+
3+
// Project configuration.
4+
grunt.initConfig({
5+
pkg: grunt.file.readJSON('package.json'),
6+
copy: {
7+
main: {
8+
files: [
9+
{expand: true, src: ['assets/**'], dest: 'build/'},
10+
{expand: true, src: ['views/**'], dest: 'build/'},
11+
{expand: true, src: ['walkers/**'], dest: 'build/'},
12+
{expand: false, src: ['readme.txt'], dest: 'build/readme.txt'},
13+
{expand: false, src: ['screenshot-1.png'], dest: 'build/screenshot-1.png'},
14+
{expand: false, src: ['screenshot-2.png'], dest: 'build/screenshot-2.png'},
15+
{expand: false, src: ['screenshot-3.png'], dest: 'build/screenshot-3.png'},
16+
{expand: false, src: ['screenshot-4.png'], dest: 'build/screenshot-4.png'},
17+
{expand: false, src: ['submenu.php'], dest: 'build/submenu.php'},
18+
{expand: false, src: ['SubmenuAdmin.php'], dest: 'build/SubmenuAdmin.php'},
19+
{expand: false, src: ['SubmenuModel.php'], dest: 'build/SubmenuModel.php'}
20+
]
21+
}
22+
},
23+
clean: ["build"],
24+
uglify: {
25+
my_target: {
26+
files: {
27+
'build/assets/js/ajax.js': ['assets/js/ajax.js'],
28+
'build/assets/js/main.js': ['assets/js/main.js']
29+
}
30+
}
31+
},
32+
cssmin: {
33+
my_target: {
34+
files: {
35+
'build/assets/css/admin.css': ['assets/css/admin.css']
36+
}
37+
}
38+
}
39+
});
40+
41+
// grunt modules
42+
grunt.loadNpmTasks('grunt-contrib-copy');
43+
grunt.loadNpmTasks('grunt-contrib-clean');
44+
grunt.loadNpmTasks('grunt-contrib-uglify');
45+
grunt.loadNpmTasks('grunt-contrib-cssmin');
46+
47+
// Default task(s).
48+
grunt.registerTask('default', ['clean', 'copy', 'uglify', 'cssmin']);
49+
50+
};

SubmenuAdmin.php

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
<?php
2+
/**
3+
* Administration Menu Class
4+
*
5+
* Add custom options to nav-menu.php
6+
*
7+
* @author James Collings <[email protected]>
8+
* @version 0.0.1
9+
*/
10+
class SubmenuAdmin{
11+
12+
/**
13+
* Plugin config
14+
* @var stdClass
15+
*/
16+
private $config = null;
17+
18+
/**
19+
* Setup class
20+
* @param stdClass $config
21+
* @return void
22+
*/
23+
public function __construct(&$config){
24+
$this->config = $config;
25+
26+
// include js/css
27+
add_action( 'admin_enqueue_scripts', array($this, 'load_scripts'));
28+
29+
// on menu save
30+
add_action( 'wp_update_nav_menu_item', array($this, 'save_nav_menu'), 10, 3);
31+
32+
add_action( 'admin_notices', array( $this , 'display_admin_notification' ) );
33+
add_action( 'admin_init', array( $this, 'hide_admin_notification' ) );
34+
35+
// register admin settings
36+
add_action( 'admin_init', array($this, 'register_settings' ));
37+
38+
// add settings page
39+
add_action( 'admin_menu', array($this, 'settings_menu' ));
40+
41+
// load settings
42+
$options = get_option( 'jcs-general_settings' );
43+
$this->config->edit_walker = isset($options['enable_walker']) && $options['enable_walker'] == 1 ? 1 : 0;
44+
45+
if($this->config->edit_walker == 1){
46+
add_filter( 'wp_edit_nav_menu_walker', array($this, 'set_edit_walker'));
47+
}else{
48+
add_action( 'wp_ajax_jcs_get_menu_item', array( $this, 'ajax_get_menu_item' ) );
49+
}
50+
}
51+
52+
/**
53+
* Attach plugin assets
54+
* @return void
55+
*/
56+
public function load_scripts(){
57+
58+
// attach files
59+
wp_enqueue_script('jc-submenu-scripts', $this->config->plugin_url .'/assets/js/main.js', array('jquery'), $this->config->version, true);
60+
wp_enqueue_style('jc-submenu-admin-css', $this->config->plugin_url .'/assets/css/admin.css', array(), $this->config->version);
61+
62+
// ajax files
63+
if($this->config->edit_walker == 0){
64+
wp_enqueue_script( 'jc-submenu-ajax', $this->config->plugin_url .'/assets/js/ajax.js', array('jquery'), $this->config->version );
65+
wp_localize_script( 'jc-submenu-ajax', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'we_value' => 1234 ) );
66+
}
67+
}
68+
69+
public function settings_menu(){
70+
// add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function );
71+
add_submenu_page( 'options-general.php', 'JC Submenu', 'JC Submenu', 'manage_options', 'jc-submenu', array($this, 'admin_settings_view') );
72+
}
73+
74+
public function admin_settings_view(){
75+
include $this->config->plugin_dir . 'views/settings.php';
76+
}
77+
78+
/**
79+
* Save custom menu item options
80+
* @param int $menu_id
81+
* @param int $menu_item_db_id
82+
* @param array $args
83+
* @return void
84+
*/
85+
public function save_nav_menu($menu_id, $menu_item_db_id, $args){
86+
87+
if(!isset($_POST['menu-item-title']) || empty($_POST['menu-item-title']))
88+
return false;
89+
90+
foreach($_POST['menu-item-title'] as $menu_item_id => $menu_item_title){
91+
92+
if(isset($_POST[$this->config->prefix.'-admin']) && array_key_exists($menu_item_id, $_POST[$this->config->prefix.'-admin'])){
93+
SubmenuModel::save_meta($menu_item_id, 'admin', 1);
94+
}elseif(isset($_POST[$this->config->prefix.'-active']) && array_key_exists($menu_item_id, $_POST[$this->config->prefix.'-active'])){
95+
SubmenuModel::save_meta($menu_item_id, 'admin', 0);
96+
}
97+
98+
if(isset($_POST[$this->config->prefix.'-autopop']) && array_key_exists($menu_item_id, $_POST[$this->config->prefix.'-autopop'])){
99+
// save post meta for active items
100+
SubmenuModel::save_menu_item($menu_item_id);
101+
102+
}elseif(isset($_POST[$this->config->prefix.'-active']) && array_key_exists($menu_item_id, $_POST[$this->config->prefix.'-active'])){
103+
// clear post meta for inactive items
104+
SubmenuModel::clear_menu_item($menu_item_id);
105+
}
106+
}
107+
}
108+
109+
/**
110+
* Output Usage Notification
111+
* @return void
112+
*/
113+
public function display_admin_notification(){
114+
115+
global $current_user;
116+
global $pagenow;
117+
118+
$user_id = $current_user->ID;
119+
$response = get_user_meta($user_id, 'jcs-show_notification', true);
120+
121+
if ( current_user_can( 'manage_options' ) && (!$response || $response < $this->config->version_check) && $pagenow == 'nav-menus.php'): ?>
122+
123+
<div class="updated">
124+
<p>Need help with using JC Submenu? view the <a href="http://jamescollings.co.uk/wordpress-plugins/jc-submenu/" target="_blank">documentation here</a> | <a href="?jc_hide_notice=1">Hide this notice</a></p>
125+
</div>
126+
127+
<?php
128+
endif;
129+
}
130+
131+
/**
132+
* Mark notification as viewed
133+
* @return void
134+
*/
135+
public function hide_admin_notification(){
136+
137+
global $current_user;
138+
$user_id = $current_user->ID;
139+
140+
if(isset($_GET['jc_hide_notice']) && $_GET['jc_hide_notice'] == 1){
141+
142+
delete_user_meta($user_id, 'jcs-show_notification');
143+
add_user_meta( $user_id, 'jcs-show_notification', $this->config->version_check, true);
144+
}
145+
146+
}
147+
148+
/**
149+
* Change nav-menu.php walker
150+
* @return string
151+
*/
152+
public function set_edit_walker(){
153+
return 'JC_Submenu_Admin_Walker';
154+
}
155+
156+
/**
157+
* Load menu admin edit view
158+
* @return void
159+
*/
160+
public function ajax_get_menu_item(){
161+
$item_id = intval($_POST['id']);
162+
include $this->config->plugin_dir . 'views/edit.php';
163+
die();
164+
}
165+
166+
public function register_settings(){
167+
168+
// Settings
169+
register_setting('jcs_settings', 'jcs'. '-general_settings', array($this, 'save_settings'));
170+
171+
add_settings_section('settings', 'General Settings', array($this, 'section_settings'), 'tab_settings');
172+
173+
add_settings_field('enable_walker', 'Enable Admin Walker', array($this, 'field_callback'), 'tab_settings', 'settings', array(
174+
'type' => 'checkbox',
175+
'field_id' => 'enable_walker',
176+
'section_id' => 'settings',
177+
'setting_id' => 'jcs'. '-general_settings'
178+
));
179+
180+
}
181+
182+
/**
183+
* Settings Section Text
184+
*
185+
* @return void
186+
*/
187+
public function section_settings($section)
188+
{
189+
switch($section['id']){
190+
case 'settings':
191+
echo 'Enable Admin Walker, only do this if you are having problems with editing your menus.';
192+
break;
193+
}
194+
195+
}
196+
197+
/**
198+
* Create Settings Fields
199+
*
200+
* @param array $args
201+
* @return void
202+
*/
203+
public function field_callback($args){
204+
$multiple = false;
205+
extract($args);
206+
$options = get_option($setting_id);
207+
switch($args['type'])
208+
{
209+
case 'checkbox':{
210+
$checked = isset($options[$field_id]) && $options[$field_id] == 1 ? 'checked="checked"' : '';
211+
?>
212+
<input type="checkbox" class="checkbox" id="<?php echo $setting_id; ?>" name="<?php echo $setting_id; ?>[<?php echo $field_id; ?>]" value="1" <?php echo $checked; ?> />
213+
<?php
214+
break;
215+
}
216+
}
217+
}
218+
219+
/**
220+
* Save Settings
221+
*
222+
* @param array $args
223+
* @return array
224+
*/
225+
public function save_settings($args){
226+
227+
return $args;
228+
}
229+
230+
}

0 commit comments

Comments
 (0)