| @@ -1851,8 +1851,126 @@ | ||
| 1851 | 1851 | return apply_filters( 'frm_advanced_helpers', $advanced_helpers, $atts ); |
| 1852 | 1852 | } |
| 1853 | 1853 | |
| 1854 | 1854 | /** |
| 1855 | + * Adds a shortcode for each part of a multi-part field to the field shortcode list, | |
| 1856 | + * so a single part can be used on its own, like [25 show=first] for a Name field. | |
| 1857 | + * | |
| 1858 | + * @since 6.35 | |
| 1859 | + * | |
| 1860 | + * @param array $atts Includes 'field'. | |
| 1861 | + * | |
| 1862 | + * @return void | |
| 1863 | + */ | |
| 1864 | + public static function field_part_shortcodes( $atts ) { | |
| 1865 | + $field = $atts['field']; | |
| 1866 | + | |
| 1867 | + foreach ( self::get_field_parts( $field ) as $part => $label ) { | |
| 1868 | + FrmFormsHelper::insert_opt_html( | |
| 1869 | + array( | |
| 1870 | + 'id' => $field->id . ' show=' . $part, | |
| 1871 | + 'key' => $field->field_key . ' show=' . $part, | |
| 1872 | + // Keep the part label and the option out of the truncated text so they stay readable. | |
| 1873 | + 'key_label' => $field->field_key, | |
| 1874 | + 'key_suffix' => ' show=' . $part, | |
| 1875 | + 'name' => $field->name, | |
| 1876 | + 'name_suffix' => ' (' . $label . ')', | |
| 1877 | + 'type' => $field->type, | |
| 1878 | + 'class' => 'frm-customize-list dropdown-item', | |
| 1879 | + ) | |
| 1880 | + ); | |
| 1881 | + unset( $part, $label ); | |
| 1882 | + } | |
| 1883 | + } | |
| 1884 | + | |
| 1885 | + /** | |
| 1886 | + * Gets the parts of a multi-part field that can be shown on their own with a show= shortcode option. | |
| 1887 | + * | |
| 1888 | + * @since 6.35 | |
| 1889 | + * | |
| 1890 | + * @param stdClass $field | |
| 1891 | + * | |
| 1892 | + * @return array Part labels keyed by the show= option value. | |
| 1893 | + */ | |
| 1894 | + private static function get_field_parts( $field ) { | |
| 1895 | + $parts = array(); | |
| 1896 | + | |
| 1897 | + if ( 'name' === $field->type ) { | |
| 1898 | + $parts = self::get_name_field_parts( $field ); | |
| 1899 | + } elseif ( 'address' === $field->type ) { | |
| 1900 | + $parts = self::get_address_field_parts( $field ); | |
| 1901 | + } | |
| 1902 | + | |
| 1903 | + /** | |
| 1904 | + * Allows add-ons to add the parts of their own multi-part fields. | |
| 1905 | + * | |
| 1906 | + * @since 6.35 | |
| 1907 | + * | |
| 1908 | + * @param array $parts Part labels keyed by the show= option value. | |
| 1909 | + * @param stdClass $field The field the parts belong to. | |
| 1910 | + */ | |
| 1911 | + return apply_filters( 'frm_field_parts_for_shortcodes', $parts, $field ); | |
| 1912 | + } | |
| 1913 | + | |
| 1914 | + /** | |
| 1915 | + * Gets the parts of a Name field that are in use. Only the parts included in the | |
| 1916 | + * selected name layout hold a value, so the rest would always show as blank. | |
| 1917 | + * | |
| 1918 | + * @since 6.35 | |
| 1919 | + * | |
| 1920 | + * @param stdClass $field | |
| 1921 | + * | |
| 1922 | + * @return array Part labels keyed by the show= option value, in layout order. | |
| 1923 | + */ | |
| 1924 | + private static function get_name_field_parts( $field ) { | |
| 1925 | + $labels = array( | |
| 1926 | + 'first' => __( 'First', 'formidable' ), | |
| 1927 | + 'middle' => __( 'Middle', 'formidable' ), | |
| 1928 | + 'last' => __( 'Last', 'formidable' ), | |
| 1929 | + ); | |
| 1930 | + $layout = FrmField::get_option( $field, 'name_layout' ); | |
| 1931 | + | |
| 1932 | + if ( ! $layout ) { | |
| 1933 | + $layout = 'first_last'; | |
| 1934 | + } | |
| 1935 | + | |
| 1936 | + // The layout option names the parts in use, in display order, like first_middle_last. | |
| 1937 | + $parts = array(); | |
| 1938 | + | |
| 1939 | + foreach ( explode( '_', $layout ) as $part ) { | |
| 1940 | + if ( isset( $labels[ $part ] ) ) { | |
| 1941 | + $parts[ $part ] = $labels[ $part ]; | |
| 1942 | + } | |
| 1943 | + unset( $part ); | |
| 1944 | + } | |
| 1945 | + | |
| 1946 | + return $parts; | |
| 1947 | + } | |
| 1948 | + | |
| 1949 | + /** | |
| 1950 | + * Gets the parts of an Address field that are in use. The address type decides which | |
| 1951 | + * parts are on the form, so the rest would always show as blank. | |
| 1952 | + * | |
| 1953 | + * @since 6.35 | |
| 1954 | + * | |
| 1955 | + * @param stdClass $field | |
| 1956 | + * | |
| 1957 | + * @return array Part labels keyed by the show= option value. | |
| 1958 | + */ | |
| 1959 | + private static function get_address_field_parts( $field ) { | |
| 1960 | + $parts = FrmFieldAddress::get_part_labels(); | |
| 1961 | + $address_type = FrmField::get_option( $field, 'address_type' ); | |
| 1962 | + | |
| 1963 | + if ( in_array( $address_type, array( 'us', 'generic' ), true ) ) { | |
| 1964 | + unset( $parts['country'] ); | |
| 1965 | + } elseif ( 'europe' === $address_type ) { | |
| 1966 | + unset( $parts['state'] ); | |
| 1967 | + } | |
| 1968 | + | |
| 1969 | + return $parts; | |
| 1970 | + } | |
| 1971 | + | |
| 1972 | + /** | |
| 1855 | 1973 | * Get an array of the options to display in the advanced tab |
| 1856 | 1974 | * of the customization panel |
| 1857 | 1975 | * |
| 1858 | 1976 | * @since 2.0.6 |